1 // Copyright (C) 2007-2020 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 _losange1[8] = { 1,0, 0,1, -1,0, 0,-1 };
32 const double _losange2[8] = { 2,0, 1,1, 0,0, 1,-1 };
33 const double _losange3[8] = {2.5,0.5,1.5,1.5,0.5,0.5,1.5,-0.5 };
34 const double _square1[8] = { -1,-1, -1,1, 1,1, 1,-1};
35 const double _square2[8] = {1,-0.25,0,-0.25,0,0.25,1,0.25 };
36 const double _losange4[8] = { 3,0, 2,1, 1,0, 2,-1 };
37 const double _losange5[8] = { 1.5,0, 0,1.5,-1.5,0, 0,-1.5 };
38 const double _losange6[12]= { 2,0, 1,1, 0.5,0.5,0,0, 0.5,-0.5, 1,-1 };
39 const double _losange7[10]= { 1,0, 0,1, -1,0, 0,-1, 0.5,-0.5 };
40 const double _square3[10] = { -1,-1, -1,1, 0.5,1, 1,1, 1,-1, };
41 const double _square4[8] = {-0.5,-1,-0.5,1,1.5,1,1.5,-1 };
42 const double _square5[10] = { -1,-1, -1,1, 0,1, 1,1, 1,-1 };
43 const double _losange8[8] = { 0,1, 1,-1, 0,-1.5,-0.5,-1 };
44 const double _losange9[8] = {0.5,0, 0,1, -1.5,0, 0,-1 };
45 const double _hexagon1[12]= { -2,0, -1,-1, 1,-1, 2,0, 1,1, -1,1 };
46 const double _hexagon2[12]= {-1.5,0.5,-1,-1, 1,-1, 2,1, 1,1, -1,1 };
47 const double _hexagon3[12]= { -2,2, -1,1, 1,1, 2,2, 1,3, -1,3 };
48 const double _square6[8] = { -1,1, -1,3, 0.5,3,0.5,1 };
49 const double _losange10[8]= { 0,-1, 1,-2, 0,-3, -1,-2 };
50 const double _triangle1[6]= {0.5,0, 1,1, 0,1 };
51 const double _triangle2[6]= { 0,0.5, 0,-0.5,1.5,0 };
52 const double _triangle3[9]= {-1,2,0, 1,2,0, 0,2,1 };
53 const double _triangle4[9]= {1./2,2,0, 1, 2, 1, 1, 2, 0.5 };
54 const double _parallel1[8] = {-1,0, -0.5,1, 0.5,1, 0,0};
55 const double _parallel2[8]= {-0.5,1, 0,0, 1.,0, 0.5,1 };
56 const double _parallel3[8]= {-0.5,-1, 0,0, 1,0, 0.5,-1};
57 const double _triangle5[6]= { 0,0, 0,0.5, 0.5,0.5 };
58 const double _triangle6[6]= { 1./3,1./3, 1./3,2./3, 2./3,2./3 };
59 const double _triangle7[6]= {0.5,2, 1,1, 0,1 };
60 const double _triangle8[6]= {22.4601,35.2129, 13.9921,34.693, 18.2853,26.2812 };
61 const double _triangle9[6]= {13.9921,34.693, 22.4601,35.2129, 18.2785,42.3869 };
62 const double _triangle10[6]= {84.8575,98.2042, 80,100, 82.2601,95.7202};
63 const double _triangle11[6]= {80,100, 76.6659,91.9804, 85.3912,92.5061 };
65 // Two diamonds intersecting without degeneracy (two distinct crossing points)
76 // \brief Status : pass
77 void SingleElementPlanarTests::diamondsBasic()
79 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
80 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange2,4,4);
81 std::deque< double > expected_result;
83 expected_result.push_back(0.5);expected_result.push_back(-0.5);
84 expected_result.push_back(0);expected_result.push_back(0);
85 expected_result.push_back(0.5);expected_result.push_back(0.5);
86 expected_result.push_back(1);expected_result.push_back(0);
88 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
89 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
92 void SingleElementPlanarTests::diamondsBasic_Triangulation()
94 std::vector< double > actual_result;
95 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange2,4,4,actual_result,_Epsilon/_Precision, _Precision );
97 std::vector< double > expected_result;
98 expected_result.push_back(1);expected_result.push_back(0);
99 expected_result.push_back(0.5);expected_result.push_back(0.5);
100 expected_result.push_back(0);expected_result.push_back(0);
101 expected_result.push_back(0.5);expected_result.push_back(-0.5);
103 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
104 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
108 // Two diamonds with overlapping edges in an exclusion configuration
119 // \brief Status : pass
120 void SingleElementPlanarTests::tangentDiamonds()
122 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
123 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange3,4,4);
124 std::deque< double > expected_result;
126 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (CONVEX)",
127 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
129 void SingleElementPlanarTests::tangentDiamonds_Triangulation()
131 std::vector< double > actual_result;
132 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange3,4,4,actual_result,_Epsilon/_Precision, _Precision );
134 std::vector< double > expected_result;
135 expected_result.push_back(0.5);expected_result.push_back(0.5);
136 expected_result.push_back(1);expected_result.push_back(0);
138 CPPUNIT_ASSERT_MESSAGE("Diamond exclusion tangency test failed (TRIANGULATION)",
139 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
142 // Two tangent squares with overlapping edges, in an inclusion configuration
151 // \brief Status : pass
152 void SingleElementPlanarTests::tangentSquares()
154 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
155 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square2,4,4);
156 std::deque< double > expected_result;
158 expected_result.push_back(0.);expected_result.push_back(0.25);
159 expected_result.push_back(0.);expected_result.push_back(-0.25);
160 expected_result.push_back(1.);expected_result.push_back(-0.25);
161 expected_result.push_back(1.);expected_result.push_back(0.25);
163 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (CONVEX)",
164 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
166 void SingleElementPlanarTests::tangentSquares_Triangulation()
168 std::vector< double > actual_result;
169 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square2,4,4,actual_result,_Epsilon/_Precision, _Precision );
171 std::vector< double > expected_result;
173 expected_result.push_back(1.);expected_result.push_back(0.25);
174 expected_result.push_back(0.25);expected_result.push_back(0.25);
175 expected_result.push_back(1./6);expected_result.push_back(1./6);
176 expected_result.push_back(0.);expected_result.push_back(0.25);
177 expected_result.push_back(0.);expected_result.push_back(0.);
178 expected_result.push_back(0.);expected_result.push_back(-0.25);
179 expected_result.push_back(1.);expected_result.push_back(-0.25);
181 CPPUNIT_ASSERT_MESSAGE("Squares inclusion tangency test failed (TRIANGULATION)",
182 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
185 // Two diamonds sharing a vertex in an exclusion configuration
196 // \brief Status : pass
197 void SingleElementPlanarTests::diamondsSharingVertex1()
199 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
200 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange4,4,4);
201 std::deque< double > expected_result;
203 CPPUNIT_ASSERT_MESSAGE("Diamond sharing (1) vertex test failed (CONVEX)",
204 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
206 void SingleElementPlanarTests::diamondsSharingVertex1_Triangulation()
208 std::vector< double > actual_result;
209 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange4,4,4,actual_result,_Epsilon/_Precision, _Precision );
211 std::vector< double > expected_result;
212 expected_result.push_back(1.);expected_result.push_back(0.);
214 CPPUNIT_ASSERT_MESSAGE("Diamonds sharing (1) vertex test failed (TRIANGULATION)",
215 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
218 // Two identical squares
227 // \brief Status : pass
228 void SingleElementPlanarTests::identicalSquares()
230 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
232 ////////////////// TEST DEACTIVATED by A. GEAY because memory fault :
233 // conditional jump INTERP_KERNEL::PolygonAlgorithms<2>::intersectConvexPolygons(double const*, double const*, int, int) (PolygonAlgorithms.txx:629)
234 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square1,4,4);
235 std::deque< double > expected_result;
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.);
240 expected_result.push_back(1.);expected_result.push_back(1.);
242 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
243 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
246 void SingleElementPlanarTests::identicalSquares_Triangulation()
248 std::vector< double > actual_result;
249 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square1,4,4,actual_result,_Epsilon/_Precision, _Precision );
251 std::vector< double > expected_result;
253 expected_result.push_back(1.);expected_result.push_back(1.);
254 expected_result.push_back(-1.);expected_result.push_back(1.);
255 expected_result.push_back(-1.);expected_result.push_back(-1.);
256 expected_result.push_back(1.);expected_result.push_back(-1.);
258 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
259 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
261 // Square and diamond intersecting with no degeneracy
278 // \brief Status : pass
279 void SingleElementPlanarTests::squareAndDiamondBasic()
281 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
282 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange5,4,4);
283 std::deque< double > expected_result;
285 expected_result.push_back(1.);expected_result.push_back(0.5);
286 expected_result.push_back(0.5);expected_result.push_back(1.);
287 expected_result.push_back(-0.5);expected_result.push_back(1.);
288 expected_result.push_back(-1.);expected_result.push_back(0.5);
289 expected_result.push_back(-1.);expected_result.push_back(-0.5);
290 expected_result.push_back(-0.5);expected_result.push_back(-1.);
291 expected_result.push_back(0.5);expected_result.push_back(-1.);
292 expected_result.push_back(1.);expected_result.push_back(-0.5);
294 CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (CONVEX)",
295 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
297 void SingleElementPlanarTests::squareAndDiamondBasic_Triangulation()
299 std::vector< double > actual_result;
300 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange5,4,4,actual_result,_Epsilon/_Precision, _Precision );
302 std::vector< double > expected_result;
304 expected_result.push_back(1.);expected_result.push_back(0.);
305 expected_result.push_back(1.);expected_result.push_back(0.5);
306 expected_result.push_back(0.75);expected_result.push_back(0.75);
307 expected_result.push_back(0.5);expected_result.push_back(1.);
308 expected_result.push_back(0.);expected_result.push_back(0.);
309 expected_result.push_back(-0.5);expected_result.push_back(1.);
310 expected_result.push_back(-1.);expected_result.push_back(0.5);
311 expected_result.push_back(-1.);expected_result.push_back(0.);
312 expected_result.push_back(-1.);expected_result.push_back(-0.5);
313 expected_result.push_back(-0.75);expected_result.push_back(-0.75);
314 expected_result.push_back(-0.5);expected_result.push_back(-1.);
315 expected_result.push_back(0.5);expected_result.push_back(-1.);
316 expected_result.push_back(1.);expected_result.push_back(-0.5);
319 // EAP: different place of (0,0) point on 32 and 64-bits platforms
320 // we comment it for the sake of "make check" to pass
321 //CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION), maybe not significant (0,0) should be removed",
322 //(INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
324 // square and diamond intersecting at four degenerated pointss
332 // \brief Status : pass
334 void SingleElementPlanarTests::squareAndDiamondCritical()
336 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
337 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_losange1,4,4);
338 std::deque< double > expected_result;
340 expected_result.push_back(0.);expected_result.push_back(-1.);
341 expected_result.push_back(-1.);expected_result.push_back(0.);
342 expected_result.push_back(0.);expected_result.push_back(1.);
343 expected_result.push_back(1.);expected_result.push_back(0.);
345 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
346 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
348 void SingleElementPlanarTests::squareAndDiamondCritical_Triangulation()
350 std::vector< double > actual_result;
351 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_losange1,4,4,actual_result,_Epsilon/_Precision, _Precision );
353 std::vector< double > expected_result;
355 expected_result.push_back(0.5);expected_result.push_back(0.5);
356 expected_result.push_back(0.);expected_result.push_back(1.);
357 expected_result.push_back(0);expected_result.push_back(0);
358 expected_result.push_back(-1.);expected_result.push_back(0.);
359 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
360 expected_result.push_back(0.);expected_result.push_back(-1.);
361 expected_result.push_back(1.);expected_result.push_back(0.);
363 // 0020208: Unit Test of MED failed
364 // CPPUNIT_ASSERT_MESSAGE("Square and diamond basic test failed (TRIANGULATION) maybe not significant (0,0) should be removed",
365 // (INTERP_KERNEL::checkEqualPolygons<vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
367 // Two diamonds intersecting at one vertex on edge and one double vertex
378 // \brief Status : pass
379 void SingleElementPlanarTests::diamondsCritical()
382 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
383 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange6,_losange7,6,5);
384 std::deque< double > expected_result;
386 expected_result.push_back(0.5);expected_result.push_back(-0.5);
387 expected_result.push_back(0.5);expected_result.push_back(-0.5);
388 expected_result.push_back(0);expected_result.push_back(0);
389 expected_result.push_back(0.5);expected_result.push_back(0.5);
390 expected_result.push_back(0.5);expected_result.push_back(0.5);
391 expected_result.push_back(1);expected_result.push_back(0);
393 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (CONVEX)",
394 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
396 void SingleElementPlanarTests::diamondsCritical_Triangulation()
398 std::vector< double > actual_result;
399 INTERP_KERNEL::intersec_de_polygone<2>(_losange6,_losange7,6,5,actual_result,_Epsilon/_Precision, _Precision );
401 std::vector< double > expected_result;
403 expected_result.push_back(1);expected_result.push_back(0);
404 expected_result.push_back(0.5);expected_result.push_back(0.5);
405 expected_result.push_back(0);expected_result.push_back(0);
406 expected_result.push_back(0.5);expected_result.push_back(-0.5);
408 CPPUNIT_ASSERT_MESSAGE("Basic diamond crossing test failed (TRIANGULATION)",
409 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
412 // Two tangent squares with starting and ending vertices on edges
413 // _____ ___.___ ______
419 // |_____|_______|______|
421 // \brief Status : pass
422 void SingleElementPlanarTests::quadranglesCritical()
424 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
425 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square4,_square3,4,5);
426 std::deque< double > expected_result;
428 expected_result.push_back(-0.5);expected_result.push_back(1.);
429 expected_result.push_back(-0.5);expected_result.push_back(-1.);
430 expected_result.push_back(1.);expected_result.push_back(-1.);
431 expected_result.push_back(1.);expected_result.push_back(1.);
433 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (CONVEX)",
434 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
436 void SingleElementPlanarTests::quadranglesCritical_Triangulation()
438 std::vector< double > actual_result;
439 INTERP_KERNEL::intersec_de_polygone<2>(_square4,_square3,4,5,actual_result,_Epsilon/_Precision, _Precision );
441 std::vector< double > expected_result;
443 expected_result.push_back(1.);expected_result.push_back(-1.);
444 expected_result.push_back(1.);expected_result.push_back(0.5);
445 expected_result.push_back(1.);expected_result.push_back(1.);
446 expected_result.push_back(0.5);expected_result.push_back(1.);
447 expected_result.push_back(-0.5);expected_result.push_back(1.);
448 expected_result.push_back(-0.5);expected_result.push_back(-1./3);
449 expected_result.push_back(-0.5);expected_result.push_back(-0.5);
450 expected_result.push_back(-0.5);expected_result.push_back(-1.);
452 CPPUNIT_ASSERT_MESSAGE("Critical quadrangles with tangency test failed (TRIANGULATION)",
453 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
457 // square and diamond crossing and tangency at double vertices, starting vertex on edge
467 // \brief Status : pass
468 void SingleElementPlanarTests::quadrangleAndDiamondCritical()
470 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
471 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square5,_losange8,5,4);
472 std::deque< double > expected_result;
474 expected_result.push_back(0.);expected_result.push_back(1.);
475 expected_result.push_back(-0.5);expected_result.push_back(-1.);
476 expected_result.push_back(1.);expected_result.push_back(-1.);
477 expected_result.push_back(1.);expected_result.push_back(-1.);
479 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (CONVEX)",
480 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
482 void SingleElementPlanarTests::quadrangleAndDiamondCritical_Triangulation()
484 std::vector< double > actual_result;
485 INTERP_KERNEL::intersec_de_polygone<2>(_square5,_losange8,5,4,actual_result,_Epsilon/_Precision, _Precision );
487 std::vector< double > expected_result;
489 expected_result.push_back(1.);expected_result.push_back(-1.);
490 expected_result.push_back(1./3);expected_result.push_back(1./3);
491 expected_result.push_back(0.);expected_result.push_back(1.);
492 expected_result.push_back(0.);expected_result.push_back(0.);
493 expected_result.push_back(-1./3);expected_result.push_back(-1./3);
494 expected_result.push_back(-0.5);expected_result.push_back(-1.);
495 expected_result.push_back(0.);expected_result.push_back(-1.);
497 CPPUNIT_ASSERT_MESSAGE("Square and diamond critical tangency test failed (TRIANGULATION)",
498 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
499 } // square and diamond intersecting at four degenerated pointss
507 // \brief Status : pass
509 void SingleElementPlanarTests::diamondsCritical2()
511 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
512 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange9,4,4);
513 std::deque< double > expected_result;
515 expected_result.push_back(0.);expected_result.push_back(-1.);
516 expected_result.push_back(0.);expected_result.push_back(-1.);
517 expected_result.push_back(-1.);expected_result.push_back(0.);
518 expected_result.push_back(0.);expected_result.push_back(1.);
519 expected_result.push_back(0.);expected_result.push_back(1.);
520 expected_result.push_back(0.5);expected_result.push_back(0.);
522 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (CONVEX)",
523 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
525 void SingleElementPlanarTests::diamondsCritical2_Triangulation()
527 std::vector< double > actual_result;
528 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange9,4,4,actual_result,_Epsilon/_Precision, _Precision );
530 std::vector< double > expected_result;
532 expected_result.push_back(0.);expected_result.push_back(-1.);
533 expected_result.push_back(0.5);expected_result.push_back(0.);
534 expected_result.push_back(0.);expected_result.push_back(1.);
535 expected_result.push_back(-1.);expected_result.push_back(0.);
537 CPPUNIT_ASSERT_MESSAGE("Diamonds with crossing at double vertex test failed (TRIANGULATION)",
538 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
541 // Two tangent hexagons with double vertices and a critical starting vertex on edge
553 // \brief Status : pass
554 void SingleElementPlanarTests::hexagonsCritical1()
557 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
558 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon2,6,6);
559 std::deque< double > expected_result;
561 expected_result.push_back(5./3);expected_result.push_back(1./3);
562 expected_result.push_back(1.);expected_result.push_back(-1.);
563 expected_result.push_back(-1.);expected_result.push_back(-1.);
564 expected_result.push_back(-1.5);expected_result.push_back(0.5);
565 expected_result.push_back(-1.);expected_result.push_back(1.);
566 expected_result.push_back(1.);expected_result.push_back(1.);
568 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (CONVEX)",
569 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
571 void SingleElementPlanarTests::hexagonsCritical1_Triangulation()
573 std::vector< double > actual_result;
574 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon2,6,6,actual_result,_Epsilon/_Precision, _Precision );
576 std::vector< double > expected_result;
578 expected_result.push_back(-1.);expected_result.push_back(1.);
579 expected_result.push_back(-1.5);expected_result.push_back(0.5);
580 expected_result.push_back(-8./7);expected_result.push_back(2./7);
581 expected_result.push_back(-1.4);expected_result.push_back(0.2);
582 expected_result.push_back(-4./3);expected_result.push_back(0.);
583 expected_result.push_back(-2./3);expected_result.push_back(0.);
584 expected_result.push_back(-1.25);expected_result.push_back(-0.25);
585 expected_result.push_back(-1.);expected_result.push_back(-1.);
586 expected_result.push_back(1.);expected_result.push_back(-1.);
587 expected_result.push_back(1.5);expected_result.push_back(0.);
588 expected_result.push_back(5./3);expected_result.push_back(1./3);
589 expected_result.push_back(1.125);expected_result.push_back(0.875);
590 expected_result.push_back(1.);expected_result.push_back(1.);
591 expected_result.push_back(0.25);expected_result.push_back(0.75);
593 CPPUNIT_ASSERT_MESSAGE("First hexagon critical crossing test failed (TRIANGULATION)",
594 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
597 // Two tangent hexagons with double vertices and a critical starting vertex on edge
609 // \brief Status : pass
610 void SingleElementPlanarTests::hexagonsCritical2()
612 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
613 std::deque< double > actual_result = intersector.intersectConvexPolygons(_hexagon1,_hexagon3,6,6);
614 std::deque< double > expected_result;
616 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (CONVEX)",
617 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
619 void SingleElementPlanarTests::hexagonsCritical2_Triangulation()
621 std::vector< double > actual_result;
622 INTERP_KERNEL::intersec_de_polygone<2>(_hexagon1,_hexagon3,6,6,actual_result,_Epsilon/_Precision, _Precision );
624 std::vector< double > expected_result;
625 expected_result.push_back(1.);expected_result.push_back(1.);
626 expected_result.push_back(-1.);expected_result.push_back(1.);
628 CPPUNIT_ASSERT_MESSAGE("Second hexagon critical crossing test failed (TRIANGULATION)",
629 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
632 // Square and quadrilateron with outer tangency
645 // \brief Status : pass
646 void SingleElementPlanarTests::squareAndQuadrangleCritical()
648 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
649 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_square6,4,4);
650 std::deque< double > expected_result;
652 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)", (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
654 void SingleElementPlanarTests::squareAndQuadrangleCritical_Triangulation()
656 std::vector< double > actual_result;
657 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_square6,4,4,actual_result,_Epsilon/_Precision, _Precision );
659 std::vector< double > expected_result;
660 expected_result.push_back(-1.);expected_result.push_back(1.);
661 expected_result.push_back(0.5);expected_result.push_back(1.);
663 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
664 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
666 // Two diamonds sharing a vertex in an exclusion configuration
685 // \brief Status : pass
686 void SingleElementPlanarTests:: diamondsSharingVertex2()
688 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
689 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_losange10,4,4);
690 std::deque< double > expected_result;
692 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (CONVEX)",
693 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
695 void SingleElementPlanarTests:: diamondsSharingVertex2_Triangulation()
697 std::vector< double > actual_result;
698 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_losange10,4,4,actual_result,_Epsilon/_Precision, _Precision );
700 std::vector< double > expected_result;
701 expected_result.push_back(0.);expected_result.push_back(-1.);
703 CPPUNIT_ASSERT_MESSAGE("Diamond sharing vertex (2) test failed (TRIANGULATION)",
704 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
707 // Triangle and diamond with a critical crossing at double starting vertex
718 // \brief Status : pass
719 void SingleElementPlanarTests:: triangleAndDiamondCritical()
721 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
722 std::deque< double > actual_result = intersector.intersectConvexPolygons(_losange1,_triangle1,4,3);
723 std::deque< double > expected_result;
725 expected_result.push_back(2./3);expected_result.push_back(1./3);
726 expected_result.push_back(0.5);expected_result.push_back(0.);
727 expected_result.push_back(0.);expected_result.push_back(1.);
729 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (CONVEX)",
730 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
732 void SingleElementPlanarTests:: triangleAndDiamondCritical_Triangulation()
734 std::vector< double > actual_result;
735 INTERP_KERNEL::intersec_de_polygone<2>(_losange1,_triangle1,4,3,actual_result,_Epsilon/_Precision, _Precision );
737 std::vector< double > expected_result;
739 expected_result.push_back(2./3);expected_result.push_back(1./3);
740 expected_result.push_back(0.);expected_result.push_back(1.);
741 expected_result.push_back(0.5);expected_result.push_back(0.);
743 CPPUNIT_ASSERT_MESSAGE("Triangle and diamonds critical test failed (TRIANGULATION)",
744 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
747 // Basic triangle and square intersection (two distinct points)
760 // \brief Status : pass
761 void SingleElementPlanarTests::triangleAndSquareBasic()
763 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
764 std::deque< double > actual_result = intersector.intersectConvexPolygons(_square1,_triangle2,4,3);
765 std::deque< double > expected_result;
767 expected_result.push_back(1.);expected_result.push_back(1./6);
768 expected_result.push_back(1.);expected_result.push_back(-1./6);
769 expected_result.push_back(0.);expected_result.push_back(-0.5);
770 expected_result.push_back(0.);expected_result.push_back(0.5);
772 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (CONVEX)",
773 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
776 void SingleElementPlanarTests::triangleAndSquareBasic_Triangulation()
778 std::vector< double > actual_result;
779 INTERP_KERNEL::intersec_de_polygone<2>(_square1,_triangle2,4,3,actual_result,_Epsilon/_Precision, _Precision );
781 std::vector< double > expected_result;
783 expected_result.push_back(1.);expected_result.push_back(1./6);
784 expected_result.push_back(0.375);expected_result.push_back(0.375);
785 expected_result.push_back(0.);expected_result.push_back(0.5);
786 expected_result.push_back(0.);expected_result.push_back(0.);
787 expected_result.push_back(0.);expected_result.push_back(-0.5);
788 expected_result.push_back(1.);expected_result.push_back(-1./6);
790 CPPUNIT_ASSERT_MESSAGE("Identical squares test failed (TRIANGULATION)",
791 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
793 // Two triangles with a starting vertex on edge
800 // \brief Status : pass
801 void SingleElementPlanarTests::trianglesCritical()
803 INTERP_KERNEL::PolygonAlgorithms<3> intersector (_Epsilon, _Precision);;
804 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle3,_triangle4,3,3);
805 std::deque< double > expected_result;
807 expected_result.push_back(2./3);expected_result.push_back(2.);expected_result.push_back(1./3);
808 expected_result.push_back(0.5);expected_result.push_back(2.);expected_result.push_back(0.);
809 expected_result.push_back(0.75);expected_result.push_back(2.);expected_result.push_back(0.25);
811 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (CONVEX)",
812 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,3>(&actual_result, &expected_result, _Epsilon)));
814 void SingleElementPlanarTests::trianglesCritical_Triangulation()
816 std::vector< double > actual_result;
817 double _triangle3rotated[6],_triangle4rotated[6];
818 for (int i=0; i<3; i++)_triangle3rotated[2*i] = _triangle3[3*i];
819 for (int i=0; i<3; i++)_triangle3rotated[2*i+1] = _triangle3[3*i+2];
820 for (int i=0; i<3; i++)_triangle4rotated[2*i] = _triangle4[3*i];
821 for (int i=0; i<3; i++)_triangle4rotated[2*i+1] = _triangle4[3*i+2];
823 INTERP_KERNEL::intersec_de_polygone<2>(_triangle3rotated,_triangle4rotated,3,3,actual_result,_Epsilon/_Precision, _Precision );
825 std::vector< double > expected_result;
827 expected_result.push_back(0.5);expected_result.push_back(0.);
828 expected_result.push_back(2./3);expected_result.push_back(1./3);
829 expected_result.push_back(0.75);expected_result.push_back(0.25);
831 CPPUNIT_ASSERT_MESSAGE("Triangles critical test failed (TRIANGULATION)",
832 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
835 // Two tangent paralellograms intersecting at 3 double vertices (one being a starting vertex)
843 // \brief Status : pass
844 void SingleElementPlanarTests::paralellogramsCritical1()
846 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
847 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel2,4,4);
848 std::deque< double > expected_result;
850 expected_result.push_back(0.);expected_result.push_back(0.);
851 expected_result.push_back(0.);expected_result.push_back(0.);
852 expected_result.push_back(-0.5);expected_result.push_back(1.);
853 expected_result.push_back(0.5);expected_result.push_back(1.);
855 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (CONVEX)",
856 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
858 void SingleElementPlanarTests::paralellogramsCritical1_Triangulation()
860 std::vector< double > actual_result;
861 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel2,4,4,actual_result,_Epsilon/_Precision, _Precision );
863 std::vector< double > expected_result;
865 expected_result.push_back(0.25);expected_result.push_back(0.5);
866 expected_result.push_back(0.5);expected_result.push_back(1.);
867 expected_result.push_back(0.);expected_result.push_back(2./3);
868 expected_result.push_back(-0.5);expected_result.push_back(1.);
869 expected_result.push_back(-0.25);expected_result.push_back(0.5);
870 expected_result.push_back(0.);expected_result.push_back(0.);
872 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test (1) failed (TRIANGULATION)",
873 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
876 // Two paralellograms sharing a vertex in an exclusion configuration
888 // \brief Status : pass
889 void SingleElementPlanarTests::paralellogramsCritical2()
891 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
892 std::deque< double > actual_result = intersector.intersectConvexPolygons(_parallel1,_parallel3,4,4);
893 std::deque< double > expected_result;
895 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (CONVEX)",
896 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
898 void SingleElementPlanarTests::paralellogramsCritical2_Triangulation()
900 std::vector< double > actual_result;
901 INTERP_KERNEL::intersec_de_polygone<2>(_parallel1,_parallel3,4,4,actual_result,_Epsilon/_Precision, _Precision );
903 std::vector< double > expected_result;
905 expected_result.push_back(0.);expected_result.push_back(0.);
907 CPPUNIT_ASSERT_MESSAGE("Paralellogram tangency test failed (TRIANGULATION)",
908 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
911 // Two triangles in a tangency configuration with a starting vertex on edge
923 // \brief Status : pass
924 void SingleElementPlanarTests::trianglesTangencyCritical()
926 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
927 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle5,_triangle6,3,3);
928 std::deque< double > expected_result;
930 expected_result.push_back(1./3);expected_result.push_back(1./2);
931 expected_result.push_back(1./3);expected_result.push_back(1./3);
932 expected_result.push_back(1./2);expected_result.push_back(1./2);
934 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (CONVEX)",
935 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
937 void SingleElementPlanarTests::trianglesTangencyCritical_Triangulation()
939 std::vector< double > actual_result;
940 INTERP_KERNEL::intersec_de_polygone<2>(_triangle5,_triangle6,3,3,actual_result,_Epsilon/_Precision, _Precision );
942 std::vector< double > expected_result;
944 expected_result.push_back(1./3);expected_result.push_back(1./2);
945 expected_result.push_back(1./2);expected_result.push_back(1./2);
946 expected_result.push_back(1./3);expected_result.push_back(1./3);
948 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical test failed (TRIANGULATION)",
949 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
952 // Two triangles with double starting point in an outer tangency configuration
963 // \brief Status : pass
964 void SingleElementPlanarTests::trianglesTangencyCritical2()
966 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
967 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle1,_triangle7,3,3);
968 std::deque< double > expected_result;
970 // if(!checkDequesEqual(actual_result,expected_result, _Epsilon))
972 // std::cerr<< "CPP_UNIT expected result= " << std::endl;
973 // dequePrintOut(expected_result);
974 // std::cerr<< "CPP_UNIT actual result= " << std::endl;
975 // dequePrintOut(actual_result);
978 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (CONVEX)",
979 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
981 void SingleElementPlanarTests::trianglesTangencyCritical2_Triangulation()
983 std::vector< double > actual_result;
984 INTERP_KERNEL::intersec_de_polygone<2>(_triangle1,_triangle7,3,3,actual_result,_Epsilon/_Precision, _Precision );
986 std::vector< double > expected_result;
987 expected_result.push_back(1.);expected_result.push_back(1.);
988 expected_result.push_back(0.);expected_result.push_back(1.);
990 // if(!checkVectorsEqual(actual_result,expected_result, _Epsilon))
992 // cerr<< "CPP_UNIT expected result= " << endl;
993 // vectPrintOut(expected_result);
994 // cerr<< "CPP_UNIT actual result= " << endl;
995 // vectPrintOut(actual_result);
998 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (2) test failed (TRIANGULATION)",
999 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1001 // \brief Status : pass
1002 void SingleElementPlanarTests::trianglesTangencyCritical3()
1004 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1005 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle8,_triangle9,3,3);
1006 std::deque< double > expected_result;
1008 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (CONVEX)",
1009 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1011 void SingleElementPlanarTests::trianglesTangencyCritical3_Triangulation()
1013 std::vector< double > actual_result;
1014 INTERP_KERNEL::intersec_de_polygone<2>(_triangle8,_triangle9,3,3,actual_result,_Epsilon/_Precision, _Precision );
1016 std::vector< double > expected_result;
1017 expected_result.push_back(22.4601);expected_result.push_back(35.2129);
1018 expected_result.push_back(13.9921);expected_result.push_back(34.693);
1020 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (3) test failed (TRIANGULATION)",
1021 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));
1023 void SingleElementPlanarTests::trianglesTangencyCritical4()
1025 INTERP_KERNEL::PolygonAlgorithms<2> intersector (_Epsilon, _Precision);;
1026 std::deque< double > actual_result = intersector.intersectConvexPolygons(_triangle10,_triangle11,3,3);
1028 std::deque< double > expected_result;
1029 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1030 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1031 expected_result.push_back(80);expected_result.push_back(100.);
1034 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (CONVEX)",
1035 (INTERP_KERNEL::checkEqualPolygons<std::deque<double>,2>(&actual_result, &expected_result, _Epsilon)));
1037 void SingleElementPlanarTests::trianglesTangencyCritical4_Triangulation()
1039 std::vector< double > actual_result;
1040 INTERP_KERNEL::intersec_de_polygone<2>(_triangle10,_triangle11,3,3,actual_result,_Epsilon/_Precision, _Precision );
1042 std::vector< double > expected_result;
1043 expected_result.push_back(80);expected_result.push_back(100.);
1044 expected_result.push_back(82.745193090443536);expected_result.push_back(96.184114390029166);
1045 expected_result.push_back(82.260099999999994);expected_result.push_back(95.720200000000006);
1047 CPPUNIT_ASSERT_MESSAGE("Triangles tangency critical (4) test failed (TRIANGULATION)",
1048 (INTERP_KERNEL::checkEqualPolygons<std::vector<double>,2>(&actual_result, &expected_result, _Epsilon)));