DGtal 2.2.0
Loading...
Searching...
No Matches
testCorrectedNormalCurrentComputer.cpp File Reference
#include <iostream>
#include <vector>
#include <algorithm>
#include "DGtal/base/Common.h"
#include "DGtal/kernel/SpaceND.h"
#include "DGtal/shapes/SurfaceMesh.h"
#include "DGtal/shapes/SurfaceMeshHelper.h"
#include "DGtal/geometry/meshes/CorrectedNormalCurrentComputer.h"
#include "DGtalCatch.h"
Include dependency graph for testCorrectedNormalCurrentComputer.cpp:

Go to the source code of this file.

Functions

 SCENARIO ("CorrectedNormalCurrentComputer interpolated curvature measures on sphere tests", "[icnc][sphere]")
 SCENARIO ("CorrectedNormalCurrentComputer face-constant curvature measures on sphere tests", "[ccnc][sphere]")
 SCENARIO ("CorrectedNormalCurrentComputer interpolated curvature measures on Schwarz lantern tests", "[icnc][lantern]")
 SCENARIO ("CorrectedNormalCurrentComputer face-constant curvature measures on Schwarz lantern tests", "[ccnc][lantern]")
 SCENARIO ("CorrectedNormalCurrentComputer ICNC convergence tests", "[icnc][convergence]")
 SCENARIO ("CorrectedNormalCurrentComputer CCNC convergence tests", "[ccnc][convergence]")

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
Date
2021/10/24

Functions for testing class CorrectedNormalCurrentComputer.

This file is part of the DGtal library.

Definition in file testCorrectedNormalCurrentComputer.cpp.

Function Documentation

◆ SCENARIO() [1/6]

SCENARIO ( "CorrectedNormalCurrentComputer CCNC convergence tests" ,
"" [ccnc][convergence] )

Definition at line 284 of file testCorrectedNormalCurrentComputer.cpp.

285{
286 using namespace Z3i;
290
291 GIVEN( "A sphere of radius 1 discretized finer and finer" ) {
292 THEN( "The total mu0 measure tends toward the sphere area" ) {
293 std::vector< double > errors_mu0;
294 for ( unsigned int n = 10; n < 50; n += 10 )
295 {
296 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, n, n,
297 SMH::NormalsType::FACE_NORMALS );
298 CNCComputer cnc_computer ( sphere, false );
299 auto mu0 = cnc_computer .computeMu0();
300 errors_mu0.push_back( mu0.measure() );
301 }
302 double sphere_area = 4.0 * M_PI;
303 for ( auto & v : errors_mu0 ) v = fabs( v - sphere_area ) / sphere_area;
304 for ( auto i = 0; i < (int)errors_mu0.size()-1; i++ ) {
305 REQUIRE( errors_mu0[ i+1 ] < errors_mu0[ i ] );
306 }
307 }
308 }
309 GIVEN( "A sphere of radius 1 discretized finer and finer" ) {
310 THEN( "The total mu1 measure tends toward twice the sphere area" ) {
311 std::vector< double > errors_mu1;
312 for ( unsigned int n = 10; n < 50; n += 10 )
313 {
314 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, n, n,
315 SMH::NormalsType::FACE_NORMALS );
316 CNCComputer cnc_computer ( sphere, false );
317 auto mu1 = cnc_computer .computeMu1();
318 errors_mu1.push_back( mu1.measure() );
319 }
320 double sphere_twice_mc = 8.0 * M_PI;
321 for ( auto & v : errors_mu1 ) v = fabs( v - sphere_twice_mc ) / sphere_twice_mc;
322 for ( auto i = 0; i < (int)errors_mu1.size()-1; i++ ) {
323 REQUIRE( errors_mu1[ i+1 ] < errors_mu1[ i ] );
324 }
325 }
326 }
327}
Z3i this namespace gathers the standard of types for 3D imagery.
GIVEN("A cubical complex with random 3-cells")
REQUIRE(domain.isInside(aPoint))
PointVector< 3, double > RealPoint

References GIVEN(), REQUIRE(), and SCENARIO().

◆ SCENARIO() [2/6]

SCENARIO ( "CorrectedNormalCurrentComputer face-constant curvature measures on Schwarz lantern tests" ,
"" [ccnc][lantern] )

