Skip to content

Commit c944254

Browse files
committed
feat(NNSearch): adding ellispsoid neighbor search
1 parent e456a86 commit c944254

File tree

16 files changed

+504
-190
lines changed

16 files changed

+504
-190
lines changed

bindings/python/src/geometry/nn_search.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,17 @@
3535
.def( "point", &NNSearch##dimension##D::point ) \
3636
.def( "closest_neighbor", &NNSearch##dimension##D::closest_neighbor ) \
3737
.def( "radius_neighbors", &NNSearch##dimension##D::radius_neighbors ) \
38+
.def( "frame_neighbors", &NNSearch##dimension##D::frame_neighbors ) \
3839
.def( "neighbors", &NNSearch##dimension##D::neighbors ) \
39-
.def( "colocated_index_mapping", \
40-
&NNSearch##dimension##D::colocated_index_mapping ); \
40+
.def( "radius_colocated_index_mapping", \
41+
static_cast< NNSearch##dimension##D::ColocatedInfo ( \
42+
NNSearch##dimension##D::* )( const double ) const >( \
43+
&NNSearch##dimension##D::colocated_index_mapping ) ) \
44+
.def( "frame_colocated_index_mapping", \
45+
static_cast< NNSearch##dimension##D::ColocatedInfo ( \
46+
NNSearch##dimension##D::* )( const Frame##dimension##D& ) \
47+
const >( \
48+
&NNSearch##dimension##D::colocated_index_mapping ) ); \
4149
\
4250
const auto info##dimension = \
4351
"ColocatedInfo" + std::to_string( dimension ) + "D"; \
@@ -50,7 +58,7 @@
5058
.def( "nb_unique_points", \
5159
&NNSearch##dimension##D::ColocatedInfo::nb_unique_points ) \
5260
.def( "nb_colocated_points", \
53-
&NNSearch##dimension##D::ColocatedInfo::nb_colocated_points )
61+
&NNSearch##dimension##D::ColocatedInfo::nb_colocated_points );
5462

5563
namespace geode
5664
{

include/geode/geometry/nn_search.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include <geode/geometry/basic_objects/ellipse.hpp>
3030
#include <geode/geometry/common.hpp>
31+
#include <geode/geometry/frame.hpp>
3132
#include <geode/geometry/point.hpp>
3233

3334
namespace geode
@@ -115,10 +116,9 @@ namespace geode
115116
* @param[in] threshold_distance The radius of the sphere
116117
* @return the list of points inside this distance
117118
*/
118-
[[nodiscard]] std::vector< index_t > ellipsoid_radius_neighbors(
119+
[[nodiscard]] std::vector< index_t > frame_neighbors(
119120
const Point< dimension >& point,
120-
const Ellipse< dimension >& ellipse,
121-
const double distance_factor ) const;
121+
const Frame< dimension >& epsilons_frame ) const;
122122

123123
/*!
124124
* Get a number ol close neighbors from the given point
@@ -138,7 +138,10 @@ namespace geode
138138
* @return The information related to this colocated operation
139139
*/
140140
[[nodiscard]] ColocatedInfo colocated_index_mapping(
141-
double epsilon ) const;
141+
const double epsilon ) const;
142+
143+
[[nodiscard]] ColocatedInfo colocated_index_mapping(
144+
const Frame< dimension >& epsilon ) const;
142145

143146
private:
144147
IMPLEMENTATION_MEMBER( impl_ );

include/geode/mesh/helpers/detail/curve_merger.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ namespace geode
4141
namespace detail
4242
{
4343
template < index_t dimension >
44-
class EdgedCurveMerger : public VertexMerger< EdgedCurve< dimension > >
44+
class EdgedCurveMerger
45+
: public VertexMerger< EdgedCurve< dimension >, dimension >
4546
{
4647
public:
4748
struct EdgeOrigin
@@ -62,12 +63,15 @@ namespace geode
6263
using EdgeOrigins = absl::InlinedVector< EdgeOrigin, 1 >;
6364

6465
EdgedCurveMerger( absl::Span< const std::reference_wrapper<
65-
const EdgedCurve< dimension > > > curves,
66-
double epsilon );
66+
const EdgedCurve< dimension > > > curves );
6767
EdgedCurveMerger( EdgedCurveMerger&& ) noexcept;
6868
~EdgedCurveMerger();
6969

70-
[[nodiscard]] std::unique_ptr< EdgedCurve< dimension > > merge();
70+
[[nodiscard]] std::unique_ptr< EdgedCurve< dimension > > merge(
71+
double epsilon );
72+
73+
[[nodiscard]] std::unique_ptr< EdgedCurve< dimension > > merge(
74+
const Frame< dimension >& epsilons_frame );
7175

7276
[[nodiscard]] index_t edge_in_merged(
7377
index_t curve, index_t edge ) const;

include/geode/mesh/helpers/detail/point_set_merger.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,20 @@ namespace geode
3838
namespace detail
3939
{
4040
template < index_t dimension >
41-
class PointSetMerger : public VertexMerger< PointSet< dimension > >
41+
class PointSetMerger
42+
: public VertexMerger< PointSet< dimension >, dimension >
4243
{
4344
public:
4445
PointSetMerger( absl::Span< const std::reference_wrapper<
45-
const PointSet< dimension > > > pointsets,
46-
double epsilon );
46+
const PointSet< dimension > > > pointsets );
4747
PointSetMerger( PointSetMerger&& ) noexcept;
4848
~PointSetMerger();
4949

50-
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge();
50+
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge(
51+
double epsilon );
52+
53+
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge(
54+
const Frame3D& frame, const double factor_distance );
5155
};
5256
ALIAS_2D_AND_3D( PointSetMerger );
5357
} // namespace detail

include/geode/mesh/helpers/detail/solid_merger.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include <geode/mesh/common.hpp>
3232
#include <geode/mesh/helpers/detail/vertex_merger.hpp>
3333

34+
#include <geode/geometry/frame.hpp>
35+
3436
namespace geode
3537
{
3638
FORWARD_DECLARATION_DIMENSION_CLASS( SolidMesh );
@@ -41,7 +43,8 @@ namespace geode
4143
namespace detail
4244
{
4345
template < index_t dimension >
44-
class SolidMeshMerger : public VertexMerger< SolidMesh< dimension > >
46+
class SolidMeshMerger
47+
: public VertexMerger< SolidMesh< dimension >, dimension >
4548
{
4649
public:
4750
struct PolyhedronOrigin
@@ -65,12 +68,15 @@ namespace geode
6568
absl::InlinedVector< PolyhedronOrigin, 1 >;
6669

6770
SolidMeshMerger( absl::Span< const std::reference_wrapper<
68-
const SolidMesh< dimension > > > solids,
69-
double epsilon );
71+
const SolidMesh< dimension > > > solids );
7072
SolidMeshMerger( SolidMeshMerger&& ) noexcept;
7173
~SolidMeshMerger();
7274

73-
[[nodiscard]] std::unique_ptr< SolidMesh< dimension > > merge();
75+
[[nodiscard]] std::unique_ptr< SolidMesh< dimension > > merge(
76+
double epsilon );
77+
78+
[[nodiscard]] std::unique_ptr< SolidMesh< dimension > > merge(
79+
const Frame< dimension >& epsilons_frame );
7480

7581
[[nodiscard]] index_t polyhedron_in_merged(
7682
index_t solid, index_t polyhedron ) const;

include/geode/mesh/helpers/detail/surface_merger.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace geode
4242
{
4343
template < index_t dimension >
4444
class SurfaceMeshMerger
45-
: public VertexMerger< SurfaceMesh< dimension > >
45+
: public VertexMerger< SurfaceMesh< dimension >, dimension >
4646
{
4747
public:
4848
struct PolygonOrigin
@@ -64,12 +64,15 @@ namespace geode
6464
using PolygonOrigins = absl::InlinedVector< PolygonOrigin, 1 >;
6565

6666
SurfaceMeshMerger( absl::Span< const std::reference_wrapper<
67-
const SurfaceMesh< dimension > > > surfaces,
68-
double epsilon );
67+
const SurfaceMesh< dimension > > > surfaces );
6968
SurfaceMeshMerger( SurfaceMeshMerger&& ) noexcept;
7069
~SurfaceMeshMerger();
7170

72-
[[nodiscard]] std::unique_ptr< SurfaceMesh< dimension > > merge();
71+
[[nodiscard]] std::unique_ptr< SurfaceMesh< dimension > > merge(
72+
double epsilon );
73+
74+
[[nodiscard]] std::unique_ptr< SurfaceMesh< dimension > > merge(
75+
const Frame< dimension >& epsilons_frame );
7376

7477
[[nodiscard]] index_t polygon_in_merged(
7578
index_t surface, index_t polygon ) const;

include/geode/mesh/helpers/detail/vertex_merger.hpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828

2929
#include <geode/basic/pimpl.hpp>
3030

31+
#include <geode/geometry/frame.hpp>
32+
3133
namespace geode
3234
{
3335
namespace detail
3436
{
35-
template < typename Mesh >
37+
template < typename Mesh, index_t dimension >
3638
class VertexMerger
3739
{
3840
public:
@@ -57,9 +59,14 @@ namespace geode
5759
index_t vertex ) const;
5860

5961
protected:
62+
// VertexMerger(
63+
// absl::Span< const std::reference_wrapper< const Mesh > >
64+
// meshes, double epsilon );
65+
6066
VertexMerger(
61-
absl::Span< const std::reference_wrapper< const Mesh > > meshes,
62-
double epsilon );
67+
absl::Span< const std::reference_wrapper< const Mesh > >
68+
meshes );
69+
6370
VertexMerger( VertexMerger&& ) noexcept;
6471
~VertexMerger();
6572

@@ -73,7 +80,9 @@ namespace geode
7380

7481
[[nodiscard]] Builder& builder();
7582

76-
void create_points();
83+
void create_points( double epsilon );
84+
85+
void create_points( const Frame< dimension >& epsilons_frame );
7786

7887
private:
7988
IMPLEMENTATION_MEMBER( impl_ );

0 commit comments

Comments
 (0)