1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "QuadraticPlanarInterpTest.hxx"
21 #include "InterpKernelGeo2DQuadraticPolygon.hxx"
22 #include "InterpKernelGeo2DEdgeArcCircle.hxx"
23 #include "InterpKernelGeo2DEdgeLin.hxx"
29 using namespace INTERP_KERNEL;
34 static const double ADMISSIBLE_ERROR = 1.e-14;
36 void QuadraticPlanarInterpTest::IntersectArcCircleBase()
38 double center[2]={0.5,0.5};
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);
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);
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);//<<
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);
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);
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);
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);
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);
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);
103 // ArcCArcCIntersector
105 TypeOfLocInEdge where1,where2;
106 std::vector<Node *> v4;
109 ArcCArcCIntersector *intersector=0;
110 for(unsigned k=0;k<8;k++)
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();
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();
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();
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();
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();
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();
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++)
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);
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++)
172 v4.clear(); v3.clear();
173 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
197 v4.clear(); v3.clear();
198 delete intersector; e2->decrRef(); e1->decrRef();
200 // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Same order.
201 for(unsigned k=0;k<8;k++)
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);
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++)
222 v4.clear(); v3.clear();
223 delete intersector; e2->decrRef(); e1->decrRef();
225 // 2 intersections R1>R2 ; dist(circle1,circle2)<R1; Opp order.
226 for(unsigned k=0;k<8;k++)
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);
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++)
247 v4.clear(); v3.clear();
248 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
272 v4.clear(); v3.clear();
273 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
297 v4.clear(); v3.clear();
298 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
322 v4.clear(); v3.clear();
323 delete intersector; e2->decrRef(); e1->decrRef();
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++)
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);
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++)
347 v4.clear(); v3.clear();
348 delete intersector; e2->decrRef(); e1->decrRef();
350 // Tangent intersection
351 QUADRATIC_PLANAR::setPrecision(1e-5);
352 for(unsigned k=0;k<8;k++)
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);
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++)
369 v4.clear(); v4.clear();
370 delete intersector; e2->decrRef(); e1->decrRef();
372 QUADRATIC_PLANAR::setPrecision(1e-14);
374 for(unsigned k=0;k<8;k++)
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);
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();
390 for(unsigned k=0;k<8;k++)
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);
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();
407 for(unsigned k=0;k<8;k++)
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);
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]);
422 v4.clear(); v3.clear();
423 delete intersector; e2->decrRef(); e1->decrRef();
426 for(unsigned k=0;k<8;k++)
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);
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();
444 for(unsigned k=0;k<8;k++)
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);
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]);
464 v4.clear(); v3.clear();
465 delete intersector; e2->decrRef(); e1->decrRef();
468 for(unsigned k=0;k<8;k++)
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);
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();
493 void QuadraticPlanarInterpTest::IntersectArcCircleFull()
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);
515 e1=buildArcOfCircle(center1,radius1,-2*M_PI/3.,-7.*M_PI/3.);
516 e2=buildArcOfCircle(center2,radius2,0.,M_PI/2.);
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);
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.);
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);
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.);
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);
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.);
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);
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();
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();
603 void QuadraticPlanarInterpTest::IntersectArcCircleSegumentBase()
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);
610 bool obvious,areOverlapped;
611 intersector->areOverlappedOrOnlyColinears(0,obvious,areOverlapped);
612 CPPUNIT_ASSERT(!obvious && !areOverlapped);
613 std::vector<Node *> v4;
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;
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;
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;
643 QuadraticPolygon *QuadraticPlanarInterpTest::buildQuadraticPolygonCoarseInfo(const double *coords, const int *conn, int lgth)
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);
651 EdgeArcCircle *QuadraticPlanarInterpTest::buildArcOfCircle(const double *center, double radius, double alphaStart, double alphaEnd)
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);
659 double QuadraticPlanarInterpTest::btw2NodesAndACenter(const Node& n1, const Node& n2, const double *center)
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)