DGtal 1.3.0
Loading...
Searching...
No Matches
testIndexedDigitalSurface.cpp
Go to the documentation of this file.
1
31#include <iostream>
32#include <algorithm>
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"
44
45using namespace std;
46using namespace DGtal;
47using namespace Z3i;
48
50// Functions for testing class IndexedDigitalSurface.
52
53
54SCENARIO( "IndexedDigitalSurface< DigitalSetBoundary > build tests", "[idxdsurf][build]" )
55{
56 typedef DigitalSetBoundary< KSpace, DigitalSet > DigitalSurfaceContainer;
58 Point p1( -5, -5, -5 );
59 Point p2( 5, 5, 5 );
60 KSpace K;
61 K.init( p1, p2, true );
62 DigitalSet aSet( Domain( p1, p2 ) );
63 Shapes<Domain>::addNorm2Ball( aSet, Point( 0, 0, 0 ), 3 );
64 DigSurface dsurf;
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" ) {
68 REQUIRE( build_ok == true );
69 }
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 );
74 REQUIRE( dsurf.Euler() == 2 );
75 }
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 );
81 }
82 THEN( "Vertices corresponds to surfels, Arcs to linels, Faces to pointels" ) {
83 REQUIRE( K.sDim( dsurf.surfel( 0 ) ) == 2 );
84 REQUIRE( K.sDim( dsurf.surfel( 17 ) ) == 2 );
85 REQUIRE( K.sDim( dsurf.linel( 0 ) ) == 1 );
86 REQUIRE( K.sDim( dsurf.linel( 25 ) ) == 1 );
87 REQUIRE( K.sDim( dsurf.pointel( 0 ) ) == 0 );
88 REQUIRE( K.sDim( dsurf.pointel( 25 ) ) == 0 );
89 }
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 ) ) );
95 }
96 THEN( "Breadth-first visiting the digital surface from vertex 0 goes to a distance 13." ) {
97 BreadthFirstVisitor< DigSurface > visitor( dsurf, 0 );
98 std::vector<int> vertices;
99 std::vector<int> distances;
100 while ( ! visitor.finished() )
101 {
102 vertices.push_back( visitor.current().first );
103 distances.push_back( visitor.current().second );
104 visitor.expand();
105 }
106 REQUIRE( vertices.size() == 174 );
107 REQUIRE( distances.size() == 174 );
108 REQUIRE( distances.back() == 13 );
109 }
110 }
111}
112
113SCENARIO( "IndexedDigitalSurface< RealPoint3 > concept check tests", "[idxdsurf][concepts]" )
114{
115 typedef DigitalSetBoundary< KSpace, DigitalSet > DigitalSurfaceContainer;
117 BOOST_CONCEPT_ASSERT(( concepts::CUndirectedSimpleGraph< DigSurface > ));
118}
119
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].
static void addNorm2Ball(TDigitalSet &aSet, const Point &aCenter, UnsignedInteger aRadius)
HyperRectDomain< Space > Domain
Definition: StdDefs.h:172
Space::Point Point
Definition: StdDefs.h:168
DGtal is the top-level namespace which contains all DGtal functions and types.
STL namespace.
Aim: Represents the concept of local graph: each vertex has neighboring vertices, but we do not neces...
KSpace K
GIVEN("A cubical complex with random 3-cells")
REQUIRE(domain.isInside(aPoint))
SCENARIO("UnorderedSetByBlock< PointVector< 2, int > unit tests with 32 bits blocks", "[unorderedsetbyblock][2d]")