Polygon shape.
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. | |
Public Member Functions inherited from type_shape::t_shape | |
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 | |
type(t_polygon) | polygon |
Polygon. | |
logical | odd_even_rule = .true. |
Rule to determine if a point is inside the polygon If set to .true., a point is inside the polygon if the winding number is odd. Otherwise, a point lies inside the polygon if the winding number is nonzero. | |
double precision, dimension(3, 2) | bounding_box |
Aligned-axis bounding box. | |
Public Attributes inherited from type_shape::t_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. | |
procedure mod_shape_polygon::t_shape_polygon::copy | ( | class(t_shape_polygon), intent(in) | shape, |
class(t_shape), allocatable | copy ) |
[in] | shape | polygon shape |
[out] | copy | copied polygon shape |
procedure mod_shape_polygon::t_shape_polygon::get_distance | ( | class(t_shape_polygon), intent(in) | shape, |
double precision, dimension(3), intent(in) | point, | ||
double precision, intent(out) | distance, | ||
double precision, dimension(3), intent(out) | direction ) |
If the point lies inside the polygon, the distance is negative and the direction points to the closest point on the polygon. If the point lies outiside the polygon, the distance is positive and the direction points in the opposite direction to the closest point on the polygon.
[in] | shape | polygon shape |
[in] | point | any point |
[out] | distance | signed closest distance from the point to the polygon |
[out] | direction | signed direction from the point to the closest point on the polygon |
procedure mod_shape_polygon::t_shape_polygon::get_samples_inside | ( | class(t_shape_polygon), 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 ) |
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 | polygon shape |
[in] | i,j,k | coordinates of the cell |
[in] | n | value to put where the sample is inside the polygon |
[in] | n_samples | sampling level (see description) |
[in,out] | samples | array of the (2*n_sammples+1)^d samples |
procedure mod_shape_polygon::t_shape_polygon::initialize | ( | class(t_shape_polygon), intent(inout) | shape | ) |
[in,out] | shape | polygon shape |
procedure mod_shape_polygon::t_shape_polygon::is_inside | ( | class(t_shape_polygon), intent(in) | shape, |
double precision, dimension(3), intent(in) | point ) |
[in] | shape | polygon shape |
[in] | point | any point |
procedure mod_shape_polygon::t_shape_polygon::ray_trace | ( | class(t_shape_polygon), intent(in) | shape, |
type(t_ray), intent(in) | ray, | ||
logical, intent(in) | has_normal, | ||
type(t_intersection_list), intent(inout) | intersection_list ) |
[in] | shape | polygon shape |
[in] | ray | ray to intersect the polygon |
[in] | has_normal | list of intersections between the ray and the polygon |
[in,out] | intersection_list | list of intersections between the ray and the polygon |