Skip to content

Commit 8a35cc4

Browse files
authored
Merge pull request #936 from Geode-solutions/feat/generic_aabb_search
feat(GenericMeshAABB): Created a class to access a mesh AABB generica…
2 parents b0ac5be + 3717bb3 commit 8a35cc4

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

include/geode/mesh/helpers/aabb_edged_curve_helpers.h

Lines changed: 27 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+
template < typename T >
40+
class GenericMeshAABB;
3941
} // namespace geode
4042

4143
namespace geode
@@ -60,4 +62,29 @@ namespace geode
6062
const EdgedCurve< dimension >& mesh_;
6163
};
6264
ALIAS_2D_AND_3D( DistanceToEdge );
65+
66+
template < index_t dimension >
67+
class GenericMeshAABB< EdgedCurve< dimension > >
68+
{
69+
public:
70+
GenericMeshAABB( const EdgedCurve< dimension >& mesh )
71+
: elements_tree_{ create_aabb_tree( mesh ) },
72+
distance_action_{ mesh }
73+
{
74+
}
75+
76+
std::tuple< index_t, Point< dimension >, double > closest_element(
77+
const Point< dimension >& query ) const
78+
{
79+
return this->elements_aabb().closest_element_box(
80+
query, distance_action_ );
81+
}
82+
83+
private:
84+
AABBTree< dimension > elements_tree_;
85+
const DistanceToEdge< dimension > distance_action_;
86+
};
87+
template < index_t dimension >
88+
using EdgedCurveAABB = GenericMeshAABB< EdgedCurve< dimension > >;
89+
ALIAS_2D_AND_3D( EdgedCurveAABB );
6390
} // namespace geode

include/geode/mesh/helpers/aabb_solid_helpers.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ namespace geode
3131
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3232
FORWARD_DECLARATION_DIMENSION_CLASS( SolidMesh );
3333
FORWARD_DECLARATION_DIMENSION_CLASS( TetrahedralSolid );
34+
template < typename T >
35+
class GenericMeshAABB;
3436
} // namespace geode
3537

3638
namespace geode
@@ -55,4 +57,53 @@ namespace geode
5557
const TetrahedralSolid< dimension >& mesh_;
5658
};
5759
ALIAS_3D( DistanceToTetrahedron );
60+
61+
template < index_t dimension >
62+
class GenericMeshAABB< SolidMesh< dimension > >
63+
{
64+
public:
65+
GenericMeshAABB( const SolidMesh< dimension >& mesh )
66+
: elements_tree_{ create_aabb_tree( mesh ) }
67+
{
68+
}
69+
70+
protected:
71+
const AABBTree< dimension >& elements_aabb() const
72+
{
73+
return elements_tree_;
74+
}
75+
76+
private:
77+
AABBTree< dimension > elements_tree_;
78+
};
79+
template < index_t dimension >
80+
using SolidMeshAABB = GenericMeshAABB< SolidMesh< dimension > >;
81+
ALIAS_3D( SolidMeshAABB );
82+
83+
template < index_t dimension >
84+
class GenericMeshAABB< TetrahedralSolid< dimension > >
85+
: public GenericMeshAABB< SolidMesh< dimension > >
86+
{
87+
public:
88+
using Base = GenericMeshAABB< SolidMesh< dimension > >;
89+
90+
GenericMeshAABB( const TetrahedralSolid< dimension >& mesh )
91+
: Base{ mesh }, distance_action_{ mesh }
92+
{
93+
}
94+
95+
std::tuple< index_t, Point< dimension >, double > closest_element(
96+
const Point< dimension >& query ) const
97+
{
98+
return this->elements_aabb().closest_element_box(
99+
query, distance_action_ );
100+
}
101+
102+
private:
103+
const DistanceToTetrahedron< dimension > distance_action_;
104+
};
105+
template < index_t dimension >
106+
using TetrahedralSolidAABB =
107+
GenericMeshAABB< TetrahedralSolid< dimension > >;
108+
ALIAS_3D( TetrahedralSolidAABB );
58109
} // namespace geode

include/geode/mesh/helpers/aabb_surface_helpers.h

Lines changed: 51 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+
template < typename T >
41+
class GenericMeshAABB;
4042
} // namespace geode
4143

4244
namespace geode
@@ -61,4 +63,53 @@ namespace geode
6163
const TriangulatedSurface< dimension >& mesh_;
6264
};
6365
ALIAS_2D_AND_3D( DistanceToTriangle );
66+
67+
template < index_t dimension >
68+
class GenericMeshAABB< SurfaceMesh< dimension > >
69+
{
70+
public:
71+
GenericMeshAABB( const SurfaceMesh< dimension >& mesh )
72+
: elements_tree_{ create_aabb_tree( mesh ) }
73+
{
74+
}
75+
76+
protected:
77+
const AABBTree< dimension >& elements_aabb() const
78+
{
79+
return elements_tree_;
80+
}
81+
82+
private:
83+
AABBTree< dimension > elements_tree_;
84+
};
85+
template < index_t dimension >
86+
using SurfaceMeshAABB = GenericMeshAABB< SurfaceMesh< dimension > >;
87+
ALIAS_2D_AND_3D( SurfaceMeshAABB );
88+
89+
template < index_t dimension >
90+
class GenericMeshAABB< TriangulatedSurface< dimension > >
91+
: public GenericMeshAABB< SurfaceMesh< dimension > >
92+
{
93+
public:
94+
using Base = GenericMeshAABB< SurfaceMesh< dimension > >;
95+
96+
GenericMeshAABB( const TriangulatedSurface< dimension >& mesh )
97+
: Base{ mesh }, distance_action_{ mesh }
98+
{
99+
}
100+
101+
std::tuple< index_t, Point< dimension >, double > closest_element(
102+
const Point< dimension >& query ) const
103+
{
104+
return this->elements_aabb().closest_element_box(
105+
query, distance_action_ );
106+
}
107+
108+
private:
109+
const DistanceToTriangle< dimension > distance_action_;
110+
};
111+
template < index_t dimension >
112+
using TriangulatedSurfaceAABB =
113+
GenericMeshAABB< TriangulatedSurface< dimension > >;
114+
ALIAS_2D_AND_3D( TriangulatedSurfaceAABB );
64115
} // namespace geode

0 commit comments

Comments
 (0)