Definition at line 178 of file testCorrectedNormalCurrentComputer.cpp.

179{
180 using namespace Z3i;
184
185 SM lantern = SMH::makeLantern( 1.0, 1.0, RealPoint { 0.0, 0.0, 0.0 }, 30, 12,
186 SMH::NormalsType::FACE_NORMALS );
187 CNCComputer cnc_computer ( lantern, false );
188 CNCComputer cncu_computer( lantern, true );
189 GIVEN( "A discretized lantern of radius 1 with 30x12x2 triangles" ) {
190 THEN( "Its total mu0 measure is close to 2*pi (area)" ) {
191 auto mu0 = cnc_computer .computeMu0();
192 auto mu0_u = cncu_computer.computeMu0();
193 double total_area = mu0.measure();
194 double total_area_u = mu0_u.measure();
195 Approx lantern_area = Approx( 2.0 * M_PI ).epsilon(0.05);
196 REQUIRE( total_area == lantern_area );
197 REQUIRE( total_area_u == lantern_area );
198 }
199 THEN( "Its total mu1 measure is close to 2*pi (twice mean curvature)" ) {
200 auto mu1 = cnc_computer .computeMu1();
201 auto mu1_u = cncu_computer.computeMu1();
202 double total_mu1 = mu1.measure();
203 double total_mu1_u = mu1_u.measure();
204 Approx twice_mean_c = Approx( 2.0 * M_PI ).epsilon(0.05);
205 REQUIRE( total_mu1 == twice_mean_c );
206 REQUIRE( total_mu1_u == twice_mean_c );
207 }
208 THEN( "Its total mu2 measure is close to 0 (Gaussian curvature)" ) {
209 auto mu2 = cnc_computer .computeMu2();
210 auto mu2_u = cncu_computer.computeMu2();
211 double total_mu2 = mu2.measure();
212 double total_mu2_u = mu2_u.measure();
213 Approx exact_gaussian_c = Approx( 0.0 ).epsilon(0.000005);
214 REQUIRE( total_mu2 == exact_gaussian_c );
215 REQUIRE( total_mu2_u == exact_gaussian_c );
216 }
217 }
218}

References GIVEN(), REQUIRE(), and SCENARIO().

◆ SCENARIO() [3/6]

SCENARIO ( "CorrectedNormalCurrentComputer face-constant curvature measures on sphere tests" ,
"" [ccnc][sphere] )

Definition at line 93 of file testCorrectedNormalCurrentComputer.cpp.

94{
95 using namespace Z3i;
99
100 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, 20, 20,
101 SMH::NormalsType::FACE_NORMALS );
102 CNCComputer cnc_computer ( sphere, false );
103 CNCComputer cncu_computer( sphere, true );
104 GIVEN( "A discretized sphere of radius 1 with 20x20x2 triangles" ) {
105 THEN( "Its total mu0 measure is close to 4*pi (area)" ) {
106 auto mu0 = cnc_computer .computeMu0();
107 auto mu0_u = cncu_computer.computeMu0();
108 double total_area = mu0.measure();
109 double total_area_u = mu0_u.measure();
110 Approx sphere_area = Approx( 4.0 * M_PI ).epsilon(0.05);
111 REQUIRE( total_area == sphere_area );
112 REQUIRE( total_area_u == sphere_area );
113 }
114 THEN( "Its total mu1 measure is close to 8*pi (twice mean curvature)" ) {
115 auto mu1 = cnc_computer .computeMu1();
116 auto mu1_u = cncu_computer.computeMu1();
117 double total_mu1 = mu1.measure();
118 double total_mu1_u = mu1_u.measure();
119 Approx twice_mean_c = Approx( 8.0 * M_PI ).epsilon(0.05);
120 REQUIRE( total_mu1 == twice_mean_c );
121 REQUIRE( total_mu1_u == twice_mean_c );
122 }
123 THEN( "Its total mu2 measure is close to 4*pi (Gaussian curvature)" ) {
124 auto mu2 = cnc_computer .computeMu2();
125 auto mu2_u = cncu_computer.computeMu2();
126 double total_mu2 = mu2.measure();
127 double total_mu2_u = mu2_u.measure();
128 Approx gaussian_c = Approx( 4.0 * M_PI ).epsilon(0.05);
129 REQUIRE( total_mu2 == gaussian_c );
130 Approx exact_gaussian_c = Approx( 4.0 * M_PI ).epsilon(0.000005);
131 REQUIRE( total_mu2_u == exact_gaussian_c );
132 }
133 }
134}

