49SCENARIO(
"TangencyComputer::ShortestPaths 3D tests",
"[shortest_paths][3d][tangency]" )
55 typedef std::size_t
Index;
57 SECTION(
"Computing shortest paths on a 3D unit sphere digitized at gridstep 0.25" )
60 const double h = 0.25;
62 params(
"polynomial",
"sphere1" )(
"gridstep", h );
63 params(
"minAABB", -2)(
"maxAABB", 2)(
"offset", 1.0 )(
"closed", 1 );
71 std::vector< Point > lattice_points;
73 for (
auto p : pointels ) lattice_points.push_back(
K.
uCoords( p ) );
74 REQUIRE( pointels.size() == 296 );
76 const Index nb = lattice_points.size();
79 for (
Index i = 1; i < nb; i++ )
81 if ( lattice_points[ i ] < lattice_points[ lowest ] ) lowest = i;
82 if ( lattice_points[ uppest ] < lattice_points[ i ] ) uppest = i;
87 TC.init( lattice_points.cbegin(), lattice_points.cend() );
88 auto SP = TC.makeShortestPaths( sqrt(3.0) );
90 double last_distance = 0.0;
92 double prev_distance = 0.0;
94 unsigned int nb_multiple_pops = 0;
95 unsigned int nb_decreasing_distance = 0;
96 while ( ! SP.finished() )
98 last = std::get<0>( SP.current() );
99 last_distance = std::get<2>( SP.current() );
100 if ( V.count( last ) ) nb_multiple_pops += 1;
103 if ( last_distance < prev_distance ) nb_decreasing_distance += 1;
104 prev_distance = last_distance;
107 REQUIRE( nb_multiple_pops == 0 );
109 REQUIRE( nb_decreasing_distance == 0 );
113 REQUIRE( last_distance*h >= 2.8 );
114 REQUIRE( last_distance*h <= 3.14159265358979323844 );
116 SP = TC.makeShortestPaths( 0 );
118 double last_distance_opt = 0.0;
119 while ( ! SP.finished() )
121 last = std::get<0>( SP.current() );
122 last_distance_opt = std::get<2>( SP.current() );
128 REQUIRE( last_distance_opt*h >= 2.8 );
129 REQUIRE( last_distance_opt*h <= 3.14159265358979323844 );
131 REQUIRE( last_distance_opt*h >= last_distance*h );
134 SECTION(
"Computing different shortest paths on a 3D unit sphere digitized at gridstep 0.125" )
137 const double h = 0.125;
139 params(
"polynomial",
"sphere1" )(
"gridstep", h );
140 params(
"minAABB", -2)(
"maxAABB", 2)(
"offset", 1.0 )(
"closed", 1 );
148 std::vector< Point > lattice_points;
150 for (
auto p : pointels ) lattice_points.push_back(
K.
uCoords( p ) );
152 const Index nb = lattice_points.size();
155 for (
Index i = 1; i < nb; i++ )
157 if ( lattice_points[ i ] < lattice_points[ lowest ] ) lowest = i;
158 if ( lattice_points[ uppest ] < lattice_points[ i ] ) uppest = i;
162 TC.init( lattice_points.cbegin(), lattice_points.cend() );
163 auto SP = TC.makeShortestPaths( sqrt(3.0) );
165 const double max_discrete_distance = 5.0;
166 const int step = lattice_points.size() / 8;
167 std::size_t sum_nb_visited = 0;
168 std::size_t min_nb_visited = 100000;
169 std::size_t max_nb_visited = 0;
171 for (
auto i = 0; i < lattice_points.size(); i += step, n += 1 )
174 std::vector< std::size_t > visited;
175 while ( ! SP.finished() )
177 auto last = std::get<0>( SP.current() );
178 auto last_distance = std::get<2>( SP.current() );
179 visited.push_back( last );
180 if ( last_distance >= max_discrete_distance )
break;
183 SP.clearVisited( visited );
184 sum_nb_visited += visited.size();
185 min_nb_visited = std::min( min_nb_visited, visited.size() );
186 max_nb_visited = std::max( max_nb_visited, visited.size() );
188 double average = sum_nb_visited / (double) n;
191 REQUIRE( ( average - min_nb_visited ) / average < 0.2 );
192 REQUIRE( ( max_nb_visited - average ) / average < 0.2 );
196SCENARIO(
"TangencyComputer 3D tests",
"[3d][tangency]" )
202 typedef std::size_t
Index;
204 SECTION(
"Computing shortest paths on a 3D unit sphere digitized at gridstep 0.125" )
207 const double h = 0.125;
209 params(
"polynomial",
"sphere1" )(
"gridstep", h );
210 params(
"minAABB", -2)(
"maxAABB", 2)(
"offset", 1.0 )(
"closed", 1 );
218 std::vector< Point > lattice_points;
220 for (
auto p : pointels ) lattice_points.push_back(
K.
uCoords( p ) );
222 const Index nb = lattice_points.size();
225 for (
Index i = 1; i < nb; i++ )
227 if ( lattice_points[ i ] < lattice_points[ lowest ] ) lowest = i;
228 if ( lattice_points[ uppest ] < lattice_points[ i ] ) uppest = i;
232 TC.init( lattice_points.cbegin(), lattice_points.cend() );
233 const Point a = TC.point( lowest );
234 std::vector< Index > V1 = TC.getCotangentPoints( a, 5.0 );
235 std::vector< Index > V2 = TC.getCotangentPoints( a, 10.0 );
236 std::vector< Index > V3 = TC.getCotangentPoints( a, 15.0 );
237 std::sort( V1.begin(), V1.end() );
238 std::sort( V2.begin(), V2.end() );
239 std::sort( V3.begin(), V3.end() );
241 REQUIRE( V1.size() < V2.size() );
242 REQUIRE( V2.size() <= V3.size() );
243 REQUIRE( V3.size() < pointels.size()/2 );
244 REQUIRE( std::includes( V2.begin(), V2.end(), V1.begin(), V1.end() ) );
245 REQUIRE( std::includes( V3.begin(), V3.end(), V2.begin(), V2.end() ) );
249 for (
auto i : V1 ) md1 = std::max( md1, (TC.point( i ) - a).norm() );
250 for (
auto i : V2 ) md2 = std::max( md2, (TC.point( i ) - a).norm() );
251 for (
auto i : V3 ) md3 = std::max( md3, (TC.point( i ) - a).norm() );