@@ -47,15 +47,13 @@ namespace
4747 bool may_point_be_in_triangle (
4848 const geode::Point2D& point, const geode::Triangle2D& triangle )
4949 {
50- const auto signed_area_1 =
51- geode::triangle_signed_area ( geode::Triangle2D{
52- triangle.vertices ()[0 ], triangle.vertices ()[1 ], point } );
53- const auto signed_area_2 =
54- geode::triangle_signed_area ( geode::Triangle2D{
55- triangle.vertices ()[1 ], triangle.vertices ()[2 ], point } );
56- const auto signed_area_3 =
57- geode::triangle_signed_area ( geode::Triangle2D{
58- triangle.vertices ()[2 ], triangle.vertices ()[0 ], point } );
50+ const auto & vertices = triangle.vertices ();
51+ const auto signed_area_1 = geode::triangle_signed_area (
52+ geode::Triangle2D{ vertices[0 ], vertices[1 ], point } );
53+ const auto signed_area_2 = geode::triangle_signed_area (
54+ geode::Triangle2D{ vertices[1 ], vertices[2 ], point } );
55+ const auto signed_area_3 = geode::triangle_signed_area (
56+ geode::Triangle2D{ vertices[2 ], vertices[0 ], point } );
5957
6058 return ( signed_area_1 <= 0 . && signed_area_2 <= 0 .
6159 && signed_area_3 <= 0 )
@@ -96,12 +94,11 @@ namespace geode
9694 /* Algorithm and code found on
9795 * http://geomalgorithms.com/a07-_distance.html
9896 */
99- const Vector< dimension > u{ segment0.vertices ()[0 ],
100- segment0.vertices ()[1 ] };
101- const Vector< dimension > v{ segment1.vertices ()[0 ],
102- segment1.vertices ()[1 ] };
103- const Vector< dimension > w{ segment1.vertices ()[0 ],
104- segment0.vertices ()[0 ] };
97+ const auto & vertices0 = segment0.vertices ();
98+ const auto & vertices1 = segment1.vertices ();
99+ const Vector< dimension > u{ vertices0[0 ], vertices0[1 ] };
100+ const Vector< dimension > v{ vertices1[0 ], vertices1[1 ] };
101+ const Vector< dimension > w{ vertices1[0 ], vertices0[0 ] };
105102 const auto a = u.dot ( u ); // always >= 0
106103 const auto b = u.dot ( v );
107104 const auto c = v.dot ( v ); // always >= 0
@@ -174,10 +171,8 @@ namespace geode
174171 tc = ( std::fabs ( tN ) <= 0.0 ? 0.0 : tN / tD );
175172
176173 // get the difference of the two closest points
177- const Point< dimension > closest0 =
178- segment0.vertices ()[0 ].get () + u * sc;
179- const Point< dimension > closest1 =
180- segment1.vertices ()[0 ].get () + v * tc;
174+ const Point< dimension > closest0 = vertices0[0 ].get () + u * sc;
175+ const Point< dimension > closest1 = vertices1[0 ].get () + v * tc;
181176 const Vector< dimension > dP{ closest0,
182177 closest1 }; // = segment0(sc) - segment1(tc)
183178
@@ -192,13 +187,14 @@ namespace geode
192187 auto min_distance = std::numeric_limits< double >::max ();
193188 local_index_t min_p0{ 0 };
194189 local_index_t min_p1{ 0 };
190+ const auto & vertices0 = segment0.vertices ();
191+ const auto & vertices1 = segment1.vertices ();
195192 for ( const auto p0 : LRange{ 2 } )
196193 {
197194 for ( const auto p1 : LRange{ 2 } )
198195 {
199- const auto cur_dist =
200- point_point_distance ( segment0.vertices ()[p0].get (),
201- segment1.vertices ()[p1].get () );
196+ const auto cur_dist = point_point_distance (
197+ vertices0[p0].get (), vertices1[p1].get () );
202198 if ( cur_dist < min_distance )
203199 {
204200 min_distance = cur_dist;
@@ -212,16 +208,16 @@ namespace geode
212208 if ( min_p1 == 1 )
213209 {
214210 return compute_segment_segment_distance< dimension >(
215- { segment0. vertices () [1 ], segment0. vertices () [0 ] },
216- { segment1. vertices () [1 ], segment1. vertices () [0 ] } );
211+ { vertices0 [1 ], vertices0 [0 ] },
212+ { vertices1 [1 ], vertices1 [0 ] } );
217213 }
218214 return compute_segment_segment_distance (
219- { segment0. vertices () [1 ], segment0. vertices () [0 ] }, segment1 );
215+ { vertices0 [1 ], vertices0 [0 ] }, segment1 );
220216 }
221217 if ( min_p1 == 1 )
222218 {
223219 return compute_segment_segment_distance (
224- segment0, { segment1. vertices () [1 ], segment1. vertices () [0 ] } );
220+ segment0, { vertices1 [1 ], vertices1 [0 ] } );
225221 }
226222 return compute_segment_segment_distance ( segment0, segment1 );
227223 }
@@ -254,15 +250,14 @@ namespace geode
254250 {
255251 const auto v1 = v0 == 2 ? 0 : v0 + 1 ;
256252 const auto v2 = v1 == 2 ? 0 : v1 + 1 ;
257- const Vector3D edge0{ triangle.vertices ()[v0],
258- triangle.vertices ()[v1] };
259- const Vector3D edge1{ triangle.vertices ()[v0],
260- triangle.vertices ()[v2] };
253+ const auto & vertices = triangle.vertices ();
254+ const Vector3D edge0{ vertices[v0], vertices[v1] };
255+ const Vector3D edge1{ vertices[v0], vertices[v2] };
261256 const auto a00 = edge0.length2 ();
262257 const auto a01 = edge0.dot ( edge1 );
263258 const auto a11 = edge1.length2 ();
264259 const auto det = std::fabs ( a00 * a11 - a01 * a01 );
265- const Vector3D diff{ point, triangle. vertices () [v0] };
260+ const Vector3D diff{ point, vertices[v0] };
266261 const auto b0 = diff.dot ( edge0 );
267262 const auto b1 = diff.dot ( edge1 );
268263 auto s = a01 * b1 - a11 * b0;
@@ -443,8 +438,7 @@ namespace geode
443438 }
444439 }
445440
446- Point3D closest_point{ triangle.vertices ()[v0].get () + edge0 * s
447- + edge1 * t };
441+ Point3D closest_point{ vertices[v0].get () + edge0 * s + edge1 * t };
448442 const auto distance = point_point_distance ( point, closest_point );
449443 return std::make_tuple ( distance, std::move ( closest_point ) );
450444 }
@@ -460,11 +454,12 @@ namespace geode
460454 std::array< std::tuple< double , Point3D >, 3 > edge_distances;
461455 auto min_distance = std::numeric_limits< double >::max ();
462456 local_index_t selected_edge{ NO_LID };
457+ const auto & vertices = triangle.vertices ();
463458 for ( const auto e : LRange{ 3 } )
464459 {
465460 const auto next = e == 2 ? 0 : e + 1 ;
466461 edge_distances[e] = point_segment_distance (
467- point, { triangle. vertices () [e], triangle. vertices () [next] } );
462+ point, { vertices[e], vertices[next] } );
468463 const auto & cur_distance = std::get< 0 >( edge_distances[e] );
469464 if ( cur_distance < min_distance )
470465 {
@@ -483,14 +478,15 @@ namespace geode
483478 {
484479 return std::make_tuple ( 0.0 , point );
485480 }
481+ const auto & vertices = triangle.vertices ();
486482 std::array< Point2D, 3 > closest;
487483 std::array< double , 3 > distance;
488- std::tie ( distance[0 ], closest[0 ] ) = point_segment_distance ( point,
489- Segment2D{ triangle. vertices () [0 ], triangle. vertices () [1 ] } );
490- std::tie ( distance[1 ], closest[1 ] ) = point_segment_distance ( point,
491- Segment2D{ triangle. vertices () [1 ], triangle. vertices () [2 ] } );
492- std::tie ( distance[2 ], closest[2 ] ) = point_segment_distance ( point,
493- Segment2D{ triangle. vertices () [2 ], triangle. vertices () [0 ] } );
484+ std::tie ( distance[0 ], closest[0 ] ) = point_segment_distance (
485+ point, Segment2D{ vertices[0 ], vertices[1 ] } );
486+ std::tie ( distance[1 ], closest[1 ] ) = point_segment_distance (
487+ point, Segment2D{ vertices[1 ], vertices[2 ] } );
488+ std::tie ( distance[2 ], closest[2 ] ) = point_segment_distance (
489+ point, Segment2D{ vertices[2 ], vertices[0 ] } );
494490 double result;
495491 Point2D closest_point;
496492 if ( distance[0 ] < distance[1 ] )
@@ -528,18 +524,17 @@ namespace geode
528524 auto max_distance = MAX_DOUBLE;
529525 Point3D nearest_p;
530526 bool inside{ true };
527+ const auto & vertices = tetra.vertices ();
531528 for ( const auto f : Range{ 4 } )
532529 {
530+ const auto & facet_vertices =
531+ Tetrahedron::tetrahedron_facet_vertex[f];
533532 double distance;
534533 Point3D cur_p;
535- std::tie ( distance, cur_p ) = point_triangle_signed_distance ( point,
536- Triangle3D{
537- tetra.vertices ()[Tetrahedron::tetrahedron_facet_vertex[f]
538- [0 ]],
539- tetra.vertices ()[Tetrahedron::tetrahedron_facet_vertex[f]
540- [1 ]],
541- tetra.vertices ()
542- [Tetrahedron::tetrahedron_facet_vertex[f][2 ]] } );
534+ std::tie ( distance, cur_p ) = point_triangle_signed_distance (
535+ point, Triangle3D{ vertices[facet_vertices[0 ]],
536+ vertices[facet_vertices[1 ]],
537+ vertices[facet_vertices[2 ]] } );
543538 if ( distance > 0 )
544539 {
545540 inside = false ;
0 commit comments