References GIVEN(), REQUIRE(), and SCENARIO().

◆ SCENARIO() [4/6]

SCENARIO ( "CorrectedNormalCurrentComputer ICNC convergence tests" ,
"" [icnc][convergence] )

Definition at line 221 of file testCorrectedNormalCurrentComputer.cpp.

222{
223 using namespace Z3i;
227
228 GIVEN( "A sphere of radius 1 discretized finer and finer" ) {
229 THEN( "The total mu0 measure tends toward the sphere area" ) {
230 std::vector< double > errors_mu0;
231 for ( unsigned int n = 10; n < 50; n += 10 )
232 {
233 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, n, n,
234 SMH::NormalsType::VERTEX_NORMALS );
235 CNCComputer cnc_computer ( sphere, false );
236 auto mu0 = cnc_computer .computeMu0();
237 errors_mu0.push_back( mu0.measure() );
238 }
239 double sphere_area = 4.0 * M_PI;
240 for ( auto & v : errors_mu0 ) v = fabs( v - sphere_area ) / sphere_area;
241 for ( auto i = 0; i < (int)errors_mu0.size()-1; i++ ) {
242 REQUIRE( errors_mu0[ i+1 ] < errors_mu0[ i ] );
243 }
244 }
245 }
246 GIVEN( "A sphere of radius 1 discretized finer and finer" ) {
247 THEN( "The total mu1 measure tends toward twice the sphere area" ) {
248 std::vector< double > errors_mu1;
249 for ( unsigned int n = 10; n < 50; n += 10 )
250 {
251 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, n, n,
252 SMH::NormalsType::VERTEX_NORMALS );
253 CNCComputer cnc_computer ( sphere, false );
254 auto mu1 = cnc_computer .computeMu1();
255 errors_mu1.push_back( mu1.measure() );
256 }
257 double sphere_twice_mc = 8.0 * M_PI;
258 for ( auto & v : errors_mu1 ) v = fabs( v - sphere_twice_mc ) / sphere_twice_mc;
259 for ( auto i = 0; i < (int)errors_mu1.size()-1; i++ ) {
260 REQUIRE( errors_mu1[ i+1 ] < errors_mu1[ i ] );
261 }
262 }
263 }
264 GIVEN( "A sphere of radius 1 discretized finer and finer" ) {
265 THEN( "The total mu2 measure tends toward the sphere area" ) {
266 std::vector< double > errors_mu2;
267 for ( unsigned int n = 10; n < 50; n += 10 )
268 {
269 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, n, n,
270 SMH::NormalsType::VERTEX_NORMALS );
271 CNCComputer cnc_computer ( sphere, false );
272 auto mu2 = cnc_computer .computeMu2();
273 errors_mu2.push_back( mu2.measure() );
274 }
275 double sphere_gauss_c = 4.0 * M_PI;
276 for ( auto & v : errors_mu2 ) v = fabs( v - sphere_gauss_c ) / sphere_gauss_c;
277 for ( auto i = 0; i < (int)errors_mu2.size()-1; i++ ) {
278 REQUIRE( errors_mu2[ i+1 ] < errors_mu2[ i ] );
279 }
280 }
281 }
282}

References GIVEN(), REQUIRE(), and SCENARIO().

◆ SCENARIO() [5/6]

SCENARIO ( "CorrectedNormalCurrentComputer interpolated curvature measures on Schwarz lantern tests" ,
"" [icnc][lantern] )

Definition at line 136 of file testCorrectedNormalCurrentComputer.cpp.

