Skip to content

Commit 90801e9

Browse files
committed
feat(AnisotropicDistanceToSurface): adding DistanceToSurface for anistropic cases.
1 parent 6655b81 commit 90801e9

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

include/geode/mesh/helpers/aabb_surface_helpers.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace geode
3737
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3838
FORWARD_DECLARATION_DIMENSION_CLASS( SurfaceMesh );
3939
FORWARD_DECLARATION_DIMENSION_CLASS( TriangulatedSurface );
40+
FORWARD_DECLARATION_DIMENSION_CLASS( CoordinateSystem );
41+
ALIAS_2D_AND_3D( CoordinateSystem );
4042
template < typename T >
4143
class GenericMeshAABB;
4244
} // namespace geode
@@ -65,6 +67,26 @@ namespace geode
6567
};
6668
ALIAS_2D_AND_3D( DistanceToTriangle );
6769

70+
template < index_t dimension >
71+
class AnisotropicDistanceToTriangle
72+
{
73+
public:
74+
explicit AnisotropicDistanceToTriangle(
75+
const TriangulatedSurface< dimension >& mesh,
76+
const CoordinateSystem< dimension >& coordinate_system )
77+
: mesh_( mesh ), coordinate_system_( coordinate_system )
78+
{
79+
}
80+
81+
[[nodiscard]] double operator()(
82+
const Point< dimension >& query, index_t cur_box ) const;
83+
84+
private:
85+
const TriangulatedSurface< dimension >& mesh_;
86+
const CoordinateSystem< dimension >& coordinate_system_;
87+
};
88+
ALIAS_2D_AND_3D( AnisotropicDistanceToTriangle );
89+
6890
template < index_t dimension >
6991
class GenericMeshAABB< SurfaceMesh< dimension > >
7092
{

src/geode/mesh/helpers/aabb_surface_helpers.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include <geode/geometry/aabb.hpp>
3535
#include <geode/geometry/basic_objects/triangle.hpp>
36+
#include <geode/geometry/coordinate_system.hpp>
3637
#include <geode/geometry/distance.hpp>
3738
#include <geode/geometry/point.hpp>
3839

@@ -67,12 +68,31 @@ namespace geode
6768
point_triangle_distance( query, mesh_.triangle( cur_box ) ) );
6869
}
6970

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+
7088
template opengeode_mesh_api AABBTree2D create_aabb_tree< 2 >(
7189
const SurfaceMesh2D& );
7290
template opengeode_mesh_api AABBTree3D create_aabb_tree< 3 >(
7391
const SurfaceMesh3D& );
7492

7593
template class opengeode_mesh_api DistanceToTriangle< 2 >;
7694
template class opengeode_mesh_api DistanceToTriangle< 3 >;
95+
template class opengeode_mesh_api AnisotropicDistanceToTriangle< 2 >;
96+
template class opengeode_mesh_api AnisotropicDistanceToTriangle< 3 >;
7797

7898
} // namespace geode

0 commit comments

Comments
 (0)