This function checks for intersection of a axis aligned box and a parallelepiped.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=rk), | intent(in) | :: | center_a(3) | |||
real(kind=rk), | intent(in) | :: | dim_a(3) | |||
real(kind=rk), | intent(in) | :: | center_b(3) | |||
real(kind=rk), | intent(in) | :: | dim_b(3) |
Halflength of the parallelepiped in each direction. TodoHK: Dim is a bad naming here, halflength would be better. |
||
real(kind=rk), | intent(in) | :: | norm_b(3,3) |
function boxBoxOverlap(center_a, dim_a, center_b, dim_b, norm_b) &
& result(overlap)
real(kind=rk), intent(in) :: center_a(3) !< Center of the axis aligned box
real(kind=rk), intent(in) :: dim_a(3) !< Length of the AAB in each direction
real(kind=rk), intent(in) :: center_b(3) !< Center of the parallelepiped
!> Halflength of the parallelepiped in each direction.
!!@todo HK: Dim is a bad naming here, halflength would be better.
real(kind=rk), intent(in) :: dim_b(3)
real(kind=rk), intent(in) :: norm_b(3,3) !< normal vector of parallelepiped
logical :: overlap
! Local Variables
real(kind=rk) :: vec_ab(3) ! Vector connecting center_a and
! center_b
!HK! real(kind=rk) :: coeffs(3,3) ! Matrix for Coefficients needed
!HK! ! for the algorithm.
!HK!
!HK! real(kind=rk) :: norm_a(3,3) ! edge directions of the axis
! aligned box
! Initialize variable
overlap = .true.
vec_ab = center_b - center_a
!HK! norm_a(:,1) = (/1., 0., 0./)
!HK! norm_a(:,2) = (/0., 1., 0./)
!HK! norm_a(:,3) = (/0., 0., 1./)
! coeffs Matrix is structured as follows:
! --> second dimension
! xx xy xz
! yx yy yz
! zx zy zz
! Case 1:
! Calculation of so far needed Coefficients:
!HK! coeffs(1,1) = dot_product(norm_a(:,1),norm_b(:,1))
!HK! coeffs(1,2) = dot_product(norm_a(:,1),norm_b(:,2))
!HK! coeffs(1,3) = dot_product(norm_a(:,1),norm_b(:,3))
if ( abs(vec_ab(1)) &
& .gt. dim_a(1) + abs(dim_b(1)*norm_b(1,1)) &
& + abs(dim_b(2)*norm_b(1,2)) &
& + abs(dim_b(3)*norm_b(1,3))) then
overlap = .false.
return
end if
! Case 2:
! Calculation of so far needed Coefficients:
!HK! coeffs(2,1) = dot_product(norm_a(:,2),norm_b(:,1))
!HK! coeffs(2,2) = dot_product(norm_a(:,2),norm_b(:,2))
!HK! coeffs(2,3) = dot_product(norm_a(:,2),norm_b(:,3))
if ( abs(vec_ab(2)) &
& .gt. dim_a(2) + abs(dim_b(1)*norm_b(2,1)) &
& + abs(dim_b(2)*norm_b(2,2)) &
& + abs(dim_b(3)*norm_b(2,3))) then
overlap = .false.
return
end if
! Case 3:
! Calculation of so far needed Coefficients:
!HK! coeffs(3,1) = dot_product(norm_a(:,3),norm_b(:,1))
!HK! coeffs(3,2) = dot_product(norm_a(:,3),norm_b(:,2))
!HK! coeffs(3,3) = dot_product(norm_a(:,3),norm_b(:,3))
if ( abs(vec_ab(3)) &
& .gt. dim_a(3) + abs(dim_b(1)*norm_b(3,1)) &
& + abs(dim_b(2)*norm_b(3,2)) &
& + abs(dim_b(3)*norm_b(3,3))) then
overlap = .false.
return
end if
! Case 4:
if ( abs(dot_product(vec_ab, norm_b(:,1))) &
& .gt. dim_b(1) + abs(dim_a(1)*norm_b(1,1)) &
& + abs(dim_a(2)*norm_b(2,1)) &
& + abs(dim_a(3)*norm_b(3,1))) then
overlap = .false.
return
end if
! Case 5:
if ( abs(dot_product(vec_ab, norm_b(:,2))) &
& .gt. dim_b(2) + abs(dim_a(1)*norm_b(1,2)) &
& + abs(dim_a(2)*norm_b(2,2)) &
& + abs(dim_a(3)*norm_b(3,2))) then
overlap = .false.
return
end if
! Case 6:
if ( abs(dot_product(vec_ab, norm_b(:,3))) &
& .gt. dim_b(3) + abs(dim_a(1)*norm_b(1,3)) &
& + abs(dim_a(2)*norm_b(2,3)) &
& + abs(dim_a(3)*norm_b(3,3))) then
overlap = .false.
return
end if
! Case 7:
if ( abs(vec_ab(3))*norm_b(2,1) - vec_ab(2)*norm_b(3,1) &
& .gt. abs(dim_a(2)*norm_b(3,1)) + abs(dim_a(3)*norm_b(2,1)) &
& + abs(dim_b(2)*norm_b(1,3)) + abs(dim_b(3)*norm_b(1,2)) ) then
overlap = .false.
return
end if
! Case 8:
if ( abs(vec_ab(3))*norm_b(2,2) - vec_ab(2)*norm_b(3,2) &
& .gt. abs(dim_a(2)*norm_b(3,2)) + abs(dim_a(3)*norm_b(2,2)) &
& + abs(dim_b(1)*norm_b(1,3)) + abs(dim_b(3)*norm_b(1,1)) ) then
overlap = .false.
return
end if
! Case 9:
if ( abs(vec_ab(3))*norm_b(2,3) - vec_ab(2)*norm_b(3,3) &
& .gt. abs(dim_a(2)*norm_b(3,3)) + abs(dim_a(3)*norm_b(2,3)) &
& + abs(dim_b(1)*norm_b(1,2)) + abs(dim_b(2)*norm_b(1,1)) ) then
overlap = .false.
return
end if
! Case 10:
if ( abs(vec_ab(1))*norm_b(3,1) - vec_ab(3)*norm_b(1,1) &
& .gt. abs(dim_a(1)*norm_b(3,1)) + abs(dim_a(3)*norm_b(1,1)) &
& + abs(dim_b(2)*norm_b(2,3)) + abs(dim_b(3)*norm_b(2,2)) ) then
overlap = .false.
return
end if
! Case 11:
if ( abs(vec_ab(1))*norm_b(3,2) - vec_ab(3)*norm_b(1,2) &
& .gt. abs(dim_a(1)*norm_b(3,2)) + abs(dim_a(3)*norm_b(1,2)) &
& + abs(dim_b(1)*norm_b(2,3)) + abs(dim_b(3)*norm_b(2,1)) ) then
overlap = .false.
return
end if
! Case 12:
if ( abs(vec_ab(1))*norm_b(3,3) - vec_ab(3)*norm_b(1,3) &
& .gt. abs(dim_a(1)*norm_b(3,3)) + abs(dim_a(3)*norm_b(1,3)) &
& + abs(dim_b(1)*norm_b(2,2)) + abs(dim_b(2)*norm_b(2,1)) ) then
overlap = .false.
return
end if
! Case 13:
if ( abs(vec_ab(2))*norm_b(1,1) - vec_ab(1)*norm_b(2,1) &
& .gt. abs(dim_a(1)*norm_b(2,1)) + abs(dim_a(2)*norm_b(1,1)) &
& + abs(dim_b(2)*norm_b(3,3)) + abs(dim_b(3)*norm_b(3,2)) ) then
overlap = .false.
return
end if
! Case 14:
if ( abs(vec_ab(2))*norm_b(1,2) - vec_ab(1)*norm_b(2,2) &
& .gt. abs(dim_a(1)*norm_b(2,2)) + abs(dim_a(2)*norm_b(1,2)) &
& + abs(dim_b(1)*norm_b(3,3)) + abs(dim_b(3)*norm_b(3,1)) ) then
overlap = .false.
return
end if
! Case 15:
if ( abs(vec_ab(2))*norm_b(1,3) - vec_ab(1)*norm_b(2,3) &
& .gt. abs(dim_a(1)*norm_b(2,3)) + abs(dim_a(2)*norm_b(1,3)) &
& + abs(dim_b(1)*norm_b(3,2)) + abs(dim_b(2)*norm_b(3,1)) ) then
overlap = .false.
return
end if
end function boxBoxOverlap