137{
138 using namespace Z3i;
142
143 SM lantern = SMH::makeLantern( 1.0, 1.0, RealPoint { 0.0, 0.0, 0.0 }, 30, 12,
144 SMH::NormalsType::VERTEX_NORMALS );
145 CNCComputer cnc_computer ( lantern, false );
146 CNCComputer cncu_computer( lantern, true );
147 GIVEN( "A discretized lantern of radius 1 with 30x12x2 triangles" ) {
148 THEN( "Its total mu0 measure is close to 2*pi (area)" ) {
149 auto mu0 = cnc_computer .computeMu0();
150 auto mu0_u = cncu_computer.computeMu0();
151 double total_area = mu0.measure();
152 double total_area_u = mu0_u.measure();
153 Approx lantern_area = Approx( 2.0 * M_PI ).epsilon(0.05);
154 REQUIRE( total_area == lantern_area );
155 REQUIRE( total_area_u == lantern_area );
156 }
157 THEN( "Its total mu1 measure is close to 2*pi (twice mean curvature)" ) {
158 auto mu1 = cnc_computer .computeMu1();
159 auto mu1_u = cncu_computer.computeMu1();
160 double total_mu1 = mu1.measure();
161 double total_mu1_u = mu1_u.measure();
162 Approx twice_mean_c = Approx( 2.0 * M_PI ).epsilon(0.05);
163 REQUIRE( total_mu1 == twice_mean_c );
164 REQUIRE( total_mu1_u == twice_mean_c );
165 }
166 THEN( "Its total mu2 measure is close to 0 (Gaussian curvature)" ) {
167 auto mu2 = cnc_computer .computeMu2();
168 auto mu2_u = cncu_computer.computeMu2();
169 double total_mu2 = mu2.measure();
170 double total_mu2_u = mu2_u.measure();
171 Approx exact_gaussian_c = Approx( 0.0 ).epsilon(0.000005);
172 REQUIRE( total_mu2 == exact_gaussian_c );
173 REQUIRE( total_mu2_u == exact_gaussian_c );
174 }
175 }
176}

References GIVEN(), REQUIRE(), and SCENARIO().

◆ SCENARIO() [6/6]

SCENARIO ( "CorrectedNormalCurrentComputer interpolated curvature measures on sphere tests" ,
"" [icnc][sphere] )

Definition at line 50 of file testCorrectedNormalCurrentComputer.cpp.

51{
52 using namespace Z3i;
56
57 SM sphere = SMH::makeSphere( 1.0, RealPoint { 0.0, 0.0, 0.0 }, 20, 20,
58 SMH::NormalsType::VERTEX_NORMALS );
59 CNCComputer cnc_computer ( sphere, false );
60 CNCComputer cncu_computer( sphere, true );
61 GIVEN( "A discretized sphere of radius 1 with 20x20x2 triangles" ) {
62 THEN( "Its total mu0 measure is close to 4*pi (area)" ) {
63 auto mu0 = cnc_computer .computeMu0();
64 auto mu0_u = cncu_computer.computeMu0();
65 double total_area = mu0.measure();
66 double total_area_u = mu0_u.measure();
67 Approx sphere_area = Approx( 4.0 * M_PI ).epsilon(0.05);
68 REQUIRE( total_area == sphere_area );
69 REQUIRE( total_area_u == sphere_area );
70 }
71 THEN( "Its total mu1 measure is close to 8*pi (twice mean curvature)" ) {
72 auto mu1 = cnc_computer .computeMu1();
73 auto mu1_u = cncu_computer.computeMu1();
74 double total_mu1 = mu1.measure();
75 double total_mu1_u = mu1_u.measure();
76 Approx twice_mean_c = Approx( 8.0 * M_PI ).epsilon(0.05);
77 REQUIRE( total_mu1 == twice_mean_c );
78 REQUIRE( total_mu1_u == twice_mean_c );
79 }
80 THEN( "Its total mu2 measure is close to 4*pi (Gaussian curvature)" ) {
81 auto mu2 = cnc_computer .computeMu2();
82 auto mu2_u = cncu_computer.computeMu2();
83 double total_mu2 = mu2.measure();
84 double total_mu2_u = mu2_u.measure();
85 Approx gaussian_c = Approx( 4.0 * M_PI ).epsilon(0.05);
86 REQUIRE( total_mu2 == gaussian_c );
87 Approx exact_gaussian_c = Approx( 4.0 * M_PI ).epsilon(0.000005);
88 REQUIRE( total_mu2_u == exact_gaussian_c );
89 }
90 }
91}

References GIVEN(), REQUIRE(), and SCENARIO().

Referenced by SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), SCENARIO(), and SCENARIO().