Skip to content

Commit ae41610

Browse files
committed
fix(SurfaceInspector): provide triangulated surface inspector
1 parent 195591d commit ae41610

File tree

13 files changed

+187
-115
lines changed

13 files changed

+187
-115
lines changed

bindings/python/src/inspector/intersections/surface_curve_intersections.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323

2424
#include <geode/mesh/core/edged_curve.h>
25-
#include <geode/mesh/core/surface_mesh.h>
25+
#include <geode/mesh/core/triangulated_surface.h>
2626

2727
#include <geode/inspector/criterion/intersections/surface_curve_intersections.h>
2828

@@ -31,9 +31,9 @@
3131
"SurfaceCurveIntersections" + std::to_string( dimension ) + "D"; \
3232
pybind11::class_< SurfaceCurveIntersections##dimension##D >( \
3333
module, name##dimension.c_str() ) \
34-
.def( pybind11::init< const SurfaceMesh< dimension >&, \
34+
.def( pybind11::init< const TriangulatedSurface< dimension >&, \
3535
const EdgedCurve< dimension >& >() ) \
36-
.def( pybind11::init< const SurfaceMesh< dimension >&, \
36+
.def( pybind11::init< const TriangulatedSurface< dimension >&, \
3737
const EdgedCurve< dimension >&, bool >() ) \
3838
.def( "meshes_have_intersections", \
3939
&SurfaceCurveIntersections##dimension##D:: \

bindings/python/src/inspector/intersections/surface_intersections.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,27 @@
2121
*
2222
*/
2323

24-
#include <geode/mesh/core/surface_mesh.h>
24+
#include <geode/mesh/core/triangulated_surface.h>
2525

2626
#include <geode/inspector/criterion/intersections/surface_intersections.h>
2727

2828
#define PYTHON_SURFACE_INTERSECTIONS( dimension ) \
29-
const auto name##dimension = \
30-
"SurfaceMeshIntersections" + std::to_string( dimension ) + "D"; \
31-
pybind11::class_< SurfaceMeshIntersections##dimension##D >( \
29+
const auto name##dimension = "TriangulatedSurfaceIntersections" \
30+
+ std::to_string( dimension ) + "D"; \
31+
pybind11::class_< TriangulatedSurfaceIntersections##dimension##D >( \
3232
module, name##dimension.c_str() ) \
33-
.def( pybind11::init< const SurfaceMesh< dimension >& >() ) \
34-
.def( pybind11::init< const SurfaceMesh< dimension >&, bool >() ) \
33+
.def( pybind11::init< const TriangulatedSurface< dimension >& >() ) \
34+
.def( pybind11::init< const TriangulatedSurface< dimension >&, \
35+
bool >() ) \
3536
.def( "mesh_has_self_intersections", \
36-
&SurfaceMeshIntersections##dimension##D:: \
37+
&TriangulatedSurfaceIntersections##dimension##D:: \
3738
mesh_has_self_intersections ) \
3839
.def( "nb_intersecting_elements_pair", \
39-
&SurfaceMeshIntersections##dimension##D:: \
40+
&TriangulatedSurfaceIntersections##dimension##D:: \
4041
nb_intersecting_elements_pair ) \
4142
.def( "intersecting_elements", \
42-
&SurfaceMeshIntersections##dimension##D::intersecting_elements )
43+
&TriangulatedSurfaceIntersections##dimension##D:: \
44+
intersecting_elements )
4345

4446
namespace geode
4547
{

bindings/python/src/inspector/surface_inspector.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,21 @@
3232
SurfaceMeshAdjacency##dimension##D, \
3333
SurfaceMeshColocation##dimension##D, \
3434
SurfaceMeshDegeneration##dimension##D, \
35-
SurfaceMeshIntersections##dimension##D, \
3635
SurfaceMeshEdgeManifold##dimension##D, \
3736
SurfaceMeshVertexManifold##dimension##D >( \
3837
module, name##dimension.c_str() ) \
3938
.def( pybind11::init< const SurfaceMesh< dimension >& >() ) \
40-
.def( pybind11::init< const SurfaceMesh< dimension >&, bool >() )
39+
.def( pybind11::init< const SurfaceMesh< dimension >&, bool >() ); \
40+
\
41+
const auto trgl_name##dimension = \
42+
"TriangulatedSurfaceInspector" + std::to_string( dimension ) + "D"; \
43+
pybind11::class_< TriangulatedSurfaceInspector##dimension##D, \
44+
SurfaceMeshInspector##dimension##D, \
45+
TriangulatedSurfaceIntersections##dimension##D >( \
46+
module, trgl_name##dimension.c_str() ) \
47+
.def( pybind11::init< const TriangulatedSurface< dimension >& >() ) \
48+
.def( pybind11::init< const TriangulatedSurface< dimension >&, \
49+
bool >() )
4150

4251
namespace geode
4352
{

bindings/python/tests/test-py-surface-intersections.py

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -29,64 +29,73 @@
2929
import opengeode as geode
3030
import opengeode_inspector_py_inspector as inspector
3131

32+
3233
def check_intersections2D():
3334
surface = geode.TriangulatedSurface2D.create()
34-
builder = geode.TriangulatedSurfaceBuilder2D.create( surface )
35-
builder.create_vertices( 5 )
36-
builder.set_point( 0, geode.Point2D( [ 0., 0. ] ) )
37-
builder.set_point( 1, geode.Point2D( [ 3., 0. ] ) )
38-
builder.set_point( 2, geode.Point2D( [ 0., 4. ] ) )
39-
builder.set_point( 3, geode.Point2D( [ 3., 4. ] ) )
40-
builder.set_point( 4, geode.Point2D( [ -1., 2. ] ) )
41-
builder.create_triangle( [ 0, 1, 2 ] )
42-
builder.create_triangle( [ 0, 1, 3 ] )
43-
builder.create_triangle( [ 1, 3, 4 ] )
44-
builder.set_polygon_adjacent( geode.PolygonEdge( 0, 0 ), 1 )
45-
builder.set_polygon_adjacent( geode.PolygonEdge( 1, 0 ), 0 )
46-
builder.set_polygon_adjacent( geode.PolygonEdge( 1, 1 ), 2 )
47-
builder.set_polygon_adjacent( geode.PolygonEdge( 2, 0 ), 1 )
35+
builder = geode.TriangulatedSurfaceBuilder2D.create(surface)
36+
builder.create_vertices(5)
37+
builder.set_point(0, geode.Point2D([0., 0.]))
38+
builder.set_point(1, geode.Point2D([3., 0.]))
39+
builder.set_point(2, geode.Point2D([0., 4.]))
40+
builder.set_point(3, geode.Point2D([3., 4.]))
41+
builder.set_point(4, geode.Point2D([-1., 2.]))
42+
builder.create_triangle([0, 1, 2])
43+
builder.create_triangle([0, 1, 3])
44+
builder.create_triangle([1, 3, 4])
45+
builder.set_polygon_adjacent(geode.PolygonEdge(0, 0), 1)
46+
builder.set_polygon_adjacent(geode.PolygonEdge(1, 0), 0)
47+
builder.set_polygon_adjacent(geode.PolygonEdge(1, 1), 2)
48+
builder.set_polygon_adjacent(geode.PolygonEdge(2, 0), 1)
4849

49-
intersections_inspector = inspector.SurfaceMeshIntersections2D( surface )
50+
intersections_inspector = inspector.TriangulatedSurfaceIntersections2D(
51+
surface)
5052
if not intersections_inspector.mesh_has_self_intersections():
51-
raise ValueError( "[Test] 2D Surface should have intersections." )
53+
raise ValueError("[Test] 2D Surface should have intersections.")
5254
if not intersections_inspector.nb_intersecting_elements_pair() == 3:
53-
raise ValueError( "[Test] 2D Surface should have 3 intersecting elements pair." )
55+
raise ValueError(
56+
"[Test] 2D Surface should have 3 intersecting elements pair.")
5457
triangles_inter = intersections_inspector.intersecting_elements()
55-
if len( triangles_inter ) != 3 or triangles_inter[0][0] != 2 or triangles_inter[0][1] != 0 or triangles_inter[1][0] != 2 or triangles_inter[1][1] != 1 or triangles_inter[2][0] != 0 or triangles_inter[2][1] != 1:
56-
raise ValueError( "[Test] 2D Surface has wrong intersecting elements pairs." )
58+
if len(triangles_inter) != 3 or triangles_inter[0][0] != 2 or triangles_inter[0][1] != 0 or triangles_inter[1][0] != 2 or triangles_inter[1][1] != 1 or triangles_inter[2][0] != 0 or triangles_inter[2][1] != 1:
59+
raise ValueError(
60+
"[Test] 2D Surface has wrong intersecting elements pairs.")
61+
5762

5863
def check_intersections3D():
5964
surface = geode.TriangulatedSurface3D.create()
60-
builder = geode.TriangulatedSurfaceBuilder3D.create( surface )
61-
builder.create_vertices( 7 )
62-
builder.set_point( 0, geode.Point3D( [ 0., 0., 0. ] ) )
63-
builder.set_point( 1, geode.Point3D( [ 0., 0., 3. ] ) )
64-
builder.set_point( 2, geode.Point3D( [ 0., 2., 0. ] ) )
65-
builder.set_point( 3, geode.Point3D( [ 2., 0., 0. ] ) )
66-
builder.set_point( 4, geode.Point3D( [ 5., 0., 1.5 ] ) )
67-
builder.set_point( 5, geode.Point3D( [ 2., 0.5, 2. ] ) )
68-
builder.set_point( 6, geode.Point3D( [ 0., 0., 1.5 ] ) )
69-
builder.create_triangle( [ 0, 1, 2 ] )
70-
builder.create_triangle( [ 0, 2, 3 ] )
71-
builder.create_triangle( [ 3, 5, 2 ] )
72-
builder.create_triangle( [ 5, 2, 4 ] )
73-
builder.create_triangle( [ 4, 2, 6 ] )
74-
builder.set_polygon_adjacent( geode.PolygonEdge( 0, 2 ), 1 )
75-
builder.set_polygon_adjacent( geode.PolygonEdge( 1, 0 ), 0 )
76-
builder.set_polygon_adjacent( geode.PolygonEdge( 1, 1 ), 2 )
77-
builder.set_polygon_adjacent( geode.PolygonEdge( 2, 2 ), 1 )
78-
builder.set_polygon_adjacent( geode.PolygonEdge( 2, 1 ), 3 )
79-
builder.set_polygon_adjacent( geode.PolygonEdge( 3, 0 ), 2 )
65+
builder = geode.TriangulatedSurfaceBuilder3D.create(surface)
66+
builder.create_vertices(7)
67+
builder.set_point(0, geode.Point3D([0., 0., 0.]))
68+
builder.set_point(1, geode.Point3D([0., 0., 3.]))
69+
builder.set_point(2, geode.Point3D([0., 2., 0.]))
70+
builder.set_point(3, geode.Point3D([2., 0., 0.]))
71+
builder.set_point(4, geode.Point3D([5., 0., 1.5]))
72+
builder.set_point(5, geode.Point3D([2., 0.5, 2.]))
73+
builder.set_point(6, geode.Point3D([0., 0., 1.5]))
74+
builder.create_triangle([0, 1, 2])
75+
builder.create_triangle([0, 2, 3])
76+
builder.create_triangle([3, 5, 2])
77+
builder.create_triangle([5, 2, 4])
78+
builder.create_triangle([4, 2, 6])
79+
builder.set_polygon_adjacent(geode.PolygonEdge(0, 2), 1)
80+
builder.set_polygon_adjacent(geode.PolygonEdge(1, 0), 0)
81+
builder.set_polygon_adjacent(geode.PolygonEdge(1, 1), 2)
82+
builder.set_polygon_adjacent(geode.PolygonEdge(2, 2), 1)
83+
builder.set_polygon_adjacent(geode.PolygonEdge(2, 1), 3)
84+
builder.set_polygon_adjacent(geode.PolygonEdge(3, 0), 2)
8085

81-
intersections_inspector = inspector.SurfaceMeshIntersections3D(surface)
86+
intersections_inspector = inspector.TriangulatedSurfaceIntersections3D(
87+
surface)
8288
if not intersections_inspector.mesh_has_self_intersections():
83-
raise ValueError( "[Test] 3D Surface should have intersections." )
89+
raise ValueError("[Test] 3D Surface should have intersections.")
8490
nb_intersections = intersections_inspector.nb_intersecting_elements_pair()
8591
if not nb_intersections == 2:
86-
raise ValueError( "[Test] 3D Surface should have 2 intersecting elements pair." )
92+
raise ValueError(
93+
"[Test] 3D Surface should have 2 intersecting elements pair.")
8794
triangles_inter = intersections_inspector.intersecting_elements()
88-
if len( triangles_inter ) != 2 or triangles_inter[0][0] != 0 or triangles_inter[0][1] != 4 or triangles_inter[1][0] != 2 or triangles_inter[1][1] != 4:
89-
raise ValueError( "[Test] 3D Surface has wrong intersecting elements pairs." )
95+
if len(triangles_inter) != 2 or triangles_inter[0][0] != 0 or triangles_inter[0][1] != 4 or triangles_inter[1][0] != 2 or triangles_inter[1][1] != 4:
96+
raise ValueError(
97+
"[Test] 3D Surface has wrong intersecting elements pairs.")
98+
9099

91100
if __name__ == '__main__':
92101
inspector.OpenGeodeInspectorInspector.initialize()

include/geode/inspector/criterion/intersections/surface_curve_intersections.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,26 @@
3131

3232
namespace geode
3333
{
34-
FORWARD_DECLARATION_DIMENSION_CLASS( SurfaceMesh );
34+
FORWARD_DECLARATION_DIMENSION_CLASS( TriangulatedSurface );
3535
FORWARD_DECLARATION_DIMENSION_CLASS( EdgedCurve );
3636
} // namespace geode
3737

3838
namespace geode
3939
{
4040
/*!
41-
* Class for inspecting the intersections of SurfaceMeshes
41+
* Class for inspecting the intersections of TriangulatedSurfacees
4242
*/
4343
template < index_t dimension >
4444
class opengeode_inspector_inspector_api SurfaceCurveIntersections
4545
{
4646
OPENGEODE_DISABLE_COPY( SurfaceCurveIntersections );
4747

4848
public:
49-
SurfaceCurveIntersections( const SurfaceMesh< dimension >& surface,
49+
SurfaceCurveIntersections(
50+
const TriangulatedSurface< dimension >& surface,
5051
const EdgedCurve< dimension >& curve );
5152

52-
SurfaceCurveIntersections( const SurfaceMesh< dimension >& mesh,
53+
SurfaceCurveIntersections( const TriangulatedSurface< dimension >& mesh,
5354
const EdgedCurve< dimension >& curve,
5455
bool verbose );
5556

@@ -60,8 +61,9 @@ namespace geode
6061
index_t nb_intersecting_elements_pair() const;
6162

6263
/* Returns all pairs of intersecting triangles and edges.
63-
* First element of each pair is a triangle index in the SurfaceMesh,
64-
* second element of each pair is an edge index in the EdgedCurve.
64+
* First element of each pair is a triangle index in the
65+
* TriangulatedSurface, second element of each pair is an edge index in
66+
* the EdgedCurve.
6567
*/
6668
std::vector< std::pair< index_t, index_t > >
6769
intersecting_elements() const;

include/geode/inspector/criterion/intersections/surface_intersections.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,27 @@
3131

3232
namespace geode
3333
{
34-
FORWARD_DECLARATION_DIMENSION_CLASS( SurfaceMesh );
34+
FORWARD_DECLARATION_DIMENSION_CLASS( TriangulatedSurface );
3535
} // namespace geode
3636

3737
namespace geode
3838
{
3939
/*!
40-
* Class for inspecting the intersections of SurfaceMeshes
40+
* Class for inspecting the intersections of TriangulatedSurfaces
4141
*/
4242
template < index_t dimension >
43-
class opengeode_inspector_inspector_api SurfaceMeshIntersections
43+
class opengeode_inspector_inspector_api TriangulatedSurfaceIntersections
4444
{
45-
OPENGEODE_DISABLE_COPY( SurfaceMeshIntersections );
45+
OPENGEODE_DISABLE_COPY( TriangulatedSurfaceIntersections );
4646

4747
public:
48-
SurfaceMeshIntersections( const SurfaceMesh< dimension >& mesh );
48+
TriangulatedSurfaceIntersections(
49+
const TriangulatedSurface< dimension >& mesh );
4950

50-
SurfaceMeshIntersections(
51-
const SurfaceMesh< dimension >& mesh, bool verbose );
51+
TriangulatedSurfaceIntersections(
52+
const TriangulatedSurface< dimension >& mesh, bool verbose );
5253

53-
~SurfaceMeshIntersections();
54+
~TriangulatedSurfaceIntersections();
5455

5556
bool mesh_has_self_intersections() const;
5657

@@ -62,5 +63,5 @@ namespace geode
6263
private:
6364
IMPLEMENTATION_MEMBER( impl_ );
6465
};
65-
ALIAS_2D_AND_3D( SurfaceMeshIntersections );
66+
ALIAS_2D_AND_3D( TriangulatedSurfaceIntersections );
6667
} // namespace geode

include/geode/inspector/surface_inspector.h

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,16 @@ namespace geode
3939
* @extends SurfaceMeshAdjacency
4040
* @extends SurfaceMeshColocation
4141
* @extends SurfaceMeshDegeneration
42-
* @extends SurfaceMeshIntersections
4342
* @extends SurfaceMeshEdgeManifold
4443
* @extends SurfaceMeshVertexManifold
4544
*/
4645
template < index_t dimension >
47-
class opengeode_inspector_inspector_api SurfaceMeshInspector
48-
: public AddInspectors< SurfaceMesh< dimension >,
49-
SurfaceMeshAdjacency< dimension >,
50-
SurfaceMeshColocation< dimension >,
51-
SurfaceMeshDegeneration< dimension >,
52-
SurfaceMeshIntersections< dimension >,
53-
SurfaceMeshEdgeManifold< dimension >,
54-
SurfaceMeshVertexManifold< dimension > >
46+
class SurfaceMeshInspector : public AddInspectors< SurfaceMesh< dimension >,
47+
SurfaceMeshAdjacency< dimension >,
48+
SurfaceMeshColocation< dimension >,
49+
SurfaceMeshDegeneration< dimension >,
50+
SurfaceMeshEdgeManifold< dimension >,
51+
SurfaceMeshVertexManifold< dimension > >
5552
{
5653
OPENGEODE_DISABLE_COPY( SurfaceMeshInspector );
5754

@@ -62,4 +59,24 @@ namespace geode
6259
const SurfaceMesh< dimension >& mesh, bool verbose );
6360
};
6461
ALIAS_2D_AND_3D( SurfaceMeshInspector );
62+
63+
/*!
64+
* Class for inspecting a TriangulatedSurface
65+
* @extends SurfaceMeshInspector
66+
* @extends TriangulatedSurfaceIntersections
67+
*/
68+
template < index_t dimension >
69+
class TriangulatedSurfaceInspector
70+
: public SurfaceMeshInspector< dimension >,
71+
public AddInspectors< TriangulatedSurface< dimension >,
72+
TriangulatedSurfaceIntersections< dimension > >
73+
{
74+
public:
75+
TriangulatedSurfaceInspector(
76+
const TriangulatedSurface< dimension >& mesh );
77+
78+
TriangulatedSurfaceInspector(
79+
const TriangulatedSurface< dimension >& mesh, bool verbose );
80+
};
81+
ALIAS_2D_AND_3D( TriangulatedSurfaceInspector );
6582
} // namespace geode

src/bin/geode-inspector-surface-curve-intersections.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ ABSL_FLAG( std::string, curve, "/path/my/curve.og_edc3d", "Input curve" );
5353
ABSL_FLAG( bool, verbose, false, "Toggle verbose mode" );
5454

5555
template < geode::index_t dimension >
56-
void inspect_surface_curve( const geode::SurfaceMesh< dimension >& surface,
56+
void inspect_surface_curve(
57+
const geode::TriangulatedSurface< dimension >& surface,
5758
const geode::EdgedCurve< dimension >& curve )
5859
{
5960
const auto verbose = absl::GetFlag( FLAGS_verbose );

src/bin/geode-inspector-surface.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,16 @@ void inspect_surface( const geode::SurfaceMesh< dimension >& surface )
113113
&& surface.type_name()
114114
== geode::TriangulatedSurface< dimension >::type_name_static() )
115115
{
116-
tasks.emplace_back( async::spawn( [&inspector] {
117-
const auto nb = inspector.nb_intersecting_elements_pair();
116+
tasks.emplace_back( async::spawn( [&surface, verbose] {
117+
const geode::TriangulatedSurfaceInspector< dimension >
118+
triangulated_inspector{
119+
dynamic_cast<
120+
const geode::TriangulatedSurface< dimension >& >(
121+
surface ),
122+
verbose
123+
};
124+
const auto nb =
125+
triangulated_inspector.nb_intersecting_elements_pair();
118126
geode::Logger::info( nb, " pairs of intersecting triangles" );
119127
} ) );
120128
}

0 commit comments

Comments
 (0)