Intersection of two shapes. More...
Public Member Functions | |
procedure | initialize (shape) |
Initialize the shape. | |
procedure | copy (shape, copy) |
Copy the shape. | |
procedure | is_inside (shape, point) |
Check if a point lies inside the shape. | |
procedure | get_samples_inside (shape, i, j, k, n, n_samples, samples) |
Check if a given number of point lies in a shape. | |
procedure | get_distance (shape, point, distance, direction) |
Compute the distance and the direction from a point to the shape. | |
procedure | ray_trace (shape, ray, has_normal, intersection_list) |
Compute the intersection between the shape and a ray. | |
![]() | |
procedure(abs_initialize_shape), deferred | initialize (shape) |
Initialize the shape. | |
procedure(abs_copy_shape), deferred | copy (shape, copy) |
Copy the shape. | |
procedure(abs_shape_is_inside), deferred | is_inside (shape, point) |
Check if a point lies inside the shape. | |
procedure(abs_shape_get_samples_inside), deferred | get_samples_inside (shape, i, j, k, n, n_samples, samples) |
Check if a given number of point lies in a shape. | |
procedure(abs_shape_get_distance), deferred | get_distance (shape, point, distance, direction) |
Compute the distance and the direction from a point to the shape. | |
procedure(abs_shape_ray_trace), deferred | ray_trace (shape, ray, has_normal, intersection_list) |
Compute the intersection between the shape and a ray. | |
Public Attributes | |
class(t_shape), allocatable | shape_1 |
First shape. | |
class(t_shape), allocatable | shape_2 |
Second shape. | |
![]() | |
integer | dimension = 2 |
Dimension of the shape. | |
type(t_cg_transformation) | transformation |
Transformation matrix. | |
logical | is_reversed = .false. |
Swap interior/exterior sides of the shape. | |
Intersection of two shapes.
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::copy | ( | class(t_shape_intersection), intent(in) | shape, |
class(t_shape), allocatable | copy ) |
Copy the shape.
[in] | shape | intersection shape |
[out] | copy | copied intersection |
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::get_distance | ( | class(t_shape_intersection), intent(in) | shape, |
double precision, dimension(3), intent(in) | point, | ||
double precision, intent(out) | distance, | ||
double precision, dimension(3), intent(out) | direction ) |
Compute the distance and the direction from a point to the shape.
If the point lies inside the intersection, the distance is negative and the direction points to the closest point on the intersection. If the point lies outiside the intersection, the distance is positive and the direction points in the opposite direction to the closest point on the intersection.
[in] | shape | intersection shape |
[in] | point | any point |
[out] | distance | signed closest distance from the point to the intersection |
[out] | direction | signed direction from the point to the closest point on the intersection |
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::get_samples_inside | ( | class(t_shape_intersection), intent(inout) | shape, |
integer, intent(in) | i, | ||
integer, intent(in) | j, | ||
integer, intent(in) | k, | ||
integer, intent(in) | n, | ||
integer, intent(in) | n_samples, | ||
integer, dimension(:,:,:), intent(inout) | samples ) |
Check if a given number of point lies in a shape.
Sample a cell of coordinates (i
,j
,k
) with (2*n_samples+1)^d samples, where d denotes the dimension of the cell. Return a integer array samples
containing the value n
where the sample is inside the shape.
n_samples
is called the sampling level and can take its value in range [0,∞].
Example of sampling for various sampling level:
!! n_samples = 0 n_samples = 1 n_samples = 2 !! ┏━━━━━━━┓ ×━━━×━━━× ×━×━×━×━× !! ┃ ┃ ┃ ┃ × × × × × !! ┃ × ┃ × × × × × × × × ... !! ┃ ┃ ┃ ┃ × × × × × !! ┗━━━━━━━┛ ×━━━×━━━× ×━×━×━×━× !!
[in,out] | shape | intersection shape |
[in] | i,j,k | coordinates of the cell |
[in] | n | value to put where the sample is inside the intersection |
[in] | n_samples | sampling level (see description) |
[in,out] | samples | array of the (2*n_sammples+1)^d samples |
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::initialize | ( | class(t_shape_intersection), intent(inout) | shape | ) |
Initialize the shape.
[in,out] | shape | intersection shape |
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::is_inside | ( | class(t_shape_intersection), intent(in) | shape, |
double precision, dimension(3), intent(in) | point ) |
Check if a point lies inside the shape.
[in] | shape | intersection shape |
[in] | point | any point |
procedure mod_shape_constructive_solid_geometry::t_shape_intersection::ray_trace | ( | class(t_shape_intersection), intent(in) | shape, |
type(t_ray), intent(in) | ray, | ||
logical, intent(in) | has_normal, | ||
type(t_intersection_list), intent(inout) | intersection_list ) |
Compute the intersection between the shape and a ray.
[in] | shape | intersection shape |
[in] | ray | ray to intersect the intersection |
[in] | has_normal | list of intersections between the ray and the intersection |
[in,out] | intersection_list | list of intersections between the ray and the intersection |