@@ -461,26 +461,35 @@ namespace geode
461461 std::lock_guard< std::mutex > lock{ mutex_ };
462462 results_.emplace_back ( polygon_id, distance, result.second ,
463463 std::move ( intersection_result ) );
464+ break ;
464465 }
465- else
466+ for ( const auto e2 : LRange{ 3 } )
466467 {
467- for ( const auto e2 : LRange{ 3 } )
468- {
469- auto point = std::get< 1 >( segment_segment_distance (
470- Segment3D{ segment_ },
468+ auto [ray_edge_distance, point, _] =
469+ segment_segment_distance ( Segment3D{ segment_ },
471470 { triangle.vertices ()[e2 ].get (),
472- triangle.vertices ()[( e2 + 1 ) % 3 ].get () } ) );
473- auto distance = point_point_distance ( origin_, point );
474- if ( Vector3D{ origin_, point }.dot (
475- segment_.direction () )
476- < 0 )
477- {
478- distance *= -1 .;
479- }
480- std::lock_guard< std::mutex > lock{ mutex_ };
481- results_.emplace_back ( polygon_id, distance,
482- result.second , std::move ( point ) );
471+ triangle.vertices ()[( e2 + 1 ) % 3 ].get () } );
472+ if ( ray_edge_distance > GLOBAL_EPSILON )
473+ {
474+ continue ;
475+ }
476+ auto distance = point_point_distance ( origin_, point );
477+ if ( Vector3D{ origin_, point }.dot ( segment_.direction () )
478+ < 0 )
479+ {
480+ distance *= -1 .;
483481 }
482+ std::lock_guard< std::mutex > lock{ mutex_ };
483+ results_.emplace_back ( polygon_id, distance, result.second ,
484+ std::move ( point ) );
485+ }
486+ const auto [distance, __, triangle_point] =
487+ segment_triangle_distance ( segment_, triangle );
488+ if ( distance < GLOBAL_EPSILON )
489+ {
490+ std::lock_guard< std::mutex > lock{ mutex_ };
491+ results_.emplace_back (
492+ polygon_id, distance, result.second , triangle_point );
484493 }
485494 break ;
486495 }
0 commit comments