diff --git a/src/geode/geometry/distance.cpp b/src/geode/geometry/distance.cpp index 16afc9dc2..7472971de 100644 --- a/src/geode/geometry/distance.cpp +++ b/src/geode/geometry/distance.cpp @@ -1051,15 +1051,15 @@ namespace geode const Segment3D& segment, const Triangle3D& triangle ) { const InfiniteLine3D line{ segment }; - const auto line_triangle_result = + const auto [_, closest_on_line, closest_on_triangle] = line_triangle_distance( line, triangle ); - const auto& closest_on_line = std::get< 1 >( line_triangle_result ); - const auto& closest_on_triangle = std::get< 2 >( line_triangle_result ); const auto closest_on_segment = point_segment_projection( closest_on_line, segment ); - return std::make_tuple( - point_point_distance( closest_on_segment, closest_on_triangle ), - closest_on_segment, closest_on_triangle ); + const auto reprojection_on_triangle = + point_triangle_projection( closest_on_segment, triangle ); + return std::make_tuple( point_point_distance( closest_on_segment, + reprojection_on_triangle ), + closest_on_segment, reprojection_on_triangle ); } std::tuple< double, Point3D, Point3D > diff --git a/tests/geometry/test-distance.cpp b/tests/geometry/test-distance.cpp index 364af88c5..2abb91296 100644 --- a/tests/geometry/test-distance.cpp +++ b/tests/geometry/test-distance.cpp @@ -1045,6 +1045,16 @@ void test_segment_triangle_distance() const geode::Segment3D seg_bz0{ bplus, b }; const geode::Segment3D seg_bz1{ bminus, b }; const geode::Segment3D seg_hx{ h2, h }; + const geode::Point3D t0{ { 481.283958699181, 450.641409484767, + 16.0218597413699 } }; + const geode::Point3D t1{ { 436.66619673526, 410.956383185562, + -9.33593054802634 } }; + const geode::Point3D t2{ { 437.005650057499, 490.326435783972, + -9.33593054802634 } }; + const geode::Point3D s0{ { 478.259567983804, 448.24094898319, + 14.302289193253 } }; + const geode::Point3D s1{ { 478.345179768413, 450.641409484767, + 14.3452740537089 } }; double distance; geode::Point3D closest_point0; @@ -1087,6 +1097,15 @@ void test_segment_triangle_distance() && closest_point0.inexact_equal( result_t30 ) && closest_point1.inexact_equal( g ), "[Test] Wrong result for segment_triangle_distance with seg_hx" ); + + const geode::Triangle3D real_triangle{ t0, t1, t2 }; + const geode::Segment3D real_segment{ s0, s1 }; + std::tie( distance, closest_point0, closest_point1 ) = + geode::segment_triangle_distance( real_segment, real_triangle ); + OPENGEODE_EXCEPTION( distance <= geode::GLOBAL_EPSILON + && closest_point0.inexact_equal( s0 ) + && closest_point1.inexact_equal( s0 ), + "[Test] Wrong result for segment_triangle_distance with real_segment" ); } void test_point_ellipse_distance_2d()