| 234 | } |
| 235 | |
| 236 | IntersectionResult< Point3D > segment_plane_intersection( |
| 237 | const Segment3D& segment, const Plane& plane ) |
| 238 | { |
| 239 | auto line_plane_result = |
| 240 | line_plane_intersection( InfiniteLine3D{ segment }, plane ); |
| 241 | if( line_plane_result ) |
| 242 | { |
| 243 | if( point_segment_distance( |
| 244 | line_plane_result.result.value(), segment ) |
| 245 | > GLOBAL_EPSILON ) |
| 246 | { |
| 247 | return { INTERSECTION_TYPE::none }; |
| 248 | } |
| 249 | const auto lambdas = safe_segment_barycentric_coordinates( |
| 250 | line_plane_result.result.value(), segment ); |
| 251 | line_plane_result.correctness->first.second = |
| 252 | segment.vertices()[0].get() * lambdas[0] |
| 253 | + segment.vertices()[1].get() * lambdas[1]; |
| 254 | return line_plane_result; |
| 255 | } |
| 256 | return line_plane_result.type; |
| 257 | } |
| 258 | |
| 259 | IntersectionResult< Point3D > segment_triangle_intersection( |
| 260 | const Segment3D& segment, const Triangle3D& triangle ) |