@@ -461,26 +461,34 @@ 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+ if ( Vector3D{ origin_, point }.dot ( segment_.direction () )
477+ < 0 )
478+ {
479+ ray_edge_distance *= -1 .;
483480 }
481+ std::lock_guard< std::mutex > lock{ mutex_ };
482+ results_.emplace_back ( polygon_id, ray_edge_distance,
483+ result.second , std::move ( point ) );
484+ }
485+ const auto [distance, __, triangle_point] =
486+ segment_triangle_distance ( segment_, triangle );
487+ if ( distance < GLOBAL_EPSILON )
488+ {
489+ std::lock_guard< std::mutex > lock{ mutex_ };
490+ results_.emplace_back (
491+ polygon_id, distance, result.second , triangle_point );
484492 }
485493 break ;
486494 }
0 commit comments