Skip to content

Commit 99e101a

Browse files
Merge pull request #1107 from Geode-solutions/feat_add_ellipsoid_radius_neighbors_in_nnsearch
Feat_add_ellipsoid_radius_neighbors_in_nnsearch
2 parents c15c308 + 28f2c7f commit 99e101a

File tree

19 files changed

+376
-144
lines changed

19 files changed

+376
-144
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::* )( 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
{

bindings/python/tests/geometry/test-py-nnsearch.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,23 @@
2222
import os
2323
import sys
2424
import platform
25+
2526
if sys.version_info >= (3, 8, 0) and platform.system() == "Windows":
26-
for path in [x.strip() for x in os.environ['PATH'].split(';') if x]:
27+
for path in [x.strip() for x in os.environ["PATH"].split(";") if x]:
2728
os.add_dll_directory(path)
2829

2930
import opengeode_py_basic as basic
3031
import opengeode_py_geometry as geom
3132

32-
if __name__ == '__main__':
33-
search = geom.NNSearch2D([geom.Point2D([0.1, 4.2]), geom.Point2D(
34-
[5.9, 7.3]), geom.Point2D([1.8, -5]), geom.Point2D([-7.3, -1.6])])
33+
if __name__ == "__main__":
34+
search = geom.NNSearch2D(
35+
[
36+
geom.Point2D([0.1, 4.2]),
37+
geom.Point2D([5.9, 7.3]),
38+
geom.Point2D([1.8, -5]),
39+
geom.Point2D([-7.3, -1.6]),
40+
]
41+
)
3542

3643
if search.closest_neighbor(geom.Point2D([0, 0])) != 0:
3744
raise ValueError("[Test] Error in closest neighbor")
@@ -52,6 +59,6 @@
5259
p3 = geom.Point3D([3.1, 9.4, 9.7])
5360
colocator = geom.NNSearch3D([p0, p0, p1, p0, p2, p1, p3])
5461

55-
colocated_info = colocator.colocated_index_mapping(basic.GLOBAL_EPSILON)
62+
colocated_info = colocator.radius_colocated_index_mapping(basic.GLOBAL_EPSILON)
5663
if colocated_info.nb_colocated_points() != 3:
5764
raise ValueError("[Test] Should be 3 colocated points")

include/geode/geometry/frame.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ namespace geode
5252

5353
[[nodiscard]] std::string string() const;
5454

55+
[[nodiscard]] local_index_t max_elongation_direction() const;
56+
57+
[[nodiscard]] local_index_t min_elongation_direction() const;
58+
5559
private:
5660
friend class bitsery::Access;
5761
template < typename Archive >

include/geode/geometry/nn_search.hpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@
2626
#include <geode/basic/mapping.hpp>
2727
#include <geode/basic/pimpl.hpp>
2828

29+
#include <geode/geometry/basic_objects/ellipse.hpp>
2930
#include <geode/geometry/common.hpp>
3031
#include <geode/geometry/point.hpp>
3132

3233
namespace geode
3334
{
35+
FORWARD_DECLARATION_DIMENSION_CLASS( Frame );
36+
3437
/*!
3538
* Given a list of points, this class returns neighboring points.
3639
*/
@@ -108,7 +111,18 @@ namespace geode
108111
const Point< dimension >& point, double threshold_distance ) const;
109112

110113
/*!
111-
* Get a number ol close neighbors from the given point
114+
* Get the neighbors within an ellipse described by its frame, centered
115+
* on the given point
116+
* @param[in] point The center of the ellipse
117+
* @param[in] epsilons_frame The frame describing the ellipse
118+
* @return the list of points inside this distance
119+
*/
120+
[[nodiscard]] std::vector< index_t > frame_neighbors(
121+
const Point< dimension >& point,
122+
const Frame< dimension >& epsilons_frame ) const;
123+
124+
/*!
125+
* Get a number of close neighbors from the given point
112126
* @param[in] point The requested point
113127
* @param[in] nb_neighbors The number of neighbors to return
114128
* @return the list of points, it can be smaller than the requested
@@ -127,6 +141,9 @@ namespace geode
127141
[[nodiscard]] ColocatedInfo colocated_index_mapping(
128142
double epsilon ) const;
129143

144+
[[nodiscard]] ColocatedInfo colocated_index_mapping(
145+
const Frame< dimension >& epsilon ) const;
146+
130147
private:
131148
IMPLEMENTATION_MEMBER( impl_ );
132149
};

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,15 @@ namespace geode
6262
using EdgeOrigins = absl::InlinedVector< EdgeOrigin, 1 >;
6363

6464
EdgedCurveMerger( absl::Span< const std::reference_wrapper<
65-
const EdgedCurve< dimension > > > curves,
66-
double epsilon );
65+
const EdgedCurve< dimension > > > curves );
6766
EdgedCurveMerger( EdgedCurveMerger&& ) noexcept;
6867
~EdgedCurveMerger();
6968

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

7275
[[nodiscard]] index_t edge_in_merged(
7376
index_t curve, index_t edge ) const;

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ namespace geode
4242
{
4343
public:
4444
PointSetMerger( absl::Span< const std::reference_wrapper<
45-
const PointSet< dimension > > > pointsets,
46-
double epsilon );
45+
const PointSet< dimension > > > pointsets );
4746
PointSetMerger( PointSetMerger&& ) noexcept;
4847
~PointSetMerger();
4948

50-
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge();
49+
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge(
50+
double epsilon );
51+
52+
[[nodiscard]] std::unique_ptr< PointSet< dimension > > merge(
53+
const Frame< dimension >& frame );
5154
};
5255
ALIAS_2D_AND_3D( PointSetMerger );
5356
} // namespace detail

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

Lines changed: 8 additions & 3 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 );
@@ -65,12 +67,15 @@ namespace geode
6567
absl::InlinedVector< PolyhedronOrigin, 1 >;
6668

6769
SolidMeshMerger( absl::Span< const std::reference_wrapper<
68-
const SolidMesh< dimension > > > solids,
69-
double epsilon );
70+
const SolidMesh< dimension > > > solids );
7071
SolidMeshMerger( SolidMeshMerger&& ) noexcept;
7172
~SolidMeshMerger();
7273

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

7580
[[nodiscard]] index_t polyhedron_in_merged(
7681
index_t solid, index_t polyhedron ) const;

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

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

31+
#include <geode/geometry/frame.hpp>
32+
3133
namespace geode
3234
{
3335
namespace detail
@@ -58,8 +60,9 @@ namespace geode
5860

5961
protected:
6062
VertexMerger(
61-
absl::Span< const std::reference_wrapper< const Mesh > > meshes,
62-
double epsilon );
63+
absl::Span< const std::reference_wrapper< const Mesh > >
64+
meshes );
65+
6366
VertexMerger( VertexMerger&& ) noexcept;
6467
~VertexMerger();
6568

@@ -73,7 +76,9 @@ namespace geode
7376

7477
[[nodiscard]] Builder& builder();
7578

76-
void create_points();
79+
void create_points( double epsilon );
80+
81+
void create_points( const Frame< Mesh::dim >& epsilons_frame );
7782

7883
private:
7984
IMPLEMENTATION_MEMBER( impl_ );

src/geode/geometry/frame.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
#include <geode/geometry/vector.hpp>
2929

30+
#include <absl/algorithm/container.h>
31+
3032
namespace
3133
{
3234
template < geode::index_t dimension >
@@ -174,6 +176,18 @@ namespace geode
174176
return output;
175177
}
176178

179+
template < index_t dimension >
180+
local_index_t Frame< dimension >::max_elongation_direction() const
181+
{
182+
return std::distance( frame_.begin(), absl::c_max_element( frame_ ) );
183+
}
184+
185+
template < index_t dimension >
186+
local_index_t Frame< dimension >::min_elongation_direction() const
187+
{
188+
return std::distance( frame_.begin(), absl::c_min_element( frame_ ) );
189+
}
190+
177191
template < index_t dimension >
178192
template < typename Archive >
179193
void Frame< dimension >::serialize( Archive& archive )

0 commit comments

Comments
 (0)