Return ray intersections number.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(aabb_tree_object), | intent(in) | :: | self | AABB tree. |
||
| type(vector_R8P), | intent(in) | :: | ray_origin | Ray origin. |
||
| type(vector_R8P), | intent(in) | :: | ray_direction | Ray direction. |
Intersection number.
pure function ray_intersections_number(self, ray_origin, ray_direction) result(intersections_number)
!< Return ray intersections number.
class(aabb_tree_object), intent(in) :: self !< AABB tree.
type(vector_R8P), intent(in) :: ray_origin !< Ray origin.
type(vector_R8P), intent(in) :: ray_direction !< Ray direction.
integer(I4P) :: intersections_number !< Intersection number.
integer(I4P) :: level !< Counter.
integer(I4P) :: b, bb, bbb !< Counter.
intersections_number = 0
associate(node=>self%node)
do level=0, self%refinement_levels ! loop over refinement levels
b = first_node(level=level) ! first node at finest level
do bb=1, nodes_number_at_level(level=level) ! loop over nodes at level
bbb = b + bb - 1 ! node numeration in tree
if (node(bbb)%do_ray_intersect(ray_origin=ray_origin, ray_direction=ray_direction)) then
intersections_number = intersections_number + &
node(bbb)%ray_intersections_number(ray_origin=ray_origin, ray_direction=ray_direction)
endif
enddo
enddo
endassociate
endfunction ray_intersections_number