1 // Copyright (C) 2007-2012 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
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);;
233 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square1,4,4);
234 std::deque< double > expected_result;
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.);
239 expected_result.push_back(1.);expected_result.push_back(1.);
241 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
242 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
244 void SingleElementPlanarTests::identicalSquares_Triangulation()
246 std::vector< double > actual_result;
247 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square1,4,4,actual_result,_Epsilon/_Precision, _Precision );
249 std::vector< double > expected_result;
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.);
254 expected_result.push_back(1.);expected_result.push_back(-1.);
256 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
257 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
259 // Square and diamond intersecting with no degeneracy
276 // \brief Status : pass
277 void SingleElementPlanarTests::squareAndDiamondBasic()
279 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
280 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange5,4,4);
281 std::deque< double > expected_result;
283 expected_result.push_back(1.);expected_result.push_back(0.5);
284 expected_result.push_back(0.5);expected_result.push_back(1.);
285 expected_result.push_back(-0.5);expected_result.push_back(1.);
286 expected_result.push_back(-1.);expected_result.push_back(0.5);
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);
292 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (CONVEX)",
293 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
295 void SingleElementPlanarTests::squareAndDiamondBasic_Triangulation()
297 std::vector< double > actual_result;
298 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange5,4,4,actual_result,_Epsilon/_Precision, _Precision );
300 std::vector< double > expected_result;
302 expected_result.push_back(1.);expected_result.push_back(0.);
303 expected_result.push_back(1.);expected_result.push_back(0.5);
304 expected_result.push_back(0.75);expected_result.push_back(0.75);
305 expected_result.push_back(0.5);expected_result.push_back(1.);
306 expected_result.push_back(0.);expected_result.push_back(0.);
307 expected_result.push_back(-0.5);expected_result.push_back(1.);
308 expected_result.push_back(-1.);expected_result.push_back(0.5);
309 expected_result.push_back(-1.);expected_result.push_back(0.);
310 expected_result.push_back(-1.);expected_result.push_back(-0.5);
311 expected_result.push_back(-0.75);expected_result.push_back(-0.75);
312 expected_result.push_back(-0.5);expected_result.push_back(-1.);
313 expected_result.push_back(0.5);expected_result.push_back(-1.);
314 expected_result.push_back(1.);expected_result.push_back(-0.5);
317 // EAP: different place of (0,0) point on 32 and 64-bits platforms
318 // we comment it for the sake of "make check" to pass
319 //CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION), maybe not significant (0,0) should be removed",
320 //(INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
322 // square and diamond intersecting at four degenerated pointss
330 // \brief Status : pass
332 void SingleElementPlanarTests::squareAndDiamondCritical()
334 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
335 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange1,4,4);
336 std::deque< double > expected_result;
338 expected_result.push_back(0.);expected_result.push_back(-1.);
339 expected_result.push_back(-1.);expected_result.push_back(0.);
340 expected_result.push_back(0.);expected_result.push_back(1.);
341 expected_result.push_back(1.);expected_result.push_back(0.);
343 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
344 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
346 void SingleElementPlanarTests::squareAndDiamondCritical_Triangulation()
348 std::vector< double > actual_result;
349 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange1,4,4,actual_result,_Epsilon/_Precision, _Precision );
351 std::vector< double > expected_result;
353 expected_result.push_back(0.5);expected_result.push_back(0.5);
354 expected_result.push_back(0.);expected_result.push_back(1.);
355 expected_result.push_back(0);expected_result.push_back(0);
356 expected_result.push_back(-1.);expected_result.push_back(0.);
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(1.);expected_result.push_back(0.);
361 // 0020208: Unit Test of MED failed
362 // CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION) maybe not significant (0,0) should be removed",
363 // (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
365 // Two diamonds intersecting at one vertex on edge and one double vertex
376 // \brief Status : pass
377 void SingleElementPlanarTests::diamondsCritical()
380 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
381 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange6,_losange7,6,5);
382 std::deque< double > expected_result;
384 expected_result.push_back(0.5);expected_result.push_back(-0.5);
385 expected_result.push_back(0.5);expected_result.push_back(-0.5);
386 expected_result.push_back(0);expected_result.push_back(0);
387 expected_result.push_back(0.5);expected_result.push_back(0.5);
388 expected_result.push_back(0.5);expected_result.push_back(0.5);
389 expected_result.push_back(1);expected_result.push_back(0);
391 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
392 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
394 void SingleElementPlanarTests::diamondsCritical_Triangulation()
396 std::vector< double > actual_result;
397 INTERP_KERNEL::intersec_de_polygone<2>(_losange6,_losange7,6,5,actual_result,_Epsilon/_Precision, _Precision );
399 std::vector< double > expected_result;
401 expected_result.push_back(1);expected_result.push_back(0);
402 expected_result.push_back(0.5);expected_result.push_back(0.5);
403 expected_result.push_back(0);expected_result.push_back(0);
404 expected_result.push_back(0.5);expected_result.push_back(-0.5);
406 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
407 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
410 // Two tangent squares with starting and ending vertices on edges
411 // _____ ___.___ ______
417 // |_____|_______|______|
419 // \brief Status : pass
420 void SingleElementPlanarTests::quadranglesCritical()
422 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
423 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square4,_square3,4,5);
424 std::deque< double > expected_result;
426 expected_result.push_back(-0.5);expected_result.push_back(1.);
427 expected_result.push_back(-0.5);expected_result.push_back(-1.);
428 expected_result.push_back(1.);expected_result.push_back(-1.);
429 expected_result.push_back(1.);expected_result.push_back(1.);
431 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (CONVEX)",
432 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
434 void SingleElementPlanarTests::quadranglesCritical_Triangulation()
436 std::vector< double > actual_result;
437 INTERP_KERNEL::intersec_de_polygone<2>(_square4,_square3,4,5,actual_result,_Epsilon/_Precision, _Precision );
439 std::vector< double > expected_result;
441 expected_result.push_back(1.);expected_result.push_back(-1.);
442 expected_result.push_back(1.);expected_result.push_back(0.5);
443 expected_result.push_back(1.);expected_result.push_back(1.);
444 expected_result.push_back(0.5);expected_result.push_back(1.);
445 expected_result.push_back(-0.5);expected_result.push_back(1.);
446 expected_result.push_back(-0.5);expected_result.push_back(-1./3);
447 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
448 expected_result.push_back(-0.5);expected_result.push_back(-1.);
450 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (TRIANGULATION)",
451 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
455 // square and diamond crossing and tangency at double vertices, starting vertex on edge
465 // \brief Status : pass
466 void SingleElementPlanarTests::quadrangleAndDiamondCritical()
468 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
469 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square5,_losange8,5,4);
470 std::deque< double > expected_result;
472 expected_result.push_back(0.);expected_result.push_back(1.);
473 expected_result.push_back(-0.5);expected_result.push_back(-1.);
474 expected_result.push_back(1.);expected_result.push_back(-1.);
475 expected_result.push_back(1.);expected_result.push_back(-1.);
477 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
478 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
480 void SingleElementPlanarTests::quadrangleAndDiamondCritical_Triangulation()
482 std::vector< double > actual_result;
483 INTERP_KERNEL::intersec_de_polygone<2>(_square5,_losange8,5,4,actual_result,_Epsilon/_Precision, _Precision );
485 std::vector< double > expected_result;
487 expected_result.push_back(1.);expected_result.push_back(-1.);
488 expected_result.push_back(1./3);expected_result.push_back(1./3);
489 expected_result.push_back(0.);expected_result.push_back(1.);
490 expected_result.push_back(0.);expected_result.push_back(0.);
491 expected_result.push_back(-1./3);expected_result.push_back(-1./3);
492 expected_result.push_back(-0.5);expected_result.push_back(-1.);
493 expected_result.push_back(0.);expected_result.push_back(-1.);
495 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (TRIANGULATION)",
496 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
497 } // square and diamond intersecting at four degenerated pointss
505 // \brief Status : pass
507 void SingleElementPlanarTests::diamondsCritical2()
509 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
510 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange9,4,4);
511 std::deque< double > expected_result;
513 expected_result.push_back(0.);expected_result.push_back(-1.);
514 expected_result.push_back(0.);expected_result.push_back(-1.);
515 expected_result.push_back(-1.);expected_result.push_back(0.);
516 expected_result.push_back(0.);expected_result.push_back(1.);
517 expected_result.push_back(0.);expected_result.push_back(1.);
518 expected_result.push_back(0.5);expected_result.push_back(0.);
520 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (CONVEX)",
521 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
523 void SingleElementPlanarTests::diamondsCritical2_Triangulation()
525 std::vector< double > actual_result;
526 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange9,4,4,actual_result,_Epsilon/_Precision, _Precision );
528 std::vector< double > expected_result;
530 expected_result.push_back(0.);expected_result.push_back(-1.);
531 expected_result.push_back(0.5);expected_result.push_back(0.);
532 expected_result.push_back(0.);expected_result.push_back(1.);
533 expected_result.push_back(-1.);expected_result.push_back(0.);
535 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (TRIANGULATION)",
536 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
539 // Two tangent hexagons with double vertices and a critical starting vertex on edge
551 // \brief Status : pass
552 void SingleElementPlanarTests::hexagonsCritical1()
555 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
556 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon2,6,6);
557 std::deque< double > expected_result;
559 expected_result.push_back(5./3);expected_result.push_back(1./3);
560 expected_result.push_back(1.);expected_result.push_back(-1.);
561 expected_result.push_back(-1.);expected_result.push_back(-1.);
562 expected_result.push_back(-1.5);expected_result.push_back(0.5);
563 expected_result.push_back(-1.);expected_result.push_back(1.);
564 expected_result.push_back(1.);expected_result.push_back(1.);
566 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (CONVEX)",
567 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
569 void SingleElementPlanarTests::hexagonsCritical1_Triangulation()
571 std::vector< double > actual_result;
572 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon2,6,6,actual_result,_Epsilon/_Precision, _Precision );
574 std::vector< double > expected_result;
576 expected_result.push_back(-1.);expected_result.push_back(1.);
577 expected_result.push_back(-1.5);expected_result.push_back(0.5);
578 expected_result.push_back(-8./7);expected_result.push_back(2./7);
579 expected_result.push_back(-1.4);expected_result.push_back(0.2);
580 expected_result.push_back(-4./3);expected_result.push_back(0.);
581 expected_result.push_back(-2./3);expected_result.push_back(0.);
582 expected_result.push_back(-1.25);expected_result.push_back(-0.25);
583 expected_result.push_back(-1.);expected_result.push_back(-1.);
584 expected_result.push_back(1.);expected_result.push_back(-1.);
585 expected_result.push_back(1.5);expected_result.push_back(0.);
586 expected_result.push_back(5./3);expected_result.push_back(1./3);
587 expected_result.push_back(1.125);expected_result.push_back(0.875);
588 expected_result.push_back(1.);expected_result.push_back(1.);
589 expected_result.push_back(0.25);expected_result.push_back(0.75);
591 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (TRIANGULATION)",
592 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
595 // Two tangent hexagons with double vertices and a critical starting vertex on edge
607 // \brief Status : pass
608 void SingleElementPlanarTests::hexagonsCritical2()
610 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
611 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon3,6,6);
612 std::deque< double > expected_result;
614 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (CONVEX)",
615 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
617 void SingleElementPlanarTests::hexagonsCritical2_Triangulation()
619 std::vector< double > actual_result;
620 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon3,6,6,actual_result,_Epsilon/_Precision, _Precision );
622 std::vector< double > expected_result;
623 expected_result.push_back(1.);expected_result.push_back(1.);
624 expected_result.push_back(-1.);expected_result.push_back(1.);
626 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (TRIANGULATION)",
627 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
630 // Square and quadrilateron with outer tangency
643 // \brief Status : pass
644 void SingleElementPlanarTests::squareAndQuadrangleCritical()
646 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
647 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square6,4,4);
648 std::deque< double > expected_result;
650 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)", (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
652 void SingleElementPlanarTests::squareAndQuadrangleCritical_Triangulation()
654 std::vector< double > actual_result;
655 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square6,4,4,actual_result,_Epsilon/_Precision, _Precision );
657 std::vector< double > expected_result;
658 expected_result.push_back(-1.);expected_result.push_back(1.);
659 expected_result.push_back(0.5);expected_result.push_back(1.);
661 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
662 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
664 // Two diamonds sharing a vertex in an exclusion configuration
683 // \brief Status : pass
684 void SingleElementPlanarTests:: diamondsSharingVertex2()
686 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
687 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange10,4,4);
688 std::deque< double > expected_result;
690 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (CONVEX)",
691 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
693 void SingleElementPlanarTests:: diamondsSharingVertex2_Triangulation()
695 std::vector< double > actual_result;
696 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange10,4,4,actual_result,_Epsilon/_Precision, _Precision );
698 std::vector< double > expected_result;
699 expected_result.push_back(0.);expected_result.push_back(-1.);
701 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (TRIANGULATION)",
702 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
705 // Triangle and diamond with a critical crossing at double starting vertex
716 // \brief Status : pass
717 void SingleElementPlanarTests:: triangleAndDiamondCritical()
719 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
720 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_triangle1,4,3);
721 std::deque< double > expected_result;
723 expected_result.push_back(2./3);expected_result.push_back(1./3);
724 expected_result.push_back(0.5);expected_result.push_back(0.);
725 expected_result.push_back(0.);expected_result.push_back(1.);
727 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (CONVEX)",
728 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
730 void SingleElementPlanarTests:: triangleAndDiamondCritical_Triangulation()
732 std::vector< double > actual_result;
733 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_triangle1,4,3,actual_result,_Epsilon/_Precision, _Precision );
735 std::vector< double > expected_result;
737 expected_result.push_back(2./3);expected_result.push_back(1./3);
738 expected_result.push_back(0.);expected_result.push_back(1.);
739 expected_result.push_back(0.5);expected_result.push_back(0.);
741 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (TRIANGULATION)",
742 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
745 // Basic triangle and square intersection (two distinct points)
758 // \brief Status : pass
759 void SingleElementPlanarTests::triangleAndSquareBasic()
761 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
762 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_triangle2,4,3);
763 std::deque< double > expected_result;
765 expected_result.push_back(1.);expected_result.push_back(1./6);
766 expected_result.push_back(1.);expected_result.push_back(-1./6);
767 expected_result.push_back(0.);expected_result.push_back(-0.5);
768 expected_result.push_back(0.);expected_result.push_back(0.5);
770 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
771 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
774 void SingleElementPlanarTests::triangleAndSquareBasic_Triangulation()
776 std::vector< double > actual_result;
777 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_triangle2,4,3,actual_result,_Epsilon/_Precision, _Precision );
779 std::vector< double > expected_result;
781 expected_result.push_back(1.);expected_result.push_back(1./6);
782 expected_result.push_back(0.375);expected_result.push_back(0.375);
783 expected_result.push_back(0.);expected_result.push_back(0.5);
784 expected_result.push_back(0.);expected_result.push_back(0.);
785 expected_result.push_back(0.);expected_result.push_back(-0.5);
786 expected_result.push_back(1.);expected_result.push_back(-1./6);
788 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
789 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
791 // Two triangles with a starting vertex on edge
798 // \brief Status : pass
799 void SingleElementPlanarTests::trianglesCritical()
801 INTERP_KERNEL::PolygonAlgorithms<3> intersector (_Epsilon, _Precision);;
802 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle3,_triangle4,3,3);
803 std::deque< double > expected_result;
805 expected_result.push_back(2./3);expected_result.push_back(2.);expected_result.push_back(1./3);
806 expected_result.push_back(0.5);expected_result.push_back(2.);expected_result.push_back(0.);
807 expected_result.push_back(0.75);expected_result.push_back(2.);expected_result.push_back(0.25);
809 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (CONVEX)",
810 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,3>(&actual_result, &expected_result, _Epsilon)));
812 void SingleElementPlanarTests::trianglesCritical_Triangulation()
814 std::vector< double > actual_result;
815 double _triangle3rotated[6],_triangle4rotated[6];
816 for (int i=0; i<3; i++)_triangle3rotated[2*i] = _triangle3[3*i];
817 for (int i=0; i<3; i++)_triangle3rotated[2*i+1] = _triangle3[3*i+2];
818 for (int i=0; i<3; i++)_triangle4rotated[2*i] = _triangle4[3*i];
819 for (int i=0; i<3; i++)_triangle4rotated[2*i+1] = _triangle4[3*i+2];
821 INTERP_KERNEL::intersec_de_polygone<2>(_triangle3rotated,_triangle4rotated,3,3,actual_result,_Epsilon/_Precision, _Precision );
823 std::vector< double > expected_result;
825 expected_result.push_back(0.5);expected_result.push_back(0.);
826 expected_result.push_back(2./3);expected_result.push_back(1./3);
827 expected_result.push_back(0.75);expected_result.push_back(0.25);
829 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (TRIANGULATION)",
830 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
833 // Two tangent paralellograms intersecting at 3 double vertices (one being a starting vertex)
841 // \brief Status : pass
842 void SingleElementPlanarTests::paralellogramsCritical1()
844 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
845 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel2,4,4);
846 std::deque< double > expected_result;
848 expected_result.push_back(0.);expected_result.push_back(0.);
849 expected_result.push_back(0.);expected_result.push_back(0.);
850 expected_result.push_back(-0.5);expected_result.push_back(1.);
851 expected_result.push_back(0.5);expected_result.push_back(1.);
853 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (CONVEX)",
854 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
856 void SingleElementPlanarTests::paralellogramsCritical1_Triangulation()
858 std::vector< double > actual_result;
859 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel2,4,4,actual_result,_Epsilon/_Precision, _Precision );
861 std::vector< double > expected_result;
863 expected_result.push_back(0.25);expected_result.push_back(0.5);
864 expected_result.push_back(0.5);expected_result.push_back(1.);
865 expected_result.push_back(0.);expected_result.push_back(2./3);
866 expected_result.push_back(-0.5);expected_result.push_back(1.);
867 expected_result.push_back(-0.25);expected_result.push_back(0.5);
868 expected_result.push_back(0.);expected_result.push_back(0.);
870 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (TRIANGULATION)",
871 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
874 // Two paralellograms sharing a vertex in an exclusion configuration
886 // \brief Status : pass
887 void SingleElementPlanarTests::paralellogramsCritical2()
889 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
890 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel3,4,4);
891 std::deque< double > expected_result;
893 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (CONVEX)",
894 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
896 void SingleElementPlanarTests::paralellogramsCritical2_Triangulation()
898 std::vector< double > actual_result;
899 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel3,4,4,actual_result,_Epsilon/_Precision, _Precision );
901 std::vector< double > expected_result;
903 expected_result.push_back(0.);expected_result.push_back(0.);
905 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (TRIANGULATION)",
906 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
909 // Two triangles in a tangency configuration with a starting vertex on edge
921 // \brief Status : pass
922 void SingleElementPlanarTests::trianglesTangencyCritical()
924 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
925 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle5,_triangle6,3,3);
926 std::deque< double > expected_result;
928 expected_result.push_back(1./3);expected_result.push_back(1./2);
929 expected_result.push_back(1./3);expected_result.push_back(1./3);
930 expected_result.push_back(1./2);expected_result.push_back(1./2);
932 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (CONVEX)",
933 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
935 void SingleElementPlanarTests::trianglesTangencyCritical_Triangulation()
937 std::vector< double > actual_result;
938 INTERP_KERNEL::intersec_de_polygone<2>(_triangle5,_triangle6,3,3,actual_result,_Epsilon/_Precision, _Precision );
940 std::vector< double > expected_result;
942 expected_result.push_back(1./3);expected_result.push_back(1./2);
943 expected_result.push_back(1./2);expected_result.push_back(1./2);
944 expected_result.push_back(1./3);expected_result.push_back(1./3);
946 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (TRIANGULATION)",
947 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
950 // Two triangles with double starting point in an outer tangency configuration
961 // \brief Status : pass
962 void SingleElementPlanarTests::trianglesTangencyCritical2()
964 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
965 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle1,_triangle7,3,3);
966 std::deque< double > expected_result;
968 // if(!checkDequesEqual(actual_result,expected_result, _Epsilon))
970 // std::cerr<< "CPP_UNIT expected result= " << std::endl;
971 // dequePrintOut(expected_result);
972 // std::cerr<< "CPP_UNIT actual result= " << std::endl;
973 // dequePrintOut(actual_result);
976 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (CONVEX)",
977 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
979 void SingleElementPlanarTests::trianglesTangencyCritical2_Triangulation()
981 std::vector< double > actual_result;
982 INTERP_KERNEL::intersec_de_polygone<2>(_triangle1,_triangle7,3,3,actual_result,_Epsilon/_Precision, _Precision );
984 std::vector< double > expected_result;
985 expected_result.push_back(1.);expected_result.push_back(1.);
986 expected_result.push_back(0.);expected_result.push_back(1.);
988 // if(!checkVectorsEqual(actual_result,expected_result, _Epsilon))
990 // cerr<< "CPP_UNIT expected result= " << endl;
991 // vectPrintOut(expected_result);
992 // cerr<< "CPP_UNIT actual result= " << endl;
993 // vectPrintOut(actual_result);
996 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (TRIANGULATION)",
997 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
999 // \brief Status : pass
1000 void SingleElementPlanarTests::trianglesTangencyCritical3()
1002 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1003 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle8,_triangle9,3,3);
1004 std::deque< double > expected_result;
1006 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (CONVEX)",
1007 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1009 void SingleElementPlanarTests::trianglesTangencyCritical3_Triangulation()
1011 std::vector< double > actual_result;
1012 INTERP_KERNEL::intersec_de_polygone<2>(_triangle8,_triangle9,3,3,actual_result,_Epsilon/_Precision, _Precision );
1014 std::vector< double > expected_result;
1015 expected_result.push_back(22.4601);expected_result.push_back(35.2129);
1016 expected_result.push_back(13.9921);expected_result.push_back(34.693);
1018 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (TRIANGULATION)",
1019 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1021 void SingleElementPlanarTests::trianglesTangencyCritical4()
1023 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1024 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle10,_triangle11,3,3);
1026 std::deque< double > expected_result;
1027 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1028 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1029 expected_result.push_back(80);expected_result.push_back(100.);
1032 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (CONVEX)",
1033 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1035 void SingleElementPlanarTests::trianglesTangencyCritical4_Triangulation()
1037 std::vector< double > actual_result;
1038 INTERP_KERNEL::intersec_de_polygone<2>(_triangle10,_triangle11,3,3,actual_result,_Epsilon/_Precision, _Precision );
1040 std::vector< double > expected_result;
1041 expected_result.push_back(80);expected_result.push_back(100.);
1042 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1043 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1045 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (TRIANGULATION)",
1046 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));