|
33 | 33 |
|
34 | 34 | #include <geode/geometry/aabb.hpp> |
35 | 35 | #include <geode/geometry/basic_objects/triangle.hpp> |
| 36 | +#include <geode/geometry/coordinate_system.hpp> |
36 | 37 | #include <geode/geometry/distance.hpp> |
37 | 38 | #include <geode/geometry/point.hpp> |
38 | 39 |
|
@@ -67,12 +68,31 @@ namespace geode |
67 | 68 | point_triangle_distance( query, mesh_.triangle( cur_box ) ) ); |
68 | 69 | } |
69 | 70 |
|
| 71 | + template < index_t dimension > |
| 72 | + double AnisotropicDistanceToTriangle< dimension >::operator()( |
| 73 | + const Point< dimension >& query, index_t cur_box ) const |
| 74 | + { |
| 75 | + const auto triangle = mesh_.triangle( cur_box ); |
| 76 | + const auto vertices = triangle.vertices(); |
| 77 | + const auto point0 = coordinate_system_.coordinates( vertices[0].get() ); |
| 78 | + const auto point1 = coordinate_system_.coordinates( vertices[1].get() ); |
| 79 | + const auto point2 = coordinate_system_.coordinates( vertices[2].get() ); |
| 80 | + const Triangle< dimension > triangle_in_metric_space{ point0, point1, |
| 81 | + point2 }; |
| 82 | + const auto query_in_metric_space = |
| 83 | + coordinate_system_.coordinates( query ); |
| 84 | + return std::get< 0 >( point_triangle_distance( |
| 85 | + query_in_metric_space, triangle_in_metric_space ) ); |
| 86 | + } |
| 87 | + |
70 | 88 | template opengeode_mesh_api AABBTree2D create_aabb_tree< 2 >( |
71 | 89 | const SurfaceMesh2D& ); |
72 | 90 | template opengeode_mesh_api AABBTree3D create_aabb_tree< 3 >( |
73 | 91 | const SurfaceMesh3D& ); |
74 | 92 |
|
75 | 93 | template class opengeode_mesh_api DistanceToTriangle< 2 >; |
76 | 94 | template class opengeode_mesh_api DistanceToTriangle< 3 >; |
| 95 | + template class opengeode_mesh_api AnisotropicDistanceToTriangle< 2 >; |
| 96 | + template class opengeode_mesh_api AnisotropicDistanceToTriangle< 3 >; |
77 | 97 |
|
78 | 98 | } // namespace geode |
0 commit comments