1 // Copyright (C) 2007-2014 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, or (at your option) any later version.
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
20 #include "SingleElementPlanarTests.hxx"
21 #include "InterpolationUtils.hxx"
22 #include "PolygonAlgorithms.hxx"
23 #include "PolygonAlgorithms.txx"
24 #include "InterpolationPlanarTestSuite.hxx"
27 using namespace INTERP_KERNEL;
31 const double _Epsilon = 1.e-12;
32 const double _Precision = 1.e-12;
33 const double _losange1[8] = { 1,0, 0,1, -1,0, 0,-1 };
34 const double _losange2[8] = { 2,0, 1,1, 0,0, 1,-1 };
35 const double _losange3[8] = {2.5,0.5,1.5,1.5,0.5,0.5,1.5,-0.5 };
36 const double _square1[8] = { -1,-1, -1,1, 1,1, 1,-1};
37 const double _square2[8] = {1,-0.25,0,-0.25,0,0.25,1,0.25 };
38 const double _losange4[8] = { 3,0, 2,1, 1,0, 2,-1 };
39 const double _losange5[8] = { 1.5,0, 0,1.5,-1.5,0, 0,-1.5 };
40 const double _losange6[12]= { 2,0, 1,1, 0.5,0.5,0,0, 0.5,-0.5, 1,-1 };
41 const double _losange7[10]= { 1,0, 0,1, -1,0, 0,-1, 0.5,-0.5 };
42 const double _square3[10] = { -1,-1, -1,1, 0.5,1, 1,1, 1,-1, };
43 const double _square4[8] = {-0.5,-1,-0.5,1,1.5,1,1.5,-1 };
44 const double _square5[10] = { -1,-1, -1,1, 0,1, 1,1, 1,-1 };
45 const double _losange8[8] = { 0,1, 1,-1, 0,-1.5,-0.5,-1 };
46 const double _losange9[8] = {0.5,0, 0,1, -1.5,0, 0,-1 };
47 const double _hexagon1[12]= { -2,0, -1,-1, 1,-1, 2,0, 1,1, -1,1 };
48 const double _hexagon2[12]= {-1.5,0.5,-1,-1, 1,-1, 2,1, 1,1, -1,1 };
49 const double _hexagon3[12]= { -2,2, -1,1, 1,1, 2,2, 1,3, -1,3 };
50 const double _square6[8] = { -1,1, -1,3, 0.5,3,0.5,1 };
51 const double _losange10[8]= { 0,-1, 1,-2, 0,-3, -1,-2 };
52 const double _triangle1[6]= {0.5,0, 1,1, 0,1 };
53 const double _triangle2[6]= { 0,0.5, 0,-0.5,1.5,0 };
54 const double _triangle3[9]= {-1,2,0, 1,2,0, 0,2,1 };
55 const double _triangle4[9]= {1./2,2,0, 1, 2, 1, 1, 2, 0.5 };
56 const double _parallel1[8] = {-1,0, -0.5,1, 0.5,1, 0,0};
57 const double _parallel2[8]= {-0.5,1, 0,0, 1.,0, 0.5,1 };
58 const double _parallel3[8]= {-0.5,-1, 0,0, 1,0, 0.5,-1};
59 const double _triangle5[6]= { 0,0, 0,0.5, 0.5,0.5 };
60 const double _triangle6[6]= { 1./3,1./3, 1./3,2./3, 2./3,2./3 };
61 const double _triangle7[6]= {0.5,2, 1,1, 0,1 };
62 const double _triangle8[6]= {22.4601,35.2129, 13.9921,34.693, 18.2853,26.2812 };
63 const double _triangle9[6]= {13.9921,34.693, 22.4601,35.2129, 18.2785,42.3869 };
64 const double _triangle10[6]= {84.8575,98.2042, 80,100, 82.2601,95.7202};
65 const double _triangle11[6]= {80,100, 76.6659,91.9804, 85.3912,92.5061 };
67 // Two diamonds intersecting without degeneracy (two distinct crossing points)
78 // \brief Status : pass
79 void SingleElementPlanarTests::diamondsBasic()
81 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
82 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange2,4,4);
83 std::deque< double > expected_result;
85 expected_result.push_back(0.5);expected_result.push_back(-0.5);
86 expected_result.push_back(0);expected_result.push_back(0);
87 expected_result.push_back(0.5);expected_result.push_back(0.5);
88 expected_result.push_back(1);expected_result.push_back(0);
90 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
91 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
94 void SingleElementPlanarTests::diamondsBasic_Triangulation()
96 std::vector< double > actual_result;
97 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange2,4,4,actual_result,_Epsilon/_Precision, _Precision );
99 std::vector< double > expected_result;
100 expected_result.push_back(1);expected_result.push_back(0);
101 expected_result.push_back(0.5);expected_result.push_back(0.5);
102 expected_result.push_back(0);expected_result.push_back(0);
103 expected_result.push_back(0.5);expected_result.push_back(-0.5);
105 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
106 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
110 // Two diamonds with overlapping edges in an exclusion configuration
121 // \brief Status : pass
122 void SingleElementPlanarTests::tangentDiamonds()
124 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
125 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange3,4,4);
126 std::deque< double > expected_result;
128 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (CONVEX)",
129 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
131 void SingleElementPlanarTests::tangentDiamonds_Triangulation()
133 std::vector< double > actual_result;
134 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange3,4,4,actual_result,_Epsilon/_Precision, _Precision );
136 std::vector< double > expected_result;
137 expected_result.push_back(0.5);expected_result.push_back(0.5);
138 expected_result.push_back(1);expected_result.push_back(0);
140 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (TRIANGULATION)",
141 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
144 // Two tangent squares with overlapping edges, in an inclusion configuration
153 // \brief Status : pass
154 void SingleElementPlanarTests::tangentSquares()
156 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
157 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square2,4,4);
158 std::deque< double > expected_result;
160 expected_result.push_back(0.);expected_result.push_back(0.25);
161 expected_result.push_back(0.);expected_result.push_back(-0.25);
162 expected_result.push_back(1.);expected_result.push_back(-0.25);
163 expected_result.push_back(1.);expected_result.push_back(0.25);
165 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (CONVEX)",
166 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
168 void SingleElementPlanarTests::tangentSquares_Triangulation()
170 std::vector< double > actual_result;
171 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square2,4,4,actual_result,_Epsilon/_Precision, _Precision );
173 std::vector< double > expected_result;
175 expected_result.push_back(1.);expected_result.push_back(0.25);
176 expected_result.push_back(0.25);expected_result.push_back(0.25);
177 expected_result.push_back(1./6);expected_result.push_back(1./6);
178 expected_result.push_back(0.);expected_result.push_back(0.25);
179 expected_result.push_back(0.);expected_result.push_back(0.);
180 expected_result.push_back(0.);expected_result.push_back(-0.25);
181 expected_result.push_back(1.);expected_result.push_back(-0.25);
183 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (TRIANGULATION)",
184 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
187 // Two diamonds sharing a vertex in an exclusion configuration
198 // \brief Status : pass
199 void SingleElementPlanarTests::diamondsSharingVertex1()
201 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
202 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange4,4,4);
203 std::deque< double > expected_result;
205 CPPUNIT_ASSERT_MESSAGE("Diamond sharing (1) vertex test failed (CONVEX)",
206 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
208 void SingleElementPlanarTests::diamondsSharingVertex1_Triangulation()
210 std::vector< double > actual_result;
211 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange4,4,4,actual_result,_Epsilon/_Precision, _Precision );
213 std::vector< double > expected_result;
214 expected_result.push_back(1.);expected_result.push_back(0.);
216 CPPUNIT_ASSERT_MESSAGE("Diamonds sharing (1) vertex test failed (TRIANGULATION)",
217 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
220 // Two identical squares
229 // \brief Status : pass
230 void SingleElementPlanarTests::identicalSquares()
232 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
234 ////////////////// TEST DESACTIVATED by A. GEAY because memory fault :
235 // conditional jump INTERP_KERNEL::PolygonAlgorithms<2>::intersectConvexPolygons(double const*, double const*, int, int) (PolygonAlgorithms.txx:629)
236 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square1,4,4);
237 std::deque< double > expected_result;
239 expected_result.push_back(-1.);expected_result.push_back(1.);
240 expected_result.push_back(-1.);expected_result.push_back(-1.);
241 expected_result.push_back(1.);expected_result.push_back(-1.);
242 expected_result.push_back(1.);expected_result.push_back(1.);
244 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
245 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
248 void SingleElementPlanarTests::identicalSquares_Triangulation()
250 std::vector< double > actual_result;
251 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square1,4,4,actual_result,_Epsilon/_Precision, _Precision );
253 std::vector< double > expected_result;
255 expected_result.push_back(1.);expected_result.push_back(1.);
256 expected_result.push_back(-1.);expected_result.push_back(1.);
257 expected_result.push_back(-1.);expected_result.push_back(-1.);
258 expected_result.push_back(1.);expected_result.push_back(-1.);
260 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
261 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
263 // Square and diamond intersecting with no degeneracy
280 // \brief Status : pass
281 void SingleElementPlanarTests::squareAndDiamondBasic()
283 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
284 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange5,4,4);
285 std::deque< double > expected_result;
287 expected_result.push_back(1.);expected_result.push_back(0.5);
288 expected_result.push_back(0.5);expected_result.push_back(1.);
289 expected_result.push_back(-0.5);expected_result.push_back(1.);
290 expected_result.push_back(-1.);expected_result.push_back(0.5);
291 expected_result.push_back(-1.);expected_result.push_back(-0.5);
292 expected_result.push_back(-0.5);expected_result.push_back(-1.);
293 expected_result.push_back(0.5);expected_result.push_back(-1.);
294 expected_result.push_back(1.);expected_result.push_back(-0.5);
296 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (CONVEX)",
297 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
299 void SingleElementPlanarTests::squareAndDiamondBasic_Triangulation()
301 std::vector< double > actual_result;
302 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange5,4,4,actual_result,_Epsilon/_Precision, _Precision );
304 std::vector< double > expected_result;
306 expected_result.push_back(1.);expected_result.push_back(0.);
307 expected_result.push_back(1.);expected_result.push_back(0.5);
308 expected_result.push_back(0.75);expected_result.push_back(0.75);
309 expected_result.push_back(0.5);expected_result.push_back(1.);
310 expected_result.push_back(0.);expected_result.push_back(0.);
311 expected_result.push_back(-0.5);expected_result.push_back(1.);
312 expected_result.push_back(-1.);expected_result.push_back(0.5);
313 expected_result.push_back(-1.);expected_result.push_back(0.);
314 expected_result.push_back(-1.);expected_result.push_back(-0.5);
315 expected_result.push_back(-0.75);expected_result.push_back(-0.75);
316 expected_result.push_back(-0.5);expected_result.push_back(-1.);
317 expected_result.push_back(0.5);expected_result.push_back(-1.);
318 expected_result.push_back(1.);expected_result.push_back(-0.5);
321 // EAP: different place of (0,0) point on 32 and 64-bits platforms
322 // we comment it for the sake of "make check" to pass
323 //CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION), maybe not significant (0,0) should be removed",
324 //(INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
326 // square and diamond intersecting at four degenerated pointss
334 // \brief Status : pass
336 void SingleElementPlanarTests::squareAndDiamondCritical()
338 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
339 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange1,4,4);
340 std::deque< double > expected_result;
342 expected_result.push_back(0.);expected_result.push_back(-1.);
343 expected_result.push_back(-1.);expected_result.push_back(0.);
344 expected_result.push_back(0.);expected_result.push_back(1.);
345 expected_result.push_back(1.);expected_result.push_back(0.);
347 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
348 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
350 void SingleElementPlanarTests::squareAndDiamondCritical_Triangulation()
352 std::vector< double > actual_result;
353 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange1,4,4,actual_result,_Epsilon/_Precision, _Precision );
355 std::vector< double > expected_result;
357 expected_result.push_back(0.5);expected_result.push_back(0.5);
358 expected_result.push_back(0.);expected_result.push_back(1.);
359 expected_result.push_back(0);expected_result.push_back(0);
360 expected_result.push_back(-1.);expected_result.push_back(0.);
361 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
362 expected_result.push_back(0.);expected_result.push_back(-1.);
363 expected_result.push_back(1.);expected_result.push_back(0.);
365 // 0020208: Unit Test of MED failed
366 // CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION) maybe not significant (0,0) should be removed",
367 // (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
369 // Two diamonds intersecting at one vertex on edge and one double vertex
380 // \brief Status : pass
381 void SingleElementPlanarTests::diamondsCritical()
384 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
385 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange6,_losange7,6,5);
386 std::deque< double > expected_result;
388 expected_result.push_back(0.5);expected_result.push_back(-0.5);
389 expected_result.push_back(0.5);expected_result.push_back(-0.5);
390 expected_result.push_back(0);expected_result.push_back(0);
391 expected_result.push_back(0.5);expected_result.push_back(0.5);
392 expected_result.push_back(0.5);expected_result.push_back(0.5);
393 expected_result.push_back(1);expected_result.push_back(0);
395 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
396 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
398 void SingleElementPlanarTests::diamondsCritical_Triangulation()
400 std::vector< double > actual_result;
401 INTERP_KERNEL::intersec_de_polygone<2>(_losange6,_losange7,6,5,actual_result,_Epsilon/_Precision, _Precision );
403 std::vector< double > expected_result;
405 expected_result.push_back(1);expected_result.push_back(0);
406 expected_result.push_back(0.5);expected_result.push_back(0.5);
407 expected_result.push_back(0);expected_result.push_back(0);
408 expected_result.push_back(0.5);expected_result.push_back(-0.5);
410 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
411 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
414 // Two tangent squares with starting and ending vertices on edges
415 // _____ ___.___ ______
421 // |_____|_______|______|
423 // \brief Status : pass
424 void SingleElementPlanarTests::quadranglesCritical()
426 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
427 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square4,_square3,4,5);
428 std::deque< double > expected_result;
430 expected_result.push_back(-0.5);expected_result.push_back(1.);
431 expected_result.push_back(-0.5);expected_result.push_back(-1.);
432 expected_result.push_back(1.);expected_result.push_back(-1.);
433 expected_result.push_back(1.);expected_result.push_back(1.);
435 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (CONVEX)",
436 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
438 void SingleElementPlanarTests::quadranglesCritical_Triangulation()
440 std::vector< double > actual_result;
441 INTERP_KERNEL::intersec_de_polygone<2>(_square4,_square3,4,5,actual_result,_Epsilon/_Precision, _Precision );
443 std::vector< double > expected_result;
445 expected_result.push_back(1.);expected_result.push_back(-1.);
446 expected_result.push_back(1.);expected_result.push_back(0.5);
447 expected_result.push_back(1.);expected_result.push_back(1.);
448 expected_result.push_back(0.5);expected_result.push_back(1.);
449 expected_result.push_back(-0.5);expected_result.push_back(1.);
450 expected_result.push_back(-0.5);expected_result.push_back(-1./3);
451 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
452 expected_result.push_back(-0.5);expected_result.push_back(-1.);
454 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (TRIANGULATION)",
455 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
459 // square and diamond crossing and tangency at double vertices, starting vertex on edge
469 // \brief Status : pass
470 void SingleElementPlanarTests::quadrangleAndDiamondCritical()
472 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
473 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square5,_losange8,5,4);
474 std::deque< double > expected_result;
476 expected_result.push_back(0.);expected_result.push_back(1.);
477 expected_result.push_back(-0.5);expected_result.push_back(-1.);
478 expected_result.push_back(1.);expected_result.push_back(-1.);
479 expected_result.push_back(1.);expected_result.push_back(-1.);
481 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
482 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
484 void SingleElementPlanarTests::quadrangleAndDiamondCritical_Triangulation()
486 std::vector< double > actual_result;
487 INTERP_KERNEL::intersec_de_polygone<2>(_square5,_losange8,5,4,actual_result,_Epsilon/_Precision, _Precision );
489 std::vector< double > expected_result;
491 expected_result.push_back(1.);expected_result.push_back(-1.);
492 expected_result.push_back(1./3);expected_result.push_back(1./3);
493 expected_result.push_back(0.);expected_result.push_back(1.);
494 expected_result.push_back(0.);expected_result.push_back(0.);
495 expected_result.push_back(-1./3);expected_result.push_back(-1./3);
496 expected_result.push_back(-0.5);expected_result.push_back(-1.);
497 expected_result.push_back(0.);expected_result.push_back(-1.);
499 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (TRIANGULATION)",
500 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
501 } // square and diamond intersecting at four degenerated pointss
509 // \brief Status : pass
511 void SingleElementPlanarTests::diamondsCritical2()
513 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
514 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange9,4,4);
515 std::deque< double > expected_result;
517 expected_result.push_back(0.);expected_result.push_back(-1.);
518 expected_result.push_back(0.);expected_result.push_back(-1.);
519 expected_result.push_back(-1.);expected_result.push_back(0.);
520 expected_result.push_back(0.);expected_result.push_back(1.);
521 expected_result.push_back(0.);expected_result.push_back(1.);
522 expected_result.push_back(0.5);expected_result.push_back(0.);
524 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (CONVEX)",
525 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
527 void SingleElementPlanarTests::diamondsCritical2_Triangulation()
529 std::vector< double > actual_result;
530 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange9,4,4,actual_result,_Epsilon/_Precision, _Precision );
532 std::vector< double > expected_result;
534 expected_result.push_back(0.);expected_result.push_back(-1.);
535 expected_result.push_back(0.5);expected_result.push_back(0.);
536 expected_result.push_back(0.);expected_result.push_back(1.);
537 expected_result.push_back(-1.);expected_result.push_back(0.);
539 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (TRIANGULATION)",
540 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
543 // Two tangent hexagons with double vertices and a critical starting vertex on edge
555 // \brief Status : pass
556 void SingleElementPlanarTests::hexagonsCritical1()
559 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
560 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon2,6,6);
561 std::deque< double > expected_result;
563 expected_result.push_back(5./3);expected_result.push_back(1./3);
564 expected_result.push_back(1.);expected_result.push_back(-1.);
565 expected_result.push_back(-1.);expected_result.push_back(-1.);
566 expected_result.push_back(-1.5);expected_result.push_back(0.5);
567 expected_result.push_back(-1.);expected_result.push_back(1.);
568 expected_result.push_back(1.);expected_result.push_back(1.);
570 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (CONVEX)",
571 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
573 void SingleElementPlanarTests::hexagonsCritical1_Triangulation()
575 std::vector< double > actual_result;
576 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon2,6,6,actual_result,_Epsilon/_Precision, _Precision );
578 std::vector< double > expected_result;
580 expected_result.push_back(-1.);expected_result.push_back(1.);
581 expected_result.push_back(-1.5);expected_result.push_back(0.5);
582 expected_result.push_back(-8./7);expected_result.push_back(2./7);
583 expected_result.push_back(-1.4);expected_result.push_back(0.2);
584 expected_result.push_back(-4./3);expected_result.push_back(0.);
585 expected_result.push_back(-2./3);expected_result.push_back(0.);
586 expected_result.push_back(-1.25);expected_result.push_back(-0.25);
587 expected_result.push_back(-1.);expected_result.push_back(-1.);
588 expected_result.push_back(1.);expected_result.push_back(-1.);
589 expected_result.push_back(1.5);expected_result.push_back(0.);
590 expected_result.push_back(5./3);expected_result.push_back(1./3);
591 expected_result.push_back(1.125);expected_result.push_back(0.875);
592 expected_result.push_back(1.);expected_result.push_back(1.);
593 expected_result.push_back(0.25);expected_result.push_back(0.75);
595 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (TRIANGULATION)",
596 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
599 // Two tangent hexagons with double vertices and a critical starting vertex on edge
611 // \brief Status : pass
612 void SingleElementPlanarTests::hexagonsCritical2()
614 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
615 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon3,6,6);
616 std::deque< double > expected_result;
618 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (CONVEX)",
619 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
621 void SingleElementPlanarTests::hexagonsCritical2_Triangulation()
623 std::vector< double > actual_result;
624 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon3,6,6,actual_result,_Epsilon/_Precision, _Precision );
626 std::vector< double > expected_result;
627 expected_result.push_back(1.);expected_result.push_back(1.);
628 expected_result.push_back(-1.);expected_result.push_back(1.);
630 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (TRIANGULATION)",
631 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
634 // Square and quadrilateron with outer tangency
647 // \brief Status : pass
648 void SingleElementPlanarTests::squareAndQuadrangleCritical()
650 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
651 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square6,4,4);
652 std::deque< double > expected_result;
654 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)", (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
656 void SingleElementPlanarTests::squareAndQuadrangleCritical_Triangulation()
658 std::vector< double > actual_result;
659 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square6,4,4,actual_result,_Epsilon/_Precision, _Precision );
661 std::vector< double > expected_result;
662 expected_result.push_back(-1.);expected_result.push_back(1.);
663 expected_result.push_back(0.5);expected_result.push_back(1.);
665 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
666 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
668 // Two diamonds sharing a vertex in an exclusion configuration
687 // \brief Status : pass
688 void SingleElementPlanarTests:: diamondsSharingVertex2()
690 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
691 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange10,4,4);
692 std::deque< double > expected_result;
694 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (CONVEX)",
695 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
697 void SingleElementPlanarTests:: diamondsSharingVertex2_Triangulation()
699 std::vector< double > actual_result;
700 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange10,4,4,actual_result,_Epsilon/_Precision, _Precision );
702 std::vector< double > expected_result;
703 expected_result.push_back(0.);expected_result.push_back(-1.);
705 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (TRIANGULATION)",
706 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
709 // Triangle and diamond with a critical crossing at double starting vertex
720 // \brief Status : pass
721 void SingleElementPlanarTests:: triangleAndDiamondCritical()
723 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
724 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_triangle1,4,3);
725 std::deque< double > expected_result;
727 expected_result.push_back(2./3);expected_result.push_back(1./3);
728 expected_result.push_back(0.5);expected_result.push_back(0.);
729 expected_result.push_back(0.);expected_result.push_back(1.);
731 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (CONVEX)",
732 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
734 void SingleElementPlanarTests:: triangleAndDiamondCritical_Triangulation()
736 std::vector< double > actual_result;
737 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_triangle1,4,3,actual_result,_Epsilon/_Precision, _Precision );
739 std::vector< double > expected_result;
741 expected_result.push_back(2./3);expected_result.push_back(1./3);
742 expected_result.push_back(0.);expected_result.push_back(1.);
743 expected_result.push_back(0.5);expected_result.push_back(0.);
745 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (TRIANGULATION)",
746 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
749 // Basic triangle and square intersection (two distinct points)
762 // \brief Status : pass
763 void SingleElementPlanarTests::triangleAndSquareBasic()
765 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
766 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_triangle2,4,3);
767 std::deque< double > expected_result;
769 expected_result.push_back(1.);expected_result.push_back(1./6);
770 expected_result.push_back(1.);expected_result.push_back(-1./6);
771 expected_result.push_back(0.);expected_result.push_back(-0.5);
772 expected_result.push_back(0.);expected_result.push_back(0.5);
774 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
775 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
778 void SingleElementPlanarTests::triangleAndSquareBasic_Triangulation()
780 std::vector< double > actual_result;
781 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_triangle2,4,3,actual_result,_Epsilon/_Precision, _Precision );
783 std::vector< double > expected_result;
785 expected_result.push_back(1.);expected_result.push_back(1./6);
786 expected_result.push_back(0.375);expected_result.push_back(0.375);
787 expected_result.push_back(0.);expected_result.push_back(0.5);
788 expected_result.push_back(0.);expected_result.push_back(0.);
789 expected_result.push_back(0.);expected_result.push_back(-0.5);
790 expected_result.push_back(1.);expected_result.push_back(-1./6);
792 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
793 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
795 // Two triangles with a starting vertex on edge
802 // \brief Status : pass
803 void SingleElementPlanarTests::trianglesCritical()
805 INTERP_KERNEL::PolygonAlgorithms<3> intersector (_Epsilon, _Precision);;
806 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle3,_triangle4,3,3);
807 std::deque< double > expected_result;
809 expected_result.push_back(2./3);expected_result.push_back(2.);expected_result.push_back(1./3);
810 expected_result.push_back(0.5);expected_result.push_back(2.);expected_result.push_back(0.);
811 expected_result.push_back(0.75);expected_result.push_back(2.);expected_result.push_back(0.25);
813 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (CONVEX)",
814 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,3>(&actual_result, &expected_result, _Epsilon)));
816 void SingleElementPlanarTests::trianglesCritical_Triangulation()
818 std::vector< double > actual_result;
819 double _triangle3rotated[6],_triangle4rotated[6];
820 for (int i=0; i<3; i++)_triangle3rotated[2*i] = _triangle3[3*i];
821 for (int i=0; i<3; i++)_triangle3rotated[2*i+1] = _triangle3[3*i+2];
822 for (int i=0; i<3; i++)_triangle4rotated[2*i] = _triangle4[3*i];
823 for (int i=0; i<3; i++)_triangle4rotated[2*i+1] = _triangle4[3*i+2];
825 INTERP_KERNEL::intersec_de_polygone<2>(_triangle3rotated,_triangle4rotated,3,3,actual_result,_Epsilon/_Precision, _Precision );
827 std::vector< double > expected_result;
829 expected_result.push_back(0.5);expected_result.push_back(0.);
830 expected_result.push_back(2./3);expected_result.push_back(1./3);
831 expected_result.push_back(0.75);expected_result.push_back(0.25);
833 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (TRIANGULATION)",
834 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
837 // Two tangent paralellograms intersecting at 3 double vertices (one being a starting vertex)
845 // \brief Status : pass
846 void SingleElementPlanarTests::paralellogramsCritical1()
848 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
849 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel2,4,4);
850 std::deque< double > expected_result;
852 expected_result.push_back(0.);expected_result.push_back(0.);
853 expected_result.push_back(0.);expected_result.push_back(0.);
854 expected_result.push_back(-0.5);expected_result.push_back(1.);
855 expected_result.push_back(0.5);expected_result.push_back(1.);
857 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (CONVEX)",
858 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
860 void SingleElementPlanarTests::paralellogramsCritical1_Triangulation()
862 std::vector< double > actual_result;
863 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel2,4,4,actual_result,_Epsilon/_Precision, _Precision );
865 std::vector< double > expected_result;
867 expected_result.push_back(0.25);expected_result.push_back(0.5);
868 expected_result.push_back(0.5);expected_result.push_back(1.);
869 expected_result.push_back(0.);expected_result.push_back(2./3);
870 expected_result.push_back(-0.5);expected_result.push_back(1.);
871 expected_result.push_back(-0.25);expected_result.push_back(0.5);
872 expected_result.push_back(0.);expected_result.push_back(0.);
874 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (TRIANGULATION)",
875 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
878 // Two paralellograms sharing a vertex in an exclusion configuration
890 // \brief Status : pass
891 void SingleElementPlanarTests::paralellogramsCritical2()
893 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
894 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel3,4,4);
895 std::deque< double > expected_result;
897 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (CONVEX)",
898 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
900 void SingleElementPlanarTests::paralellogramsCritical2_Triangulation()
902 std::vector< double > actual_result;
903 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel3,4,4,actual_result,_Epsilon/_Precision, _Precision );
905 std::vector< double > expected_result;
907 expected_result.push_back(0.);expected_result.push_back(0.);
909 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (TRIANGULATION)",
910 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
913 // Two triangles in a tangency configuration with a starting vertex on edge
925 // \brief Status : pass
926 void SingleElementPlanarTests::trianglesTangencyCritical()
928 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
929 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle5,_triangle6,3,3);
930 std::deque< double > expected_result;
932 expected_result.push_back(1./3);expected_result.push_back(1./2);
933 expected_result.push_back(1./3);expected_result.push_back(1./3);
934 expected_result.push_back(1./2);expected_result.push_back(1./2);
936 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (CONVEX)",
937 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
939 void SingleElementPlanarTests::trianglesTangencyCritical_Triangulation()
941 std::vector< double > actual_result;
942 INTERP_KERNEL::intersec_de_polygone<2>(_triangle5,_triangle6,3,3,actual_result,_Epsilon/_Precision, _Precision );
944 std::vector< double > expected_result;
946 expected_result.push_back(1./3);expected_result.push_back(1./2);
947 expected_result.push_back(1./2);expected_result.push_back(1./2);
948 expected_result.push_back(1./3);expected_result.push_back(1./3);
950 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (TRIANGULATION)",
951 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
954 // Two triangles with double starting point in an outer tangency configuration
965 // \brief Status : pass
966 void SingleElementPlanarTests::trianglesTangencyCritical2()
968 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
969 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle1,_triangle7,3,3);
970 std::deque< double > expected_result;
972 // if(!checkDequesEqual(actual_result,expected_result, _Epsilon))
974 // std::cerr<< "CPP_UNIT expected result= " << std::endl;
975 // dequePrintOut(expected_result);
976 // std::cerr<< "CPP_UNIT actual result= " << std::endl;
977 // dequePrintOut(actual_result);
980 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (CONVEX)",
981 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
983 void SingleElementPlanarTests::trianglesTangencyCritical2_Triangulation()
985 std::vector< double > actual_result;
986 INTERP_KERNEL::intersec_de_polygone<2>(_triangle1,_triangle7,3,3,actual_result,_Epsilon/_Precision, _Precision );
988 std::vector< double > expected_result;
989 expected_result.push_back(1.);expected_result.push_back(1.);
990 expected_result.push_back(0.);expected_result.push_back(1.);
992 // if(!checkVectorsEqual(actual_result,expected_result, _Epsilon))
994 // cerr<< "CPP_UNIT expected result= " << endl;
995 // vectPrintOut(expected_result);
996 // cerr<< "CPP_UNIT actual result= " << endl;
997 // vectPrintOut(actual_result);
1000 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (TRIANGULATION)",
1001 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1003 // \brief Status : pass
1004 void SingleElementPlanarTests::trianglesTangencyCritical3()
1006 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1007 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle8,_triangle9,3,3);
1008 std::deque< double > expected_result;
1010 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (CONVEX)",
1011 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1013 void SingleElementPlanarTests::trianglesTangencyCritical3_Triangulation()
1015 std::vector< double > actual_result;
1016 INTERP_KERNEL::intersec_de_polygone<2>(_triangle8,_triangle9,3,3,actual_result,_Epsilon/_Precision, _Precision );
1018 std::vector< double > expected_result;
1019 expected_result.push_back(22.4601);expected_result.push_back(35.2129);
1020 expected_result.push_back(13.9921);expected_result.push_back(34.693);
1022 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (TRIANGULATION)",
1023 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1025 void SingleElementPlanarTests::trianglesTangencyCritical4()
1027 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1028 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle10,_triangle11,3,3);
1030 std::deque< double > expected_result;
1031 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1032 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1033 expected_result.push_back(80);expected_result.push_back(100.);
1036 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (CONVEX)",
1037 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1039 void SingleElementPlanarTests::trianglesTangencyCritical4_Triangulation()
1041 std::vector< double > actual_result;
1042 INTERP_KERNEL::intersec_de_polygone<2>(_triangle10,_triangle11,3,3,actual_result,_Epsilon/_Precision, _Precision );
1044 std::vector< double > expected_result;
1045 expected_result.push_back(80);expected_result.push_back(100.);
1046 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1047 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1049 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (TRIANGULATION)",
1050 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));