1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "SingleElementPlanarTests.hxx"
20 #include "InterpolationUtils.hxx"
21 #include "PolygonAlgorithms.hxx"
22 #include "PolygonAlgorithms.txx"
23 #include "InterpolationPlanarTestSuite.hxx"
26 using namespace INTERP_KERNEL;
30 const double _Epsilon = 1.e-12;
31 const double _Precision = 1.e-12;
32 const double _losange1[8] = { 1,0, 0,1, -1,0, 0,-1 };
33 const double _losange2[8] = { 2,0, 1,1, 0,0, 1,-1 };
34 const double _losange3[8] = {2.5,0.5,1.5,1.5,0.5,0.5,1.5,-0.5 };
35 const double _square1[8] = { -1,-1, -1,1, 1,1, 1,-1};
36 const double _square2[8] = {1,-0.25,0,-0.25,0,0.25,1,0.25 };
37 const double _losange4[8] = { 3,0, 2,1, 1,0, 2,-1 };
38 const double _losange5[8] = { 1.5,0, 0,1.5,-1.5,0, 0,-1.5 };
39 const double _losange6[12]= { 2,0, 1,1, 0.5,0.5,0,0, 0.5,-0.5, 1,-1 };
40 const double _losange7[10]= { 1,0, 0,1, -1,0, 0,-1, 0.5,-0.5 };
41 const double _square3[10] = { -1,-1, -1,1, 0.5,1, 1,1, 1,-1, };
42 const double _square4[8] = {-0.5,-1,-0.5,1,1.5,1,1.5,-1 };
43 const double _square5[10] = { -1,-1, -1,1, 0,1, 1,1, 1,-1 };
44 const double _losange8[8] = { 0,1, 1,-1, 0,-1.5,-0.5,-1 };
45 const double _losange9[8] = {0.5,0, 0,1, -1.5,0, 0,-1 };
46 const double _hexagon1[12]= { -2,0, -1,-1, 1,-1, 2,0, 1,1, -1,1 };
47 const double _hexagon2[12]= {-1.5,0.5,-1,-1, 1,-1, 2,1, 1,1, -1,1 };
48 const double _hexagon3[12]= { -2,2, -1,1, 1,1, 2,2, 1,3, -1,3 };
49 const double _square6[8] = { -1,1, -1,3, 0.5,3,0.5,1 };
50 const double _losange10[8]= { 0,-1, 1,-2, 0,-3, -1,-2 };
51 const double _triangle1[6]= {0.5,0, 1,1, 0,1 };
52 const double _triangle2[6]= { 0,0.5, 0,-0.5,1.5,0 };
53 const double _triangle3[9]= {-1,2,0, 1,2,0, 0,2,1 };
54 const double _triangle4[9]= {1./2,2,0, 1, 2, 1, 1, 2, 0.5 };
55 const double _parallel1[8] = {-1,0, -0.5,1, 0.5,1, 0,0};
56 const double _parallel2[8]= {-0.5,1, 0,0, 1.,0, 0.5,1 };
57 const double _parallel3[8]= {-0.5,-1, 0,0, 1,0, 0.5,-1};
58 const double _triangle5[6]= { 0,0, 0,0.5, 0.5,0.5 };
59 const double _triangle6[6]= { 1./3,1./3, 1./3,2./3, 2./3,2./3 };
60 const double _triangle7[6]= {0.5,2, 1,1, 0,1 };
61 const double _triangle8[6]= {22.4601,35.2129, 13.9921,34.693, 18.2853,26.2812 };
62 const double _triangle9[6]= {13.9921,34.693, 22.4601,35.2129, 18.2785,42.3869 };
63 const double _triangle10[6]= {84.8575,98.2042, 80,100, 82.2601,95.7202};
64 const double _triangle11[6]= {80,100, 76.6659,91.9804, 85.3912,92.5061 };
66 // Two diamonds intersecting without degeneracy (two distinct crossing points)
77 // \brief Status : pass
78 void SingleElementPlanarTests::diamondsBasic()
80 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
81 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange2,4,4);
82 deque< double > expected_result;
84 expected_result.push_back(0.5);expected_result.push_back(-0.5);
85 expected_result.push_back(0);expected_result.push_back(0);
86 expected_result.push_back(0.5);expected_result.push_back(0.5);
87 expected_result.push_back(1);expected_result.push_back(0);
89 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
90 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
93 void SingleElementPlanarTests::diamondsBasic_Triangulation()
95 vector< double > actual_result;
96 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange2,4,4,actual_result,_Epsilon/_Precision, _Precision );
98 vector< double > expected_result;
99 expected_result.push_back(1);expected_result.push_back(0);
100 expected_result.push_back(0.5);expected_result.push_back(0.5);
101 expected_result.push_back(0);expected_result.push_back(0);
102 expected_result.push_back(0.5);expected_result.push_back(-0.5);
104 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
105 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
109 // Two diamonds with overlapping edges in an exclusion configuration
120 // \brief Status : pass
121 void SingleElementPlanarTests::tangentDiamonds()
123 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
124 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange3,4,4);
125 deque< double > expected_result;
127 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (CONVEX)",
128 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
130 void SingleElementPlanarTests::tangentDiamonds_Triangulation()
132 vector< double > actual_result;
133 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange3,4,4,actual_result,_Epsilon/_Precision, _Precision );
135 vector< double > expected_result;
136 expected_result.push_back(0.5);expected_result.push_back(0.5);
137 expected_result.push_back(1);expected_result.push_back(0);
139 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (TRIANGULATION)",
140 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
143 // Two tangent squares with overlapping edges, in an inclusion configuration
152 // \brief Status : pass
153 void SingleElementPlanarTests::tangentSquares()
155 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
156 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square2,4,4);
157 deque< double > expected_result;
159 expected_result.push_back(0.);expected_result.push_back(0.25);
160 expected_result.push_back(0.);expected_result.push_back(-0.25);
161 expected_result.push_back(1.);expected_result.push_back(-0.25);
162 expected_result.push_back(1.);expected_result.push_back(0.25);
164 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (CONVEX)",
165 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
167 void SingleElementPlanarTests::tangentSquares_Triangulation()
169 vector< double > actual_result;
170 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square2,4,4,actual_result,_Epsilon/_Precision, _Precision );
172 vector< double > expected_result;
174 expected_result.push_back(1.);expected_result.push_back(0.25);
175 expected_result.push_back(0.25);expected_result.push_back(0.25);
176 expected_result.push_back(1./6);expected_result.push_back(1./6);
177 expected_result.push_back(0.);expected_result.push_back(0.25);
178 expected_result.push_back(0.);expected_result.push_back(0.);
179 expected_result.push_back(0.);expected_result.push_back(-0.25);
180 expected_result.push_back(1.);expected_result.push_back(-0.25);
182 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (TRIANGULATION)",
183 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
186 // Two diamonds sharing a vertex in an exclusion configuration
197 // \brief Status : pass
198 void SingleElementPlanarTests::diamondsSharingVertex1()
200 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
201 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange4,4,4);
202 deque< double > expected_result;
204 CPPUNIT_ASSERT_MESSAGE("Diamond sharing (1) vertex test failed (CONVEX)",
205 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
207 void SingleElementPlanarTests::diamondsSharingVertex1_Triangulation()
209 vector< double > actual_result;
210 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange4,4,4,actual_result,_Epsilon/_Precision, _Precision );
212 vector< double > expected_result;
213 expected_result.push_back(1.);expected_result.push_back(0.);
215 CPPUNIT_ASSERT_MESSAGE("Diamonds sharing (1) vertex test failed (TRIANGULATION)",
216 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
219 // Two identical squares
228 // \brief Status : pass
229 void SingleElementPlanarTests::identicalSquares()
231 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
232 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square1,4,4);
233 deque< double > expected_result;
235 expected_result.push_back(-1.);expected_result.push_back(1.);
236 expected_result.push_back(-1.);expected_result.push_back(-1.);
237 expected_result.push_back(1.);expected_result.push_back(-1.);
238 expected_result.push_back(1.);expected_result.push_back(1.);
240 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
241 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
243 void SingleElementPlanarTests::identicalSquares_Triangulation()
245 vector< double > actual_result;
246 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square1,4,4,actual_result,_Epsilon/_Precision, _Precision );
248 vector< double > expected_result;
250 expected_result.push_back(1.);expected_result.push_back(1.);
251 expected_result.push_back(-1.);expected_result.push_back(1.);
252 expected_result.push_back(-1.);expected_result.push_back(-1.);
253 expected_result.push_back(1.);expected_result.push_back(-1.);
255 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
256 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
258 // Square and diamond intersecting with no degeneracy
275 // \brief Status : pass
276 void SingleElementPlanarTests::squareAndDiamondBasic()
278 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
279 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange5,4,4);
280 deque< double > expected_result;
282 expected_result.push_back(1.);expected_result.push_back(0.5);
283 expected_result.push_back(0.5);expected_result.push_back(1.);
284 expected_result.push_back(-0.5);expected_result.push_back(1.);
285 expected_result.push_back(-1.);expected_result.push_back(0.5);
286 expected_result.push_back(-1.);expected_result.push_back(-0.5);
287 expected_result.push_back(-0.5);expected_result.push_back(-1.);
288 expected_result.push_back(0.5);expected_result.push_back(-1.);
289 expected_result.push_back(1.);expected_result.push_back(-0.5);
291 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (CONVEX)",
292 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
294 void SingleElementPlanarTests::squareAndDiamondBasic_Triangulation()
296 vector< double > actual_result;
297 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange5,4,4,actual_result,_Epsilon/_Precision, _Precision );
299 vector< double > expected_result;
301 expected_result.push_back(1.);expected_result.push_back(0.);
302 expected_result.push_back(1.);expected_result.push_back(0.5);
303 expected_result.push_back(0.75);expected_result.push_back(0.75);
304 expected_result.push_back(0.5);expected_result.push_back(1.);
305 expected_result.push_back(0.);expected_result.push_back(0.);
306 expected_result.push_back(-0.5);expected_result.push_back(1.);
307 expected_result.push_back(-1.);expected_result.push_back(0.5);
308 expected_result.push_back(-1.);expected_result.push_back(0.);
309 expected_result.push_back(-1.);expected_result.push_back(-0.5);
310 expected_result.push_back(-0.75);expected_result.push_back(-0.75);
311 expected_result.push_back(-0.5);expected_result.push_back(-1.);
312 expected_result.push_back(0.5);expected_result.push_back(-1.);
313 expected_result.push_back(1.);expected_result.push_back(-0.5);
316 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION), maybe not significant (0,0) should be removed",
317 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
319 // square and diamond intersecting at four degenerated pointss
327 // \brief Status : pass
329 void SingleElementPlanarTests::squareAndDiamondCritical()
331 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
332 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange1,4,4);
333 deque< double > expected_result;
335 expected_result.push_back(0.);expected_result.push_back(-1.);
336 expected_result.push_back(-1.);expected_result.push_back(0.);
337 expected_result.push_back(0.);expected_result.push_back(1.);
338 expected_result.push_back(1.);expected_result.push_back(0.);
340 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
341 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
343 void SingleElementPlanarTests::squareAndDiamondCritical_Triangulation()
345 vector< double > actual_result;
346 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange1,4,4,actual_result,_Epsilon/_Precision, _Precision );
348 vector< double > expected_result;
350 expected_result.push_back(0.5);expected_result.push_back(0.5);
351 expected_result.push_back(0.);expected_result.push_back(1.);
352 expected_result.push_back(0);expected_result.push_back(0);
353 expected_result.push_back(-1.);expected_result.push_back(0.);
354 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
355 expected_result.push_back(0.);expected_result.push_back(-1.);
356 expected_result.push_back(1.);expected_result.push_back(0.);
358 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION) maybe not significant (0,0) should be removed",
359 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
361 // Two diamonds intersecting at one vertex on edge and one double vertex
372 // \brief Status : pass
373 void SingleElementPlanarTests::diamondsCritical()
376 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
377 deque< double > actual_result = intersector.intersectConvexPolygons(_losange6,_losange7,6,5);
378 deque< double > expected_result;
380 expected_result.push_back(0.5);expected_result.push_back(-0.5);
381 expected_result.push_back(0.5);expected_result.push_back(-0.5);
382 expected_result.push_back(0);expected_result.push_back(0);
383 expected_result.push_back(0.5);expected_result.push_back(0.5);
384 expected_result.push_back(0.5);expected_result.push_back(0.5);
385 expected_result.push_back(1);expected_result.push_back(0);
387 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
388 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
390 void SingleElementPlanarTests::diamondsCritical_Triangulation()
392 vector< double > actual_result;
393 INTERP_KERNEL::intersec_de_polygone<2>(_losange6,_losange7,6,5,actual_result,_Epsilon/_Precision, _Precision );
395 vector< double > expected_result;
397 expected_result.push_back(1);expected_result.push_back(0);
398 expected_result.push_back(0.5);expected_result.push_back(0.5);
399 expected_result.push_back(0);expected_result.push_back(0);
400 expected_result.push_back(0.5);expected_result.push_back(-0.5);
402 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
403 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
406 // Two tangent squares with starting and ending vertices on edges
407 // _____ ___.___ ______
413 // |_____|_______|______|
415 // \brief Status : pass
416 void SingleElementPlanarTests::quadranglesCritical()
418 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
419 deque< double > actual_result = intersector.intersectConvexPolygons(_square4,_square3,4,5);
420 deque< double > expected_result;
422 expected_result.push_back(-0.5);expected_result.push_back(1.);
423 expected_result.push_back(-0.5);expected_result.push_back(-1.);
424 expected_result.push_back(1.);expected_result.push_back(-1.);
425 expected_result.push_back(1.);expected_result.push_back(1.);
427 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (CONVEX)",
428 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
430 void SingleElementPlanarTests::quadranglesCritical_Triangulation()
432 vector< double > actual_result;
433 INTERP_KERNEL::intersec_de_polygone<2>(_square4,_square3,4,5,actual_result,_Epsilon/_Precision, _Precision );
435 vector< double > expected_result;
437 expected_result.push_back(1.);expected_result.push_back(-1.);
438 expected_result.push_back(1.);expected_result.push_back(0.5);
439 expected_result.push_back(1.);expected_result.push_back(1.);
440 expected_result.push_back(0.5);expected_result.push_back(1.);
441 expected_result.push_back(-0.5);expected_result.push_back(1.);
442 expected_result.push_back(-0.5);expected_result.push_back(-1./3);
443 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
444 expected_result.push_back(-0.5);expected_result.push_back(-1.);
446 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (TRIANGULATION)",
447 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
451 // square and diamond crossing and tangency at double vertices, starting vertex on edge
461 // \brief Status : pass
462 void SingleElementPlanarTests::quadrangleAndDiamondCritical()
464 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
465 deque< double > actual_result = intersector.intersectConvexPolygons(_square5,_losange8,5,4);
466 deque< double > expected_result;
468 expected_result.push_back(0.);expected_result.push_back(1.);
469 expected_result.push_back(-0.5);expected_result.push_back(-1.);
470 expected_result.push_back(1.);expected_result.push_back(-1.);
471 expected_result.push_back(1.);expected_result.push_back(-1.);
473 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
474 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
476 void SingleElementPlanarTests::quadrangleAndDiamondCritical_Triangulation()
478 vector< double > actual_result;
479 INTERP_KERNEL::intersec_de_polygone<2>(_square5,_losange8,5,4,actual_result,_Epsilon/_Precision, _Precision );
481 vector< double > expected_result;
483 expected_result.push_back(1.);expected_result.push_back(-1.);
484 expected_result.push_back(1./3);expected_result.push_back(1./3);
485 expected_result.push_back(0.);expected_result.push_back(1.);
486 expected_result.push_back(0.);expected_result.push_back(0.);
487 expected_result.push_back(-1./3);expected_result.push_back(-1./3);
488 expected_result.push_back(-0.5);expected_result.push_back(-1.);
489 expected_result.push_back(0.);expected_result.push_back(-1.);
491 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (TRIANGULATION)",
492 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
493 } // square and diamond intersecting at four degenerated pointss
501 // \brief Status : pass
503 void SingleElementPlanarTests::diamondsCritical2()
505 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
506 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange9,4,4);
507 deque< double > expected_result;
509 expected_result.push_back(0.);expected_result.push_back(-1.);
510 expected_result.push_back(0.);expected_result.push_back(-1.);
511 expected_result.push_back(-1.);expected_result.push_back(0.);
512 expected_result.push_back(0.);expected_result.push_back(1.);
513 expected_result.push_back(0.);expected_result.push_back(1.);
514 expected_result.push_back(0.5);expected_result.push_back(0.);
516 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (CONVEX)",
517 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
519 void SingleElementPlanarTests::diamondsCritical2_Triangulation()
521 vector< double > actual_result;
522 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange9,4,4,actual_result,_Epsilon/_Precision, _Precision );
524 vector< double > expected_result;
526 expected_result.push_back(0.);expected_result.push_back(-1.);
527 expected_result.push_back(0.5);expected_result.push_back(0.);
528 expected_result.push_back(0.);expected_result.push_back(1.);
529 expected_result.push_back(-1.);expected_result.push_back(0.);
531 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (TRIANGULATION)",
532 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
535 // Two tangent hexagons with double vertices and a critical starting vertex on edge
547 // \brief Status : pass
548 void SingleElementPlanarTests::hexagonsCritical1()
551 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
552 deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon2,6,6);
553 deque< double > expected_result;
555 expected_result.push_back(5./3);expected_result.push_back(1./3);
556 expected_result.push_back(1.);expected_result.push_back(-1.);
557 expected_result.push_back(-1.);expected_result.push_back(-1.);
558 expected_result.push_back(-1.5);expected_result.push_back(0.5);
559 expected_result.push_back(-1.);expected_result.push_back(1.);
560 expected_result.push_back(1.);expected_result.push_back(1.);
562 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (CONVEX)",
563 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
565 void SingleElementPlanarTests::hexagonsCritical1_Triangulation()
567 vector< double > actual_result;
568 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon2,6,6,actual_result,_Epsilon/_Precision, _Precision );
570 vector< double > expected_result;
572 expected_result.push_back(-1.);expected_result.push_back(1.);
573 expected_result.push_back(-1.5);expected_result.push_back(0.5);
574 expected_result.push_back(-8./7);expected_result.push_back(2./7);
575 expected_result.push_back(-1.4);expected_result.push_back(0.2);
576 expected_result.push_back(-4./3);expected_result.push_back(0.);
577 expected_result.push_back(-2./3);expected_result.push_back(0.);
578 expected_result.push_back(-1.25);expected_result.push_back(-0.25);
579 expected_result.push_back(-1.);expected_result.push_back(-1.);
580 expected_result.push_back(1.);expected_result.push_back(-1.);
581 expected_result.push_back(1.5);expected_result.push_back(0.);
582 expected_result.push_back(5./3);expected_result.push_back(1./3);
583 expected_result.push_back(1.125);expected_result.push_back(0.875);
584 expected_result.push_back(1.);expected_result.push_back(1.);
585 expected_result.push_back(0.25);expected_result.push_back(0.75);
587 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (TRIANGULATION)",
588 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
591 // Two tangent hexagons with double vertices and a critical starting vertex on edge
603 // \brief Status : pass
604 void SingleElementPlanarTests::hexagonsCritical2()
606 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
607 deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon3,6,6);
608 deque< double > expected_result;
610 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (CONVEX)",
611 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
613 void SingleElementPlanarTests::hexagonsCritical2_Triangulation()
615 vector< double > actual_result;
616 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon3,6,6,actual_result,_Epsilon/_Precision, _Precision );
618 vector< double > expected_result;
619 expected_result.push_back(1.);expected_result.push_back(1.);
620 expected_result.push_back(-1.);expected_result.push_back(1.);
622 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (TRIANGULATION)",
623 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
626 // Square and quadrilateron with outer tangency
639 // \brief Status : pass
640 void SingleElementPlanarTests::squareAndQuadrangleCritical()
642 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
643 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square6,4,4);
644 deque< double > expected_result;
646 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)", (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
648 void SingleElementPlanarTests::squareAndQuadrangleCritical_Triangulation()
650 vector< double > actual_result;
651 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square6,4,4,actual_result,_Epsilon/_Precision, _Precision );
653 vector< double > expected_result;
654 expected_result.push_back(-1.);expected_result.push_back(1.);
655 expected_result.push_back(0.5);expected_result.push_back(1.);
657 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
658 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
660 // Two diamonds sharing a vertex in an exclusion configuration
679 // \brief Status : pass
680 void SingleElementPlanarTests:: diamondsSharingVertex2()
682 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
683 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange10,4,4);
684 deque< double > expected_result;
686 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (CONVEX)",
687 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
689 void SingleElementPlanarTests:: diamondsSharingVertex2_Triangulation()
691 vector< double > actual_result;
692 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange10,4,4,actual_result,_Epsilon/_Precision, _Precision );
694 vector< double > expected_result;
695 expected_result.push_back(0.);expected_result.push_back(-1.);
697 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (TRIANGULATION)",
698 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
701 // Triangle and diamond with a critical crossing at double starting vertex
712 // \brief Status : pass
713 void SingleElementPlanarTests:: triangleAndDiamondCritical()
715 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
716 deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_triangle1,4,3);
717 deque< double > expected_result;
719 expected_result.push_back(2./3);expected_result.push_back(1./3);
720 expected_result.push_back(0.5);expected_result.push_back(0.);
721 expected_result.push_back(0.);expected_result.push_back(1.);
723 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (CONVEX)",
724 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
726 void SingleElementPlanarTests:: triangleAndDiamondCritical_Triangulation()
728 vector< double > actual_result;
729 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_triangle1,4,3,actual_result,_Epsilon/_Precision, _Precision );
731 vector< double > expected_result;
733 expected_result.push_back(2./3);expected_result.push_back(1./3);
734 expected_result.push_back(0.);expected_result.push_back(1.);
735 expected_result.push_back(0.5);expected_result.push_back(0.);
737 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (TRIANGULATION)",
738 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
741 // Basic triangle and square intersection (two distinct points)
754 // \brief Status : pass
755 void SingleElementPlanarTests::triangleAndSquareBasic()
757 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
758 deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_triangle2,4,3);
759 deque< double > expected_result;
761 expected_result.push_back(1.);expected_result.push_back(1./6);
762 expected_result.push_back(1.);expected_result.push_back(-1./6);
763 expected_result.push_back(0.);expected_result.push_back(-0.5);
764 expected_result.push_back(0.);expected_result.push_back(0.5);
766 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
767 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
770 void SingleElementPlanarTests::triangleAndSquareBasic_Triangulation()
772 vector< double > actual_result;
773 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_triangle2,4,3,actual_result,_Epsilon/_Precision, _Precision );
775 vector< double > expected_result;
777 expected_result.push_back(1.);expected_result.push_back(1./6);
778 expected_result.push_back(0.375);expected_result.push_back(0.375);
779 expected_result.push_back(0.);expected_result.push_back(0.5);
780 expected_result.push_back(0.);expected_result.push_back(0.);
781 expected_result.push_back(0.);expected_result.push_back(-0.5);
782 expected_result.push_back(1.);expected_result.push_back(-1./6);
784 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
785 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
787 // Two triangles with a starting vertex on edge
794 // \brief Status : pass
795 void SingleElementPlanarTests::trianglesCritical()
797 INTERP_KERNEL::PolygonAlgorithms<3> intersector (_Epsilon, _Precision);;
798 deque< double > actual_result = intersector.intersectConvexPolygons(_triangle3,_triangle4,3,3);
799 deque< double > expected_result;
801 expected_result.push_back(2./3);expected_result.push_back(2.);expected_result.push_back(1./3);
802 expected_result.push_back(0.5);expected_result.push_back(2.);expected_result.push_back(0.);
803 expected_result.push_back(0.75);expected_result.push_back(2.);expected_result.push_back(0.25);
805 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (CONVEX)",
806 (INTERP_KERNEL::checkEqualPolygons<deque<double>,3>(&actual_result, &expected_result, _Epsilon)));
808 void SingleElementPlanarTests::trianglesCritical_Triangulation()
810 vector< double > actual_result;
811 double _triangle3rotated[6],_triangle4rotated[6];
812 for (int i=0; i<3; i++)_triangle3rotated[2*i] = _triangle3[3*i];
813 for (int i=0; i<3; i++)_triangle3rotated[2*i+1] = _triangle3[3*i+2];
814 for (int i=0; i<3; i++)_triangle4rotated[2*i] = _triangle4[3*i];
815 for (int i=0; i<3; i++)_triangle4rotated[2*i+1] = _triangle4[3*i+2];
817 INTERP_KERNEL::intersec_de_polygone<2>(_triangle3rotated,_triangle4rotated,3,3,actual_result,_Epsilon/_Precision, _Precision );
819 vector< double > expected_result;
821 expected_result.push_back(0.5);expected_result.push_back(0.);
822 expected_result.push_back(2./3);expected_result.push_back(1./3);
823 expected_result.push_back(0.75);expected_result.push_back(0.25);
825 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (TRIANGULATION)",
826 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
829 // Two tangent paralellograms intersecting at 3 double vertices (one being a starting vertex)
837 // \brief Status : pass
838 void SingleElementPlanarTests::paralellogramsCritical1()
840 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
841 deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel2,4,4);
842 deque< double > expected_result;
844 expected_result.push_back(0.);expected_result.push_back(0.);
845 expected_result.push_back(0.);expected_result.push_back(0.);
846 expected_result.push_back(-0.5);expected_result.push_back(1.);
847 expected_result.push_back(0.5);expected_result.push_back(1.);
849 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (CONVEX)",
850 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
852 void SingleElementPlanarTests::paralellogramsCritical1_Triangulation()
854 vector< double > actual_result;
855 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel2,4,4,actual_result,_Epsilon/_Precision, _Precision );
857 vector< double > expected_result;
859 expected_result.push_back(0.25);expected_result.push_back(0.5);
860 expected_result.push_back(0.5);expected_result.push_back(1.);
861 expected_result.push_back(0.);expected_result.push_back(2./3);
862 expected_result.push_back(-0.5);expected_result.push_back(1.);
863 expected_result.push_back(-0.25);expected_result.push_back(0.5);
864 expected_result.push_back(0.);expected_result.push_back(0.);
866 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (TRIANGULATION)",
867 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
870 // Two paralellograms sharing a vertex in an exclusion configuration
882 // \brief Status : pass
883 void SingleElementPlanarTests::paralellogramsCritical2()
885 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
886 deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel3,4,4);
887 deque< double > expected_result;
889 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (CONVEX)",
890 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
892 void SingleElementPlanarTests::paralellogramsCritical2_Triangulation()
894 vector< double > actual_result;
895 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel3,4,4,actual_result,_Epsilon/_Precision, _Precision );
897 vector< double > expected_result;
899 expected_result.push_back(0.);expected_result.push_back(0.);
901 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (TRIANGULATION)",
902 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
905 // Two triangles in a tangency configuration with a starting vertex on edge
917 // \brief Status : pass
918 void SingleElementPlanarTests::trianglesTangencyCritical()
920 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
921 deque< double > actual_result = intersector.intersectConvexPolygons(_triangle5,_triangle6,3,3);
922 deque< double > expected_result;
924 expected_result.push_back(1./3);expected_result.push_back(1./2);
925 expected_result.push_back(1./3);expected_result.push_back(1./3);
926 expected_result.push_back(1./2);expected_result.push_back(1./2);
928 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (CONVEX)",
929 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
931 void SingleElementPlanarTests::trianglesTangencyCritical_Triangulation()
933 vector< double > actual_result;
934 INTERP_KERNEL::intersec_de_polygone<2>(_triangle5,_triangle6,3,3,actual_result,_Epsilon/_Precision, _Precision );
936 vector< double > expected_result;
938 expected_result.push_back(1./3);expected_result.push_back(1./2);
939 expected_result.push_back(1./2);expected_result.push_back(1./2);
940 expected_result.push_back(1./3);expected_result.push_back(1./3);
942 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (TRIANGULATION)",
943 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
946 // Two triangles with double starting point in an outer tangency configuration
957 // \brief Status : pass
958 void SingleElementPlanarTests::trianglesTangencyCritical2()
960 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
961 deque< double > actual_result = intersector.intersectConvexPolygons(_triangle1,_triangle7,3,3);
962 deque< double > expected_result;
964 // if(!checkDequesEqual(actual_result,expected_result, _Epsilon))
966 // cerr<< "CPP_UNIT expected result= " << endl;
967 // dequePrintOut(expected_result);
968 // cerr<< "CPP_UNIT actual result= " << endl;
969 // dequePrintOut(actual_result);
972 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (CONVEX)",
973 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
975 void SingleElementPlanarTests::trianglesTangencyCritical2_Triangulation()
977 vector< double > actual_result;
978 INTERP_KERNEL::intersec_de_polygone<2>(_triangle1,_triangle7,3,3,actual_result,_Epsilon/_Precision, _Precision );
980 vector< double > expected_result;
981 expected_result.push_back(1.);expected_result.push_back(1.);
982 expected_result.push_back(0.);expected_result.push_back(1.);
984 // if(!checkVectorsEqual(actual_result,expected_result, _Epsilon))
986 // cerr<< "CPP_UNIT expected result= " << endl;
987 // vectPrintOut(expected_result);
988 // cerr<< "CPP_UNIT actual result= " << endl;
989 // vectPrintOut(actual_result);
992 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (TRIANGULATION)",
993 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
995 // \brief Status : pass
996 void SingleElementPlanarTests::trianglesTangencyCritical3()
998 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
999 deque< double > actual_result = intersector.intersectConvexPolygons(_triangle8,_triangle9,3,3);
1000 deque< double > expected_result;
1002 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (CONVEX)",
1003 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1005 void SingleElementPlanarTests::trianglesTangencyCritical3_Triangulation()
1007 vector< double > actual_result;
1008 INTERP_KERNEL::intersec_de_polygone<2>(_triangle8,_triangle9,3,3,actual_result,_Epsilon/_Precision, _Precision );
1010 vector< double > expected_result;
1011 expected_result.push_back(22.4601);expected_result.push_back(35.2129);
1012 expected_result.push_back(13.9921);expected_result.push_back(34.693);
1014 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (TRIANGULATION)",
1015 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1017 void SingleElementPlanarTests::trianglesTangencyCritical4()
1019 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1020 deque< double > actual_result = intersector.intersectConvexPolygons(_triangle10,_triangle11,3,3);
1022 deque< double > expected_result;
1023 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1024 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1025 expected_result.push_back(80);expected_result.push_back(100.);
1028 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (CONVEX)",
1029 (INTERP_KERNEL::checkEqualPolygons<deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1031 void SingleElementPlanarTests::trianglesTangencyCritical4_Triangulation()
1033 vector< double > actual_result;
1034 INTERP_KERNEL::intersec_de_polygone<2>(_triangle10,_triangle11,3,3,actual_result,_Epsilon/_Precision, _Precision );
1036 vector< double > expected_result;
1037 expected_result.push_back(80);expected_result.push_back(100.);
1038 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1039 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1041 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (TRIANGULATION)",
1042 (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));