Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/med.git] / src / INTERP_KERNELTest / QuadraticPlanarInterpTest2.cxx
1 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "QuadraticPlanarInterpTest.hxx"
21 #include "InterpKernelGeo2DQuadraticPolygon.hxx"
22 #include "InterpKernelGeo2DEdgeArcCircle.hxx"
23 #include "InterpKernelGeo2DEdgeLin.hxx"
24
25 #include <cmath>
26 #include <sstream>
27 #include <iostream>
28
29 using namespace INTERP_KERNEL;
30
31 namespace INTERP_TEST
32 {
33
34 static const double ADMISSIBLE_ERROR = 1.e-14;
35
36 void QuadraticPlanarInterpTest::IntersectArcCircleBase()
37 {
38   double center[2]={0.5,0.5};
39   double radius=0.3;
40   EdgeArcCircle *e1=buildArcOfCircle(center,radius,M_PI/4.,M_PI/3.);
41   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(M_PI/3),ADMISSIBLE_ERROR);
42   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(M_PI/4),ADMISSIBLE_ERROR);
43   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(M_PI/4),ADMISSIBLE_ERROR);
44   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(M_PI/3),ADMISSIBLE_ERROR);
45   e1->decrRef();
46   //
47   e1=buildArcOfCircle(center,radius,M_PI/3.,M_PI/2.);
48   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(M_PI/2),ADMISSIBLE_ERROR);
49   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(M_PI/3),ADMISSIBLE_ERROR);
50   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(M_PI/3),ADMISSIBLE_ERROR);
51   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(M_PI/2),ADMISSIBLE_ERROR);
52   e1->decrRef();
53   //
54   e1=buildArcOfCircle(center,radius,M_PI/3.,3.*M_PI/4.);
55   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(3*M_PI/4),ADMISSIBLE_ERROR);
56   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(M_PI/3),ADMISSIBLE_ERROR);
57   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(3*M_PI/4),ADMISSIBLE_ERROR);
58   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(M_PI/2),ADMISSIBLE_ERROR);//<<
59   e1->decrRef();
60   //
61   e1=buildArcOfCircle(center,radius,3*M_PI/4,7*M_PI/8);
62   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(7*M_PI/8),ADMISSIBLE_ERROR);
63   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(3*M_PI/4),ADMISSIBLE_ERROR);
64   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(7*M_PI/8),ADMISSIBLE_ERROR);
65   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(3*M_PI/4),ADMISSIBLE_ERROR);
66   e1->decrRef();
67   //
68   e1=buildArcOfCircle(center,radius,7.*M_PI/8.,9.*M_PI/8.);
69   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(M_PI),ADMISSIBLE_ERROR);//<<
70   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(7*M_PI/8),ADMISSIBLE_ERROR);
71   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(9*M_PI/8),ADMISSIBLE_ERROR);
72   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(7*M_PI/8),ADMISSIBLE_ERROR);
73   e1->decrRef();
74   //
75   e1=buildArcOfCircle(center,radius,9.*M_PI/8.,11.*M_PI/8.);
76   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(9*M_PI/8),ADMISSIBLE_ERROR);
77   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(11*M_PI/8),ADMISSIBLE_ERROR);
78   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(11*M_PI/8),ADMISSIBLE_ERROR);
79   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(9*M_PI/8),ADMISSIBLE_ERROR);
80   e1->decrRef();
81   //
82   e1=buildArcOfCircle(center,radius,11.*M_PI/8.,7.*M_PI/4.);
83   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(11*M_PI/8),ADMISSIBLE_ERROR);
84   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(7*M_PI/4),ADMISSIBLE_ERROR);
85   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(3*M_PI/2),ADMISSIBLE_ERROR);//<<
86   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(7*M_PI/4),ADMISSIBLE_ERROR);
87   e1->decrRef();
88   //
89   e1=buildArcOfCircle(center,radius,7.*M_PI/4.,15.*M_PI/8.);
90   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(7*M_PI/4),ADMISSIBLE_ERROR);
91   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(15*M_PI/8),ADMISSIBLE_ERROR);
92   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(7*M_PI/4),ADMISSIBLE_ERROR);
93   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(15*M_PI/8),ADMISSIBLE_ERROR);
94   e1->decrRef();
95   //
96   e1=buildArcOfCircle(center,radius,-M_PI/8.,M_PI/4.);
97   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[0],center[0]+radius*cos(M_PI/4),ADMISSIBLE_ERROR);
98   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[1],center[0]+radius*cos(0.),ADMISSIBLE_ERROR);      //<<
99   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[2],center[1]+radius*sin(15*M_PI/8),ADMISSIBLE_ERROR);
100   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getBounds()[3],center[1]+radius*sin(M_PI/4),ADMISSIBLE_ERROR);
101   e1->decrRef();
102   //
103   // ArcCArcCIntersector
104   //
105   TypeOfLocInEdge where1,where2;
106   std::vector<Node *> v4;
107   MergePoints v3;
108   EdgeArcCircle *e2;
109   ArcCArcCIntersector *intersector=0;
110   for(unsigned k=0;k<8;k++)
111     {
112       e1=buildArcOfCircle(center,radius,M_PI/4.+k*M_PI/4.,M_PI/3.+k*M_PI/4.);
113       e2=buildArcOfCircle(center,radius,M_PI/4.+k*M_PI/4.,M_PI/3.+k*M_PI/4.);
114       intersector=new ArcCArcCIntersector(*e1,*e2);
115       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
116       CPPUNIT_ASSERT(where1==START && where2==END);
117       delete intersector; v3.clear(); e2->decrRef();
118       //
119       e2=buildArcOfCircle(center,radius,7*M_PI/24.+k*M_PI/4.,M_PI/3.+k*M_PI/4.);
120       intersector=new ArcCArcCIntersector(*e1,*e2);
121       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
122       CPPUNIT_ASSERT(where1==INSIDE && where2==END);
123       delete intersector; v3.clear(); e2->decrRef();
124       //
125       e2=buildArcOfCircle(center,radius,M_PI/4.+k*M_PI/4.,7*M_PI/24.+k*M_PI/4.);
126       intersector=new ArcCArcCIntersector(*e1,*e2);
127       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
128       CPPUNIT_ASSERT(where1==START && where2==INSIDE);
129       delete intersector; v3.clear(); e2->decrRef();
130       //
131       e2=buildArcOfCircle(center,radius,13.*M_PI/48.+k*M_PI/4.,15*M_PI/48.+k*M_PI/4.);
132       intersector=new ArcCArcCIntersector(*e1,*e2);
133       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
134       CPPUNIT_ASSERT(where1==INSIDE && where2==INSIDE);
135       delete intersector; v3.clear(); e2->decrRef();
136       //
137       e2=buildArcOfCircle(center,radius,-M_PI/4.+k*M_PI/4.,M_PI/6.+k*M_PI/4.);
138       intersector=new ArcCArcCIntersector(*e1,*e2);
139       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
140       CPPUNIT_ASSERT(where1==OUT_BEFORE && where2==OUT_BEFORE);
141       delete intersector; v3.clear(); e2->decrRef();
142       //
143       e2=buildArcOfCircle(center,radius,0+k*M_PI/4.,5*M_PI/6.+k*M_PI/4.);
144       intersector=new ArcCArcCIntersector(*e1,*e2);
145       intersector->getPlacements(e2->getStartNode(),e2->getEndNode(),where1,where2,v3);
146       CPPUNIT_ASSERT(where1==OUT_BEFORE && where2==OUT_AFTER);
147       delete intersector; v3.clear(); e2->decrRef();
148       e1->decrRef();
149     }
150   // Ok now let's see intersection only. 2 intersections R1 > R2 ; dist(circle1,circle2)>R1; Opposite order.
151   for(unsigned k=0;k<8;k++)
152     {
153       center[0]=0.; center[1]=0.;
154       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
155       e1=buildArcOfCircle(center,3.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
156       e2=buildArcOfCircle(center2,1.,M_PI+(k-1)*M_PI/4.,M_PI+(k+1)*M_PI/4.);
157       intersector=new ArcCArcCIntersector(*e1,*e2);
158       bool order;
159       bool obvious,areOverlapped;
160       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
161       CPPUNIT_ASSERT(!obvious && !areOverlapped);
162       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(!order);
163       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
164       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
165       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
166       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
167       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
168       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
169       CPPUNIT_ASSERT_DOUBLES_EQUAL(btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),0.35587863972199624,1e-10);
170       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
171         (*iter)->decrRef();
172       v4.clear(); v3.clear();
173       delete intersector; e2->decrRef(); e1->decrRef();
174     }
175   // Ok now let's see intersection only. 2 intersections R1 > R2 ; dist(circle1,circle2)>R1; Same order.
176   for(unsigned k=0;k<7;k++)
177     {
178       center[0]=0.; center[1]=0.;
179       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
180       e1=buildArcOfCircle(center,3.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
181       e2=buildArcOfCircle(center2,1.,M_PI+(k+1)*M_PI/4.,M_PI+(k-1)*M_PI/4.);
182       intersector=new ArcCArcCIntersector(*e1,*e2);
183       bool order;
184       bool obvious,areOverlapped;
185       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
186       CPPUNIT_ASSERT(!obvious && !areOverlapped);
187       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order);
188       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
189       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
190       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
191       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
192       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
193       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
194       CPPUNIT_ASSERT_DOUBLES_EQUAL(btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),0.35587863972199624,1e-10);
195       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
196         (*iter)->decrRef();
197       v4.clear(); v3.clear();
198       delete intersector; e2->decrRef(); e1->decrRef();
199     }
200   // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Same order.
201   for(unsigned k=0;k<8;k++)
202     {
203       center[0]=0.; center[1]=0.;
204       double center2[2]; center2[0]=2.8*cos(k*M_PI/4.); center2[1]=2.8*sin(k*M_PI/4.);
205       e1=buildArcOfCircle(center,3.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
206       e2=buildArcOfCircle(center2,1.,(k)*M_PI/4.-M_PI/2.,(k)*M_PI/4.+M_PI/2.);
207       intersector=new ArcCArcCIntersector(*e1,*e2);
208       bool order;
209       bool obvious,areOverlapped;
210       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
211       CPPUNIT_ASSERT(!obvious && !areOverlapped);
212       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order);
213       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
214       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
215       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
216       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
217       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
218       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
219       CPPUNIT_ASSERT_DOUBLES_EQUAL(btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),0.6793851523346941,1e-10);
220       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
221         (*iter)->decrRef();
222       v4.clear(); v3.clear();
223       delete intersector; e2->decrRef(); e1->decrRef();
224     }
225   // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Opp order.
226   for(unsigned k=0;k<8;k++)
227     {
228       center[0]=0.; center[1]=0.;
229       double center2[2]; center2[0]=2.8*cos(k*M_PI/4.); center2[1]=2.8*sin(k*M_PI/4.);
230       e1=buildArcOfCircle(center,3.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
231       e2=buildArcOfCircle(center2,1.,(k)*M_PI/4.+M_PI/2.,(k)*M_PI/4.-M_PI/2.);
232       intersector=new ArcCArcCIntersector(*e1,*e2);
233       bool order;
234       bool obvious,areOverlapped;
235       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
236       CPPUNIT_ASSERT(!obvious && !areOverlapped);
237       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(!order);
238       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
239       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
240       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
241       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
242       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
243       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
244       CPPUNIT_ASSERT_DOUBLES_EQUAL(btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),0.6793851523346941,1e-10);
245       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
246         (*iter)->decrRef();
247       v4.clear(); v3.clear();
248       delete intersector; e2->decrRef(); e1->decrRef();
249     }
250   // Ok now let's see intersection only. 2 intersections R1 < R2 ; dist(circle1,circle2)>R2; Opposite order.
251   for(unsigned k=0;k<1;k++)
252     {
253       double center2[2]; center[0]=0.; center[1]=0.;
254       center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
255       e1=buildArcOfCircle(center,1.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
256       e2=buildArcOfCircle(center2,3.,M_PI+(k-1)*M_PI/4.,M_PI+(k+1)*M_PI/4.);
257       intersector=new ArcCArcCIntersector(*e1,*e2);
258       bool order;
259       bool obvious,areOverlapped;
260       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
261       CPPUNIT_ASSERT(!obvious && !areOverlapped);
262       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(!order);
263       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
264       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
265       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
266       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
267       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
268       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
269       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.1195732971845034,btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),1e-10);
270       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
271         (*iter)->decrRef();
272       v4.clear(); v3.clear();
273       delete intersector; e2->decrRef(); e1->decrRef();
274     }
275   // Ok now let's see intersection only. 2 intersections R1 < R2 ; dist(circle1,circle2)>R2; same order.
276   for(unsigned k=0;k<8;k++)
277     {
278       double center2[2]; center[0]=0.; center[1]=0.;
279       center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
280       e1=buildArcOfCircle(center,1.,(k+1)*M_PI/4.,(k-1)*M_PI/4.);
281       e2=buildArcOfCircle(center2,3.,M_PI+(k-1)*M_PI/4.,M_PI+(k+1)*M_PI/4.);
282       intersector=new ArcCArcCIntersector(*e1,*e2);
283       bool order;
284       bool obvious,areOverlapped;
285       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
286       CPPUNIT_ASSERT(!obvious && !areOverlapped);
287       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order);
288       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
289       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
290       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
291       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
292       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
293       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
294       CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.1195732971845034,btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),1e-10);
295       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
296         (*iter)->decrRef();
297       v4.clear(); v3.clear();
298       delete intersector; e2->decrRef(); e1->decrRef();
299     }
300   // Ok now let's see intersection only. 2 intersections R1 < R2 ; dist(circle1,circle2)<R2; same order.
301   for(unsigned k=0;k<8;k++)
302     {
303       double center2[2]; center[0]=0.; center[1]=0.;
304       center2[0]=-2.8*cos(k*M_PI/4.); center2[1]=-2.8*sin(k*M_PI/4.);
305       e1=buildArcOfCircle(center,1.,(k)*M_PI/4.+M_PI/2.,(k)*M_PI/4.-M_PI/2.);
306       e2=buildArcOfCircle(center2,3.,(k+1)*M_PI/4.,(k-1)*M_PI/4.);
307       intersector=new ArcCArcCIntersector(*e1,*e2);
308       bool order;
309       bool obvious,areOverlapped;
310       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
311       CPPUNIT_ASSERT(!obvious && !areOverlapped);
312       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order);
313       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
314       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
315       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
316       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
317       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
318       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
319       CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0844420190512074,btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),1e-10);
320       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
321         (*iter)->decrRef();
322       v4.clear(); v3.clear();
323       delete intersector; e2->decrRef(); e1->decrRef();
324     }
325   // Ok now let's see intersection only. 2 intersections R1 < R2 ; dist(circle1,circle2)<R2; opp. order.
326   for(unsigned k=0;k<8;k++)
327     {
328       double center2[2]; center[0]=0.; center[1]=0.;
329       center2[0]=-2.8*cos(k*M_PI/4.); center2[1]=-2.8*sin(k*M_PI/4.);
330       e1=buildArcOfCircle(center,1.,(k)*M_PI/4.+M_PI/2.,(k)*M_PI/4.-M_PI/2.);
331       e2=buildArcOfCircle(center2,3.,(k-1)*M_PI/4.,(k+1)*M_PI/4.);
332       intersector=new ArcCArcCIntersector(*e1,*e2);
333       bool order;
334       bool obvious,areOverlapped;
335       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
336       CPPUNIT_ASSERT(!obvious && !areOverlapped);
337       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(!order);
338       CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
339       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
340       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
341       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
342       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[1]))),ADMISSIBLE_ERROR);
343       CPPUNIT_ASSERT(!v4[0]->isEqual(*v4[1]));
344       CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.0844420190512074,btw2NodesAndACenter(*v4[0],*v4[1],e1->getCenter()),1e-10);
345       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
346         (*iter)->decrRef();
347       v4.clear(); v3.clear();
348       delete intersector; e2->decrRef(); e1->decrRef();
349     }
350   // Tangent intersection
351   QUADRATIC_PLANAR::setPrecision(1e-5);
352   for(unsigned k=0;k<8;k++)
353     {
354       double center2[2]; center[0]=0.; center[1]=0.;
355       center2[0]=4.*cos(k*M_PI/4.); center2[1]=4.*sin(k*M_PI/4.);
356       e1=buildArcOfCircle(center,1.,(k+1)*M_PI/4.,(k-1)*M_PI/4.);
357       e2=buildArcOfCircle(center2,3.,M_PI+(k-1)*M_PI/4.,M_PI+(k+1)*M_PI/4.);
358       intersector=new ArcCArcCIntersector(*e1,*e2);
359       bool order;
360       bool obvious,areOverlapped;
361       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
362       CPPUNIT_ASSERT(!obvious && !areOverlapped);
363       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); // order has no sence here because v4.size() expected to 1 but for valgrind serenity test.
364       CPPUNIT_ASSERT_EQUAL(1,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
365       CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getRadius(),Node::distanceBtw2Pt(e1->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
366       CPPUNIT_ASSERT_DOUBLES_EQUAL(e2->getRadius(),Node::distanceBtw2Pt(e2->getCenter(),(*(v4[0]))),ADMISSIBLE_ERROR);
367       for(std::vector<Node *>::iterator iter=v4.begin();iter!=v4.end();iter++)
368         (*iter)->decrRef();
369       v4.clear(); v4.clear();
370       delete intersector; e2->decrRef(); e1->decrRef();
371     }
372   QUADRATIC_PLANAR::setPrecision(1e-14);
373   // Extremities # 1
374   for(unsigned k=0;k<8;k++)
375     {
376       center[0]=0.; center[1]=0.;
377       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
378       e1=buildArcOfCircle(center,3.,k*M_PI/4.-0.17793931986099812,k*M_PI/4.+0.17793931986099812);
379       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.-0.55978664859225125,M_PI+k*M_PI/4.+0.55978664859225125);
380       intersector=new ArcCArcCIntersector(*e1,*e2);
381       bool order;
382       bool obvious,areOverlapped;
383       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
384       CPPUNIT_ASSERT(!obvious && !areOverlapped);
385       CPPUNIT_ASSERT(!intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT_EQUAL(0,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
386       CPPUNIT_ASSERT(e1->getStartNode()==e2->getEndNode()); CPPUNIT_ASSERT(e2->getStartNode()==e1->getEndNode());
387       v4.clear(); v3.clear();
388       delete intersector; e2->decrRef(); e1->decrRef();
389     }
390   for(unsigned k=0;k<8;k++)
391     {
392       center[0]=0.; center[1]=0.;
393       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
394       e1=buildArcOfCircle(center,3.,k*M_PI/4.-0.17793931986099812,k*M_PI/4.+0.17793931986099812);
395       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.+0.55978664859225125,M_PI+k*M_PI/4.-0.55978664859225125);
396       intersector=new ArcCArcCIntersector(*e1,*e2);
397       bool order;
398       bool obvious,areOverlapped;
399       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
400       CPPUNIT_ASSERT(!obvious && !areOverlapped);
401       CPPUNIT_ASSERT(!intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT_EQUAL(0,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
402       CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==e1->getEndNode());
403       v4.clear(); v3.clear();
404       delete intersector; e2->decrRef(); e1->decrRef();
405     }
406   // Extremities # 2
407   for(unsigned k=0;k<8;k++)
408     {
409       center[0]=0.; center[1]=0.;
410       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
411       e1=buildArcOfCircle(center,3.,k*M_PI/4.-0.17793931986099812,k*M_PI/4.+0.17793931986099812);
412       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.+0.55978664859225125,M_PI+k*M_PI/4.-0.7);
413       intersector=new ArcCArcCIntersector(*e1,*e2);
414       bool order;
415       bool obvious,areOverlapped;
416       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
417       CPPUNIT_ASSERT(!obvious && !areOverlapped);
418       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3));
419       CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(1,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
420       CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v4[0]);
421       v4[0]->decrRef();
422       v4.clear(); v3.clear();
423       delete intersector; e2->decrRef(); e1->decrRef();
424     }
425   // Extremities # 3
426   for(unsigned k=0;k<8;k++)
427     {
428       center[0]=0.; center[1]=0.;
429       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
430       e1=buildArcOfCircle(center,3.,k*M_PI/4.-0.17793931986099812,k*M_PI/4.+0.17793931986099812);
431       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.+0.7,M_PI+k*M_PI/4.-0.7);
432       intersector=new ArcCArcCIntersector(*e1,*e2);
433       bool order;
434       bool obvious,areOverlapped;
435       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
436       CPPUNIT_ASSERT(!obvious && !areOverlapped);
437       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
438       CPPUNIT_ASSERT(e1->getStartNode()==v4[0]); CPPUNIT_ASSERT(e1->getEndNode()==v4[1]);
439       v4[0]->decrRef(); v4[1]->decrRef();
440       v4.clear(); v3.clear();
441       delete intersector; e2->decrRef(); e1->decrRef();
442     }
443   // Extremities # 4
444   for(unsigned k=0;k<8;k++)
445     {
446       center[0]=0.; center[1]=0.;
447       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
448       Node *nodeS=new Node(center[0]+3.*cos(k*M_PI/4.-0.17793931986099812),center[1]+3.*sin(k*M_PI/4.-0.17793931986099812));
449       Node *nodeE=new Node(center[0]+3.*cos(k*M_PI/4.),center[1]+3.*sin(k*M_PI/4.));
450       double angle=k*M_PI/4.-0.17793931986099812;
451       angle=angle>M_PI?angle-2.*M_PI:angle;
452       e1=new EdgeArcCircle(nodeS,nodeE,//Problem of precision 1e-14 to easily reached.
453                            center,3.,angle,0.17793931986099812);
454       nodeS->decrRef(); nodeE->decrRef();
455       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.+0.7,M_PI+k*M_PI/4.-0.7);
456       intersector=new ArcCArcCIntersector(*e1,*e2);
457       bool order;
458       bool obvious,areOverlapped;
459       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
460       CPPUNIT_ASSERT(!obvious && !areOverlapped);
461       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(1,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
462       CPPUNIT_ASSERT(e1->getStartNode()==v4[0]);
463       v4[0]->decrRef();
464       v4.clear(); v3.clear();
465       delete intersector; e2->decrRef(); e1->decrRef();
466     }
467   //Extremities # 5
468   for(unsigned k=0;k<8;k++)
469     {
470       center[0]=0.; center[1]=0.;
471       double center2[2]; center2[0]=3.8*cos(k*M_PI/4.); center2[1]=3.8*sin(k*M_PI/4.);
472       Node *nodeS=new Node(center[0]+3.*cos(k*M_PI/4.-0.17793931986099812),center[1]+3.*sin(k*M_PI/4.-0.17793931986099812));
473       Node *nodeE=new Node(center[0]+3.*cos(k*M_PI/4.)+0.5,center[1]+3.*sin(k*M_PI/4.));
474       double angle=k*M_PI/4.-0.17793931986099812;
475       angle=angle>M_PI?angle-2.*M_PI:angle;
476       e1=new EdgeArcCircle(nodeS,nodeE,//Problem of precision 1e-14 to easily reached.
477                            center,3.,angle,0.67793931986099812);
478       nodeS->decrRef(); nodeE->decrRef();
479       e2=buildArcOfCircle(center2,1.,M_PI+k*M_PI/4.+0.7,M_PI+k*M_PI/4.-0.7);
480       intersector=new ArcCArcCIntersector(*e1,*e2);
481       bool order;
482       bool obvious,areOverlapped;
483       intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
484       CPPUNIT_ASSERT(!obvious && !areOverlapped);
485       CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
486       CPPUNIT_ASSERT(e1->getStartNode()==v4[0]);
487       v4[0]->decrRef(); v4[1]->decrRef();
488       v4.clear(); v3.clear();
489       delete intersector; e2->decrRef(); e1->decrRef();
490     }
491 }
492
493 void QuadraticPlanarInterpTest::IntersectArcCircleFull()
494 {
495   double center1[2]; center1[0]=0.;   center1[1]=0.;   double radius1=3.;
496   double center2[2]; center2[0]=0.75; center2[1]=-2.6; double radius2=1.;
497   EdgeArcCircle *e1=buildArcOfCircle(center1,radius1,-M_PI/3.,4.*M_PI/3.);
498   EdgeArcCircle *e2=buildArcOfCircle(center2,radius2,0.,M_PI/2.);
499   MergePoints commonNode;
500   QuadraticPolygon pol1; QuadraticPolygon pol2;
501   QuadraticPolygon pol3; QuadraticPolygon pol4;
502   pol3.pushBack(e1); pol4.pushBack(e2);
503   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol3.getPerimeter(),1e-6);
504   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol4.getPerimeter(),1e-6);
505   CPPUNIT_ASSERT_DOUBLES_EQUAL(19.6648305849,pol3.getArea(),1e-6);
506   CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.8146018366,pol4.getArea(),1e-6);
507   CPPUNIT_ASSERT(e1->intersectWith(e2,commonNode,pol1,pol2));
508   CPPUNIT_ASSERT_EQUAL(2,pol1.size());
509   CPPUNIT_ASSERT_EQUAL(2,pol2.size());
510   CPPUNIT_ASSERT_DOUBLES_EQUAL(19.6648305849,pol1.getArea(),1e-6);
511   CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.8146018366,pol2.getArea(),1e-6);
512   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol1.getPerimeter(),1e-6);
513   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol2.getPerimeter(),1e-6);
514   //
515   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
516   e2=buildArcOfCircle(center2,radius2,0.,M_PI/2.);
517   commonNode.clear();
518   QuadraticPolygon pol5; QuadraticPolygon pol6;
519   QuadraticPolygon pol7; QuadraticPolygon pol8;
520   pol7.pushBack(e1); pol8.pushBack(e2);
521   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol7.getPerimeter(),1e-6);
522   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol8.getPerimeter(),1e-6);
523   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol7.getArea(),1e-6);
524   CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.8146018366,pol8.getArea(),1e-6);
525   CPPUNIT_ASSERT(e1->intersectWith(e2,commonNode,pol5,pol6));
526   CPPUNIT_ASSERT_EQUAL(2,pol5.size());
527   CPPUNIT_ASSERT_EQUAL(2,pol6.size());
528   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol5.getArea(),1e-6);
529   CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.8146018366,pol6.getArea(),1e-6);
530   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol5.getPerimeter(),1e-6);
531   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol6.getPerimeter(),1e-6);
532   //
533   center2[0]=3.5; center2[1]=0.;
534   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
535   e2=buildArcOfCircle(center2,radius2,M_PI/2.,3*M_PI/2.);
536   commonNode.clear();
537   QuadraticPolygon pol9; QuadraticPolygon pol10;
538   QuadraticPolygon pol11; QuadraticPolygon pol12;
539   pol11.pushBack(e1); pol12.pushBack(e2);
540   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol11.getPerimeter(),1e-6);
541   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol12.getPerimeter(),1e-6);
542   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol11.getArea(),1e-6);
543   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol12.getArea(),1e-6);
544   CPPUNIT_ASSERT(e1->intersectWith(e2,commonNode,pol9,pol10));
545   CPPUNIT_ASSERT_EQUAL(3,pol9.size());
546   CPPUNIT_ASSERT_EQUAL(3,pol10.size());
547   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol9.getPerimeter(),1e-6);
548   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol10.getPerimeter(),1e-6);
549   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol9.getArea(),1e-6);
550   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5707963267949,pol10.getArea(),1e-6);
551   //
552   center2[0]=0.; center2[1]=0.; radius2=radius1;
553   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
554   e2=buildArcOfCircle(center2,radius2,M_PI/3.,2*M_PI/3.);
555   commonNode.clear();
556   QuadraticPolygon pol13; QuadraticPolygon pol14;
557   QuadraticPolygon pol15; QuadraticPolygon pol16;
558   pol15.pushBack(e1); pol16.pushBack(e2);
559   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol15.getPerimeter(),1e-6);
560   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol16.getPerimeter(),1e-6);
561   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol15.getArea(),1e-6);
562   CPPUNIT_ASSERT_DOUBLES_EQUAL(8.6095032974147,pol16.getArea(),1e-6);
563   CPPUNIT_ASSERT(e1->intersectWith(e2,commonNode,pol13,pol14));
564   CPPUNIT_ASSERT_EQUAL(3,pol13.size());
565   CPPUNIT_ASSERT_EQUAL(1,pol14.size());
566   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol13.getPerimeter(),1e-6);
567   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol13.getArea(),1e-6);
568   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol14.getPerimeter(),1e-6);
569   CPPUNIT_ASSERT_DOUBLES_EQUAL(8.6095032974147,pol14.getArea(),1e-6);
570   //
571   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
572   e2=buildArcOfCircle(center2,radius2,2*M_PI/3.,M_PI/3.);
573   commonNode.clear();
574   QuadraticPolygon pol17; QuadraticPolygon pol18;
575   QuadraticPolygon pol19; QuadraticPolygon pol20;
576   pol19.pushBack(e1); pol20.pushBack(e2);
577   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol19.getPerimeter(),1e-6);
578   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol20.getPerimeter(),1e-6);
579   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol19.getArea(),1e-6);
580   CPPUNIT_ASSERT_DOUBLES_EQUAL(-8.6095032974147,pol20.getArea(),1e-6);
581   CPPUNIT_ASSERT(e1->intersectWith(e2,commonNode,pol17,pol18));
582   CPPUNIT_ASSERT_EQUAL(3,pol17.size());
583   CPPUNIT_ASSERT_EQUAL(1,pol18.size());
584   CPPUNIT_ASSERT_DOUBLES_EQUAL(15.707963267948966,pol17.getPerimeter(),1e-6);
585   CPPUNIT_ASSERT_DOUBLES_EQUAL(-19.6648305849,pol17.getArea(),1e-6);
586   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415926535897931,pol18.getPerimeter(),1e-6);
587   CPPUNIT_ASSERT_DOUBLES_EQUAL(-8.6095032974147,pol18.getArea(),1e-6);
588   //no intersection #1
589   center2[0]=4.277; center2[1]=-4.277;
590   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
591   e2=buildArcOfCircle(center2,radius2,M_PI/4.,5*M_PI/4.);
592   QuadraticPolygon polTemp1; QuadraticPolygon polTemp2;
593   CPPUNIT_ASSERT(!e1->intersectWith(e2,commonNode,polTemp1,polTemp2));
594   e1->decrRef(); e2->decrRef();
595   //no intersection #2
596   center2[0]=1.; center2[1]=-1.; radius2=0.2;
597   e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
598   e2=buildArcOfCircle(center2,radius2,M_PI/4.,5*M_PI/4.);
599   CPPUNIT_ASSERT(!e1->intersectWith(e2,commonNode,polTemp1,polTemp2));
600   e1->decrRef(); e2->decrRef();
601 }
602
603 void QuadraticPlanarInterpTest::IntersectArcCircleSegumentBase()
604 {
605   double center[2]={2.,2.};
606   EdgeArcCircle *e1=buildArcOfCircle(center,2.3,M_PI/4.,5.*M_PI/4.);
607   EdgeLin *e2=new EdgeLin(-1.3,1.,3.,5.3);
608   EdgeIntersector *intersector=new ArcCSegIntersector(*e1,*e2);
609   bool order;
610   bool obvious,areOverlapped;
611   intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
612   CPPUNIT_ASSERT(!obvious && !areOverlapped);
613   std::vector<Node *> v4;
614   MergePoints v3;
615   CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(!order); CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
616   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.,(*v4[0])[0],1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.3,(*v4[0])[1],1e-10);
617   CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.3,(*v4[1])[0],1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL(2.,(*v4[1])[1],1e-10);
618   v4[0]->decrRef(); v4[1]->decrRef(); e2->decrRef(); v3.clear(); v4.clear(); delete intersector;
619   //
620   e2=new EdgeLin(3.,5.3,-1.3,1.);
621   intersector=new ArcCSegIntersector(*e1,*e2);
622   intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped); CPPUNIT_ASSERT(!obvious && !areOverlapped);
623   CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(2,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
624   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.,(*v4[0])[0],1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.3,(*v4[0])[1],1e-10);
625   CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.3,(*v4[1])[0],1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL(2.,(*v4[1])[1],1e-10);
626   v4[0]->decrRef(); v4[1]->decrRef(); e2->decrRef(); v3.clear(); v4.clear(); delete intersector;
627   // tangent intersection
628   e2=new EdgeLin(-1.,4.3,3.,4.3);
629   intersector=new ArcCSegIntersector(*e1,*e2);
630   intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped); CPPUNIT_ASSERT(!obvious && !areOverlapped);
631   CPPUNIT_ASSERT(intersector->intersect(0,v4,order,v3)); CPPUNIT_ASSERT(order); CPPUNIT_ASSERT_EQUAL(1,(int)v4.size()); CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
632   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.,(*v4[0])[0],1e-10); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.3,(*v4[0])[1],1e-10);
633   v4[0]->decrRef(); e2->decrRef(); v3.clear(); delete intersector;
634   // no intersection
635   e2=new EdgeLin(-2.,-2.,-1.,-3.);
636   intersector=new ArcCSegIntersector(*e1,*e2);
637   intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped); CPPUNIT_ASSERT(obvious && !areOverlapped);
638   e2->decrRef(); v3.clear(); delete intersector;
639   //
640   e1->decrRef();
641 }
642
643 QuadraticPolygon *QuadraticPlanarInterpTest::buildQuadraticPolygonCoarseInfo(const double *coords, const int *conn, int lgth)
644 {
645   std::vector<INTERP_KERNEL::Node *> nodes;
646   for(int i=0;i<lgth;i++)
647     nodes.push_back(new INTERP_KERNEL::Node(coords[2*conn[i]],coords[2*conn[i]+1]));
648   return INTERP_KERNEL::QuadraticPolygon::BuildArcCirclePolygon(nodes);
649 }
650
651 EdgeArcCircle *QuadraticPlanarInterpTest::buildArcOfCircle(const double *center, double radius, double alphaStart, double alphaEnd)
652 {
653   double alphaM=(alphaStart+alphaEnd)/2;
654   return new EdgeArcCircle(center[0]+cos(alphaStart)*radius,center[1]+sin(alphaStart)*radius,
655                            center[0]+cos(alphaM)*radius,center[1]+sin(alphaM)*radius,
656                            center[0]+cos(alphaEnd)*radius,center[1]+sin(alphaEnd)*radius);
657 }
658
659 double QuadraticPlanarInterpTest::btw2NodesAndACenter(const Node& n1, const Node& n2, const double *center)
660 {
661   const double *n1Pt=n1;
662   const double *n2Pt=n2;
663   double tmp1[2],tmp2[2];
664   tmp1[0]=n1Pt[0]-center[0]; tmp1[1]=n1Pt[1]-center[1];
665   tmp2[0]=n2Pt[0]-center[0]; tmp2[1]=n2Pt[1]-center[1];
666   double distTmp1=sqrt(tmp1[0]*tmp1[0]+tmp1[1]*tmp1[1]);
667   double distTmp2=sqrt(tmp2[0]*tmp2[0]+tmp2[1]*tmp2[1]);
668   double ret=acos((tmp1[0]*tmp2[0]+tmp1[1]*tmp2[1])/(distTmp1*distTmp2));
669   if(tmp1[0]*tmp2[1]-tmp1[1]*tmp2[0]<0)
670     ret=-ret;
671   return ret;
672 }
673
674 }