Skip to content

Commit 6655b81

Browse files
committed
feat(AnisotropicDistanceToEdge): adding a new DistanceToEdge object in an anisotropic space.
1 parent 9e7163d commit 6655b81

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

include/geode/mesh/helpers/aabb_edged_curve_helpers.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace geode
3636
FORWARD_DECLARATION_DIMENSION_CLASS( Point );
3737
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3838
FORWARD_DECLARATION_DIMENSION_CLASS( EdgedCurve );
39+
FORWARD_DECLARATION_DIMENSION_CLASS( CoordinateSystem );
40+
ALIAS_2D_AND_3D( CoordinateSystem );
3941
template < typename T >
4042
class GenericMeshAABB;
4143
} // namespace geode
@@ -63,6 +65,25 @@ namespace geode
6365
};
6466
ALIAS_1D_AND_2D_AND_3D( DistanceToEdge );
6567

68+
template < index_t dimension >
69+
class AnisotropicDistanceToEdge
70+
{
71+
public:
72+
explicit AnisotropicDistanceToEdge( const EdgedCurve< dimension >& mesh,
73+
const CoordinateSystem< dimension >& coordinate_system )
74+
: mesh_( mesh ), coordinate_system_( coordinate_system )
75+
{
76+
}
77+
78+
[[nodiscard]] double operator()(
79+
const Point< dimension >& query, index_t cur_box ) const;
80+
81+
private:
82+
const EdgedCurve< dimension >& mesh_;
83+
const CoordinateSystem< dimension >& coordinate_system_;
84+
};
85+
ALIAS_2D_AND_3D( AnisotropicDistanceToEdge );
86+
6687
template < index_t dimension >
6788
class GenericMeshAABB< EdgedCurve< dimension > >
6889
{

src/geode/mesh/helpers/aabb_edged_curve_helpers.cpp

Lines changed: 18 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/segment.hpp>
36+
#include <geode/geometry/coordinate_system.hpp>
3637
#include <geode/geometry/distance.hpp>
3738
#include <geode/geometry/point.hpp>
3839
#include <geode/geometry/projection.hpp>
@@ -65,6 +66,20 @@ namespace geode
6566
return point_segment_distance( query, segment );
6667
}
6768

69+
template < index_t dimension >
70+
double AnisotropicDistanceToEdge< dimension >::operator()(
71+
const Point< dimension >& query, index_t cur_box ) const
72+
{
73+
const auto segment = mesh_.segment( cur_box );
74+
const auto vertices = segment.vertices();
75+
const auto point0 = coordinate_system_.coordinates( vertices[0].get() );
76+
const auto point1 = coordinate_system_.coordinates( vertices[1].get() );
77+
const auto query_in_metric_space =
78+
coordinate_system_.coordinates( query );
79+
geode::Segment< dimension > segment_in_metric_space{ point0, point1 };
80+
return point_segment_distance( query_in_metric_space, segment );
81+
}
82+
6883
template opengeode_mesh_api AABBTree1D create_aabb_tree< 1 >(
6984
const EdgedCurve1D& );
7085
template opengeode_mesh_api AABBTree2D create_aabb_tree< 2 >(
@@ -75,4 +90,7 @@ namespace geode
7590
template class opengeode_mesh_api DistanceToEdge< 1 >;
7691
template class opengeode_mesh_api DistanceToEdge< 2 >;
7792
template class opengeode_mesh_api DistanceToEdge< 3 >;
93+
94+
template class opengeode_mesh_api AnisotropicDistanceToEdge< 2 >;
95+
template class opengeode_mesh_api AnisotropicDistanceToEdge< 3 >;
7896
} // namespace geode

0 commit comments

Comments
 (0)