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