33 #include "DGtal/base/Common.h"
34 #include "ConfigTest.h"
35 #include "DGtalCatch.h"
36 #include "DGtal/helpers/StdDefs.h"
37 #include "DGtal/kernel/PointVector.h"
38 #include "DGtal/graph/CUndirectedSimpleGraph.h"
39 #include "DGtal/graph/BreadthFirstVisitor.h"
40 #include "DGtal/topology/DigitalSetBoundary.h"
41 #include "DGtal/topology/IndexedDigitalSurface.h"
42 #include "DGtal/shapes/Shapes.h"
46 using namespace DGtal;
54 SCENARIO(
"IndexedDigitalSurface< DigitalSetBoundary > build tests",
"[idxdsurf][build]" )
58 Point p1( -5, -5, -5 );
61 K.
init( p1, p2,
true );
65 bool build_ok = dsurf.build(
new DigitalSurfaceContainer(
K, aSet ) );
66 GIVEN(
"A digital set boundary over a ball of radius 3" ) {
67 THEN(
"Build of underlying half-edge data structure should be ok" ) {
70 THEN(
"The indexed digital surface has 174 vertices, 348 edges, 176 edges, and Euler=2 as the sphere" ) {
71 REQUIRE( dsurf.nbVertices() == 174 );
72 REQUIRE( dsurf.nbEdges() == 348 );
73 REQUIRE( dsurf.nbFaces() == 176 );
76 THEN(
"All vertices have 4 neighbors" ) {
77 REQUIRE( dsurf.degree( 0 ) == 4 );
78 REQUIRE( dsurf.degree( 17 ) == 4 );
79 REQUIRE( dsurf.degree( 54) == 4 );
80 REQUIRE( dsurf.degree( 102 ) == 4 );
82 THEN(
"Vertices corresponds to surfels, Arcs to linels, Faces to pointels" ) {
90 THEN(
"Linels of opposite arcs are opposite cells" ) {
91 REQUIRE(
K.
sOpp( dsurf.linel( 15 ) ) == dsurf.linel( dsurf.opposite( 15 ) ) );
92 REQUIRE(
K.
sOpp( dsurf.linel( 34 ) ) == dsurf.linel( dsurf.opposite( 34 ) ) );
93 REQUIRE(
K.
sOpp( dsurf.linel( 112 ) ) == dsurf.linel( dsurf.opposite( 112 ) ) );
94 REQUIRE(
K.
sOpp( dsurf.linel( 200 ) ) == dsurf.linel( dsurf.opposite( 200 ) ) );
96 THEN(
"Breadth-first visiting the digital surface from vertex 0 goes to a distance 13." ) {
98 std::vector<int> vertices;
99 std::vector<int> distances;
102 vertices.push_back( visitor.
current().first );
103 distances.push_back( visitor.
current().second );
106 REQUIRE( vertices.size() == 174 );
107 REQUIRE( distances.size() == 174 );
108 REQUIRE( distances.back() == 13 );
113 SCENARIO(
"IndexedDigitalSurface< RealPoint3 > concept check tests",
"[idxdsurf][concepts]" )
Aim: This class is useful to perform a breadth-first exploration of a graph given a starting point or...
const Node & current() const
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of a given...
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
Aim: Represents a digital surface with the topology of its dual surface. Its aim is to mimick the sta...
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
SCell sOpp(const SCell &p) const
Creates the signed cell with the inverse sign of [p].
Dimension sDim(const SCell &p) const
Return the dimension of the cell [p].
Aim: A utility class for constructing different shapes (balls, diamonds, and others).
DGtal is the top-level namespace which contains all DGtal functions and types.
Aim: Represents the concept of local graph: each vertex has neighboring vertices, but we do not neces...
GIVEN("A cubical complex with random 3-cells")
SCENARIO("IndexedDigitalSurface< DigitalSetBoundary > build tests", "[idxdsurf][build]")
HyperRectDomain< Space > Domain
REQUIRE(domain.isInside(aPoint))