1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "QuadraticPlanarInterpTest.hxx"
20 #include "QuadraticPolygon.hxx"
21 #include "EdgeArcCircle.hxx"
22 #include "EdgeLin.hxx"
29 using namespace INTERP_KERNEL;
31 static const double ADMISSIBLE_ERROR = 1.e-14;
33 void QuadraticPlanarInterpTest::IntersectArcCircleBase()
35 double center[2]={0.5,0.5};
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);
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);
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);//<<
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);
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);
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);
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);
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);
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);
100 // ArcCArcCIntersector
102 TypeOfLocInEdge where1,where2;
106 ArcCArcCIntersector *intersector=0;
107 for(unsigned k=0;k<8;k++)
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();
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();
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();
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();
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();
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();
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++)
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);
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++)
169 v4.clear(); v3.clear();
170 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
194 v4.clear(); v3.clear();
195 delete intersector; e2->decrRef(); e1->decrRef();
197 // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Same order.
198 for(unsigned k=0;k<8;k++)
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);
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++)
219 v4.clear(); v3.clear();
220 delete intersector; e2->decrRef(); e1->decrRef();
222 // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Opp order.
223 for(unsigned k=0;k<8;k++)
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);
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++)
244 v4.clear(); v3.clear();
245 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
269 v4.clear(); v3.clear();
270 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
294 v4.clear(); v3.clear();
295 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
319 v4.clear(); v3.clear();
320 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
344 v4.clear(); v3.clear();
345 delete intersector; e2->decrRef(); e1->decrRef();
347 // Tangent intersection
348 QUADRATIC_PLANAR::setPrecision(1e-5);
349 for(unsigned k=0;k<8;k++)
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);
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++)
366 v4.clear(); v4.clear();
367 delete intersector; e2->decrRef(); e1->decrRef();
369 QUADRATIC_PLANAR::setPrecision(1e-14);
371 for(unsigned k=0;k<8;k++)
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);
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();
387 for(unsigned k=0;k<8;k++)
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);
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();
404 for(unsigned k=0;k<8;k++)
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);
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]);
419 v4.clear(); v3.clear();
420 delete intersector; e2->decrRef(); e1->decrRef();
423 for(unsigned k=0;k<8;k++)
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);
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();
441 for(unsigned k=0;k<8;k++)
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);
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]);
461 v4.clear(); v3.clear();
462 delete intersector; e2->decrRef(); e1->decrRef();
465 for(unsigned k=0;k<8;k++)
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);
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();
490 void QuadraticPlanarInterpTest::IntersectArcCircleFull()
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);
512 e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
513 e2=buildArcOfCircle(center2,radius2,0.,M_PI/2.);
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);
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.);
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);
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.);
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);
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.);
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);
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();
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();
600 void QuadraticPlanarInterpTest::IntersectArcCircleSegumentBase()
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);
607 bool obvious,areOverlapped;
608 intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
609 CPPUNIT_ASSERT(!obvious && !areOverlapped);
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;
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;
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;
640 QuadraticPolygon *QuadraticPlanarInterpTest::buildQuadraticPolygonCoarseInfo(const double *coords, const int *conn, int lgth)
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);
648 EdgeArcCircle *QuadraticPlanarInterpTest::buildArcOfCircle(const double *center, double radius, double alphaStart, double alphaEnd)
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);
656 double QuadraticPlanarInterpTest::btw2NodesAndACenter(const Node& n1, const Node& n2, const double *center)
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)