Salome HOME
Merge from BR_V5_DEV 16Feb09
[tools/medcoupling.git] / src / INTERP_KERNELTest / QuadraticPlanarInterpTest.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 "ElementaryEdge.hxx"
23 #include "ComposedEdge.hxx"
24 #include "EdgeLin.hxx"
25
26 #include <sstream>
27 #include <iostream>
28
29 using namespace std;
30 using namespace INTERP_KERNEL;
31
32 static const double ADMISSIBLE_ERROR = 1.e-14;
33
34 void QuadraticPlanarInterpTest::setUp()
35 {
36 }
37
38 void QuadraticPlanarInterpTest::tearDown()
39 {
40 }
41
42 void QuadraticPlanarInterpTest::cleanUp()
43 {
44 }
45
46 void QuadraticPlanarInterpTest::ReadWriteInXfigElementary()
47 {
48   //Testing bounds calculation. For Seg2
49   istringstream stream("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n3200 3400 4500 4700");
50   EdgeLin *e1=new EdgeLin(stream);
51   Bounds bound=e1->getBounds();
52   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.32,bound[0],ADMISSIBLE_ERROR);
53   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.45,bound[1],ADMISSIBLE_ERROR);
54   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.34,bound[2],ADMISSIBLE_ERROR);
55   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.47,bound[3],ADMISSIBLE_ERROR);
56   e1->decrRef();
57   istringstream stream2("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n4500 4700 3200 3400");
58   e1=new EdgeLin(stream2);
59   bound=e1->getBounds();
60   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.32,bound[0],ADMISSIBLE_ERROR);
61   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.45,bound[1],ADMISSIBLE_ERROR);
62   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.34,bound[2],ADMISSIBLE_ERROR);
63   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.47,bound[3],ADMISSIBLE_ERROR);
64   e1->decrRef();
65   //Testing bounds calculation For Arc of circle.
66   
67 }
68
69 void QuadraticPlanarInterpTest::ReadWriteInXfigGlobal()
70 {
71   string dataBaseDir(getenv("MED_ROOT_DIR"));
72   dataBaseDir+="/share/salome/resources/med/";
73   string tmp;
74   tmp=dataBaseDir; tmp+="Pol1.fig";
75   QuadraticPolygon pol1(tmp.c_str());
76   pol1.dumpInXfigFile("Pol1_gen.fig");
77   tmp=dataBaseDir; tmp+="Pol2.fig";
78   QuadraticPolygon pol2(tmp.c_str());
79   pol2.dumpInXfigFile("Pol2_gen.fig");
80   tmp=dataBaseDir; tmp+="Pol3.fig";
81   QuadraticPolygon pol3(tmp.c_str());
82   pol3.dumpInXfigFile("Pol3_gen.fig");
83   tmp=dataBaseDir; tmp+="Pol4.fig";
84   QuadraticPolygon pol4(tmp.c_str());
85   CPPUNIT_ASSERT_EQUAL(1,pol4.size());
86   ElementaryEdge *edge1=dynamic_cast<ElementaryEdge *>(pol4[0]);
87   CPPUNIT_ASSERT(edge1);
88   Edge *edge2=edge1->getPtr();
89   EdgeArcCircle *edge=dynamic_cast<EdgeArcCircle *>(edge2);
90   CPPUNIT_ASSERT(edge);
91   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.24375,edge->getRadius(),ADMISSIBLE_ERROR);
92   CPPUNIT_ASSERT_DOUBLES_EQUAL(5.7857653289925404,edge->getAngle(),ADMISSIBLE_ERROR);
93   double center[2];
94   edge->getCenter(center);
95   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.48,center[0],ADMISSIBLE_ERROR);
96   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.48375,center[1],ADMISSIBLE_ERROR);
97   const double *start=*edge->getStartNode();
98   Node *n1=new Node(start[0]+2*(center[0]-start[0]),start[1]+2*(center[1]-start[1]));
99   edge->changeMiddle(n1);
100   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.24375,edge->getRadius(),ADMISSIBLE_ERROR);
101   CPPUNIT_ASSERT_DOUBLES_EQUAL(5.7857653289925404,edge->getAngle(),ADMISSIBLE_ERROR);
102   n1->decrRef();
103   n1=new Node(center[0],center[1]+0.24375);
104   edge->changeMiddle(n1);
105   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.24375,edge->getRadius(),ADMISSIBLE_ERROR);
106   CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.49741997818704586,edge->getAngle(),ADMISSIBLE_ERROR);//5.7857653289925404 + 2*PI
107   n1->decrRef();
108   //A half circle.
109   EdgeArcCircle *e=new EdgeArcCircle(0.84,0.54,0.78,0.6,0.84,0.66);
110   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.06,e->getRadius(),ADMISSIBLE_ERROR);
111   CPPUNIT_ASSERT_DOUBLES_EQUAL(-3.1415925921507317,e->getAngle(),1e-5);
112   e->decrRef();
113   e=new EdgeArcCircle(0.84,0.54,0.9,0.6,0.84,0.66);
114   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.06,e->getRadius(),ADMISSIBLE_ERROR);
115   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1415925921507317,e->getAngle(),1e-5);
116   e->decrRef();
117 }
118
119 void QuadraticPlanarInterpTest::BasicGeometricTools()
120 {
121   Node *n1=new Node(1.,1.);
122   Node *n2=new Node(4.,2.);
123   EdgeLin *e1=new EdgeLin(n1,n2);
124   double tmp[2];
125   e1->getNormalVector(tmp);
126   CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.94868329805051377,tmp[1],ADMISSIBLE_ERROR);
127   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.31622776601683794,tmp[0],ADMISSIBLE_ERROR);
128   e1->decrRef();
129   n1->decrRef(); n2->decrRef();
130   n1=new Node(1.,1.);
131   n2=new Node(0.,4.);
132   e1=new EdgeLin(n1,n2);
133   double tmp2[2];
134   e1->getNormalVector(tmp2);
135   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,Node::dot(tmp,tmp2),1e-10);
136   tmp[0]=0.5; tmp[1]=2.5;
137   CPPUNIT_ASSERT(e1->isNodeLyingOn(tmp));
138   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,e1->getDistanceToPoint(tmp),1e-12);
139   tmp[1]=2.55; CPPUNIT_ASSERT(!e1->isNodeLyingOn(tmp));
140   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0158113883008418,e1->getDistanceToPoint(tmp),1e-12);
141   tmp[0]=0.; tmp[1]=5.;
142   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.,e1->getDistanceToPoint(tmp),1e-12);
143   EdgeArcCircle *e=new EdgeArcCircle(4.,3.,0.,5.,-5.,0.);
144   tmp[0]=-4.; tmp[1]=3.;
145   CPPUNIT_ASSERT(e->isNodeLyingOn(tmp));
146   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,e->getDistanceToPoint(tmp),1e-12);
147   tmp[1]=3.1; CPPUNIT_ASSERT(!e->isNodeLyingOn(tmp));
148   CPPUNIT_ASSERT_DOUBLES_EQUAL(6.0632371551998077e-2,e->getDistanceToPoint(tmp),1e-12);
149   tmp[0]=-4.; tmp[1]=-3.;
150   CPPUNIT_ASSERT(!e->isNodeLyingOn(tmp));
151   CPPUNIT_ASSERT_DOUBLES_EQUAL(3.1622776601683795,e->getDistanceToPoint(tmp),1e-12);
152   e->decrRef();
153   e1->decrRef();
154   n1->decrRef(); n2->decrRef();
155 }
156
157 void QuadraticPlanarInterpTest::IntersectionBasics()
158 {
159   //Testing intersection of Bounds.
160   istringstream stream1("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n3200 3400 4500 4800");
161   EdgeLin *e1=new EdgeLin(stream1);
162   istringstream stream2("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n3200 3400 4500 4800");
163   EdgeLin *e2=new EdgeLin(stream2);
164   Bounds *bound=e1->getBounds().amIIntersectingWith(e2->getBounds()); CPPUNIT_ASSERT(bound);
165   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.32,(*bound)[0],ADMISSIBLE_ERROR);
166   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.45,(*bound)[1],ADMISSIBLE_ERROR);
167   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.34,(*bound)[2],ADMISSIBLE_ERROR);
168   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.48,(*bound)[3],ADMISSIBLE_ERROR);
169   delete bound;
170   e2->decrRef(); e1->decrRef();
171   //
172   istringstream stream3("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n3000 7200 6000 3700");
173   EdgeLin *e3=new EdgeLin(stream3);
174   istringstream stream4("2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2\n4800 6600 7200 4200");
175   EdgeLin *e4=new EdgeLin(stream4);
176   bound=e3->getBounds().amIIntersectingWith(e4->getBounds()); CPPUNIT_ASSERT(bound);
177   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.48,(*bound)[0],ADMISSIBLE_ERROR);
178   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.6,(*bound)[1],ADMISSIBLE_ERROR);
179   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.42,(*bound)[2],ADMISSIBLE_ERROR);
180   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.66,(*bound)[3],ADMISSIBLE_ERROR);
181   delete bound;
182   e3->decrRef(); e4->decrRef();
183 }
184
185 void QuadraticPlanarInterpTest::EdgeLinUnitary()
186 {
187   EdgeLin *e1=new EdgeLin(0.5,0.5,3.7,4.1);
188   Node *n=new Node(2.1,2.3);
189   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getCharactValue(*n),0.5,1e-8);
190   n->decrRef();
191   n=new Node(3.7,4.1);
192   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getCharactValue(*n),1.,1e-8);
193   n->decrRef();
194   n=new Node(0.5,0.5);
195   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getCharactValue(*n),0.,1e-8);
196   n->decrRef();
197   n=new Node(-1.1,-1.3);
198   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getCharactValue(*n),-0.5,1e-8);
199   n->decrRef();
200   n=new Node(5.3,5.9);
201   CPPUNIT_ASSERT_DOUBLES_EQUAL(e1->getCharactValue(*n),1.5,1e-8);
202   n->decrRef(); e1->decrRef();
203 }
204
205 /*!
206  * Here two things are tested. 
207  * 1 ) One the overlapping calculation capability of edge/edge intersector.
208  * 2 ) Then the capability to handle the case where 2 segs (whatever their type) are overlapped.
209  * All the configuration of full or part overlapping have been tested.
210  */
211 void QuadraticPlanarInterpTest::IntersectionEdgeOverlapUnitarySegSeg()
212 {
213   ComposedEdge& v1=*(new ComposedEdge);
214   ComposedEdge& v2=*(new ComposedEdge);
215   MergePoints v3;
216   //Testing merge of geometric equals seg2.
217   Edge *e1=new EdgeLin(0.5,0.5,1.,1.); Edge *e2=new EdgeLin(0.5,0.5,1.,1.);
218   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
219   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
220   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size()); CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
221   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection());
222   v1.clear(); v2.clear(); v3.clear();
223   //  - testing by adding some noise
224   e1->decrRef(); e1=new EdgeLin(0.5+5.e-15,0.5-5.e-15,1.,1.+7.e-15);
225   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
226   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
227   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size()); CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
228   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection());
229   e2->decrRef(); e1->decrRef();
230   v1.clear(); v2.clear(); v3.clear();
231   //Testing merge of geometric equals seg2 but now with opposite direction
232   e1=new EdgeLin(0.5,0.5,0.7,0.7); e2=new EdgeLin(0.7+6.e-15,0.7-2.e-15,0.5+3.e-15,0.5-4.e-15);
233   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
234   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
235   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size()); CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
236   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && !v2[0]->getDirection());//compared 8 lines above !v2[0]->getDirection()
237   e2->decrRef(); e1->decrRef();
238   v1.clear(); v2.clear(); v3.clear();
239   //Test 0
240   //Test 1 - OUT_AFTER - OUT_AFTER | same dir. - 0°
241   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(1.5,0.,2.,0.);
242   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
243   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
244   CPPUNIT_ASSERT_EQUAL(0,(int)v1.size());
245   CPPUNIT_ASSERT_EQUAL(0,(int)v2.size());
246   e2->decrRef(); e1->decrRef();
247   v1.clear(); v2.clear(); v3.clear();
248   //Test 2 - INSIDE - OUT_AFTER | same dir. - 0°
249   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(0.5,0.,1.5,0.);
250   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
251   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
252   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
253   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
254   CPPUNIT_ASSERT(v1[1]->intresicEqualDirSensitive(v2[0]));
255   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
256   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode()); CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
257   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
258   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
259   e2->decrRef(); e1->decrRef();
260   v1.clear(); v2.clear(); v3.clear();
261   //Test 2 - INSIDE - OUT_AFTER | same dir. - 90°
262   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,0.5,0.,1.5);
263   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
264   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
265   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
266   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
267   CPPUNIT_ASSERT(v1[1]->intresicEqualDirSensitive(v2[0]));
268   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
269   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode()); CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
270   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
271   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
272   e2->decrRef(); e1->decrRef();
273   v1.clear(); v2.clear(); v3.clear();
274   //Test 2 - INSIDE - OUT_AFTER | same dir. - 45°
275   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.5,0.5,1.5,1.5);
276   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
277   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
278   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
279   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
280   CPPUNIT_ASSERT(v1[1]->intresicEqualDirSensitive(v2[0]));
281   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
282   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode()); CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
283   e2->decrRef(); e1->decrRef();
284   v1.clear(); v2.clear(); v3.clear();
285   //Test 2 - INSIDE - OUT_AFTER | opp. dir. - 45°
286   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(1.5,1.5,0.5,0.5);
287   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
288   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
289   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
290   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
291   CPPUNIT_ASSERT(!v1[1]->intresicEqualDirSensitive(v2[1]) && v1[1]->intresicEqual(v2[1]));
292   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
293   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode()); CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
294   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
295   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
296   e2->decrRef(); e1->decrRef();
297   v1.clear(); v2.clear(); v3.clear();
298   //Test 3 - INSIDE - INSIDE | same dir. - 0°
299   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(0.25,0.,0.75,0.);
300   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
301   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
302   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
303   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
304   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection());
305   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==v1[2]->getStartNode());
306   CPPUNIT_ASSERT(v1[0]->getStartNode()== e1->getStartNode()); CPPUNIT_ASSERT(v1[2]->getEndNode()== e1->getEndNode());
307   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getEndNode());
308   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
309   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
310   e2->decrRef(); e1->decrRef();
311   v1.clear(); v2.clear(); v3.clear();
312   //Test 3 - INSIDE - INSIDE | same dir. - 90°
313   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,0.25,0.,0.75);
314   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
315   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
316   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
317   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
318   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection());
319   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==v1[2]->getStartNode());
320   CPPUNIT_ASSERT(v1[0]->getStartNode()== e1->getStartNode()); CPPUNIT_ASSERT(v1[2]->getEndNode()== e1->getEndNode());
321   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getEndNode());
322   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
323   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
324   e2->decrRef(); e1->decrRef();
325   v1.clear(); v2.clear(); v3.clear();
326   //Test 3 - INSIDE - INSIDE | same dir. - 45°
327   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.25,0.25,0.75,0.75);
328   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
329   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
330   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
331   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
332   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection());
333   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==v1[2]->getStartNode());
334   CPPUNIT_ASSERT(v1[0]->getStartNode()== e1->getStartNode()); CPPUNIT_ASSERT(v1[2]->getEndNode()== e1->getEndNode());
335   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getEndNode());
336   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
337   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
338   e2->decrRef(); e1->decrRef();
339   v1.clear(); v2.clear(); v3.clear();
340   //Test 3 - INSIDE - INSIDE | opp dir. - 45°
341   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.75,0.75,0.25,0.25);
342   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
343   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
344   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
345   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
346   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && !v1[1]->getDirection());
347   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==v1[2]->getStartNode());
348   CPPUNIT_ASSERT(v1[0]->getStartNode()== e1->getStartNode()); CPPUNIT_ASSERT(v1[2]->getEndNode()== e1->getEndNode());
349   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getEndNode()); CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getStartNode());
350   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
351   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
352   e2->decrRef(); e1->decrRef();
353   v1.clear(); v2.clear(); v3.clear();
354   //Test 3bis - INSIDE - INSIDE - Bis | opp dir.
355   double center[2]={0.,0.};
356   double radius=1.;
357   e1=buildArcOfCircle(center,radius,-M_PI,0); e2=buildArcOfCircle(center,radius,-2*M_PI/3.+2*M_PI,-M_PI/3.);
358   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(5.*M_PI/3.,e2->getCurveLength(),1e-12);// To check that in the previous line +2.M_PI has done its job.
359   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
360   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
361   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
362   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
363   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(v2[0]->getPtr())); CPPUNIT_ASSERT(v1[0]->getDirection()); CPPUNIT_ASSERT(!v2[0]->getDirection());
364   CPPUNIT_ASSERT(v1[2]->intresincEqCoarse(v2[2]->getPtr())); CPPUNIT_ASSERT(v1[2]->getDirection()); CPPUNIT_ASSERT(!v2[2]->getDirection());
365   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-12);
366   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[1]->getCurveLength(),1.e-12);
367   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getStartNode());
368   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getEndNode());
369   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
370   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getStartNode());
371   CPPUNIT_ASSERT(v1[1]->getStartNode()==e2->getStartNode());
372   CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getEndNode());
373   e2->decrRef(); e1->decrRef();
374   v1.clear(); v2.clear(); v3.clear();
375   //Test 3bis - INSIDE - INSIDE - Bis | same dir.
376   e1=buildArcOfCircle(center,radius,-M_PI,0); e2=buildArcOfCircle(center,radius,-M_PI/3.,-2*M_PI/3.+2*M_PI);
377   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(5.*M_PI/3.,e2->getCurveLength(),1e-12);// To check that in the previous line +2.M_PI has done its job.
378   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
379   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
380   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
381   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
382   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(v2[2]->getPtr())); CPPUNIT_ASSERT(v1[0]->getDirection()); CPPUNIT_ASSERT(v2[2]->getDirection());
383   CPPUNIT_ASSERT(v1[2]->intresincEqCoarse(v2[0]->getPtr())); CPPUNIT_ASSERT(v1[2]->getDirection()); CPPUNIT_ASSERT(v2[0]->getDirection());
384   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-12);
385   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[1]->getCurveLength(),1.e-12);
386   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getEndNode());
387   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getStartNode());
388   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
389   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getEndNode());
390   CPPUNIT_ASSERT(v1[1]->getStartNode()==e2->getEndNode());
391   CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getStartNode());
392   e2->decrRef(); e1->decrRef();
393   v1.clear(); v2.clear(); v3.clear();
394   //Test 3bis - INSIDE - INSIDE - Bis | opp dir. | e1<->e2 to test symetry
395   e1=buildArcOfCircle(center,radius,-M_PI,0); e2=buildArcOfCircle(center,radius,-2*M_PI/3.+2*M_PI,-M_PI/3.);
396   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(5.*M_PI/3.,e2->getCurveLength(),1e-12);// To check that in the previous line +2.M_PI has done its job.
397   CPPUNIT_ASSERT(e2->intersectWith(e1,v3,v2,v1));
398   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
399   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
400   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
401   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(v2[0]->getPtr())); CPPUNIT_ASSERT(!v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->getDirection());
402   CPPUNIT_ASSERT(v1[2]->intresincEqCoarse(v2[2]->getPtr())); CPPUNIT_ASSERT(!v1[2]->getDirection()); CPPUNIT_ASSERT(v2[2]->getDirection());
403   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-5); // << not maximal precision because node switching 
404   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[1]->getCurveLength(),1.e-12);
405   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getStartNode());
406   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getEndNode());
407   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
408   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getStartNode());
409   CPPUNIT_ASSERT(v1[1]->getStartNode()==e2->getStartNode());
410   CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getEndNode());
411   e2->decrRef(); e1->decrRef();
412   v1.clear(); v2.clear(); v3.clear();
413   //Test 3bis - INSIDE - INSIDE - Bis | same dir. | e1<->e2 to test symetry
414   e1=buildArcOfCircle(center,radius,-M_PI,0); e2=buildArcOfCircle(center,radius,-M_PI/3.,-2*M_PI/3.+2*M_PI);
415   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(5.*M_PI/3.,e2->getCurveLength(),1e-12);// To check that in the previous line +2.M_PI has done its job.
416   CPPUNIT_ASSERT(e2->intersectWith(e1,v3,v2,v1));
417   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
418   CPPUNIT_ASSERT_EQUAL(3,(int)v1.size());
419   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
420   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(v2[2]->getPtr())); CPPUNIT_ASSERT(v1[0]->getDirection()); CPPUNIT_ASSERT(v2[2]->getDirection());
421   CPPUNIT_ASSERT(v1[2]->intresincEqCoarse(v2[0]->getPtr())); CPPUNIT_ASSERT(v1[2]->getDirection()); CPPUNIT_ASSERT(v2[0]->getDirection());
422   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-5); // << not maximal precision because node switching 
423   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[1]->getCurveLength(),1.e-12);
424   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getEndNode());
425   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getStartNode());
426   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
427   CPPUNIT_ASSERT(v1[0]->getEndNode()==e2->getEndNode());
428   CPPUNIT_ASSERT(v1[1]->getStartNode()==e2->getEndNode());
429   CPPUNIT_ASSERT(v1[1]->getEndNode()==e2->getStartNode());
430   e2->decrRef(); e1->decrRef();
431   v1.clear(); v2.clear(); v3.clear();
432   //Test 4 - OUT_BEFORE - OUT_BEFORE | same dir. - 0 °
433   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(-1.,0.,-0.5,0.);
434   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
435   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
436   CPPUNIT_ASSERT_EQUAL(0,(int)v1.size());
437   CPPUNIT_ASSERT_EQUAL(0,(int)v2.size());
438   e2->decrRef(); e1->decrRef();
439   v1.clear(); v2.clear(); v3.clear();
440   //Test 5 - OUT_BEFORE - INSIDE | same dir. - 0°
441   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(-0.5,0.,0.5,0.);
442   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
443   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
444   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
445   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
446   CPPUNIT_ASSERT(v1[0]->intresicEqualDirSensitive(v2[1]));
447   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
448   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
449   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
450   e2->decrRef(); e1->decrRef();
451   v1.clear(); v2.clear(); v3.clear();
452   //Test 5 - OUT_BEFORE - INSIDE | same dir. - 90°
453   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0,-0.5,0.,0.5);
454   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
455   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
456   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
457   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
458   CPPUNIT_ASSERT(v1[0]->intresicEqualDirSensitive(v2[1]));
459   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
460   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
461   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
462   e2->decrRef(); e1->decrRef();
463   v1.clear(); v2.clear(); v3.clear();
464   //Test 5 - OUT_BEFORE - INSIDE | same dir. - 45°
465   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(-0.5,-0.5,0.5,0.5);
466   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
467   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
468   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
469   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
470   CPPUNIT_ASSERT(v1[0]->intresicEqualDirSensitive(v2[1]));
471   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
472   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
473   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
474   e2->decrRef(); e1->decrRef();
475   v1.clear(); v2.clear(); v3.clear();
476   //Test 5 - OUT_BEFORE - INSIDE | opp dir. - 45°
477   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.5,0.5,-0.5,-0.5);
478   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
479   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
480   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
481   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
482   CPPUNIT_ASSERT(!v1[0]->intresicEqualDirSensitive(v2[0]) && v1[0]->intresicEqual(v2[0]) );
483   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
484   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
485   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
486   e2->decrRef(); e1->decrRef();
487   v1.clear(); v2.clear(); v3.clear();
488   //Test 6 - OUT_BEFORE - OUT_AFTER | same dir. - 0°
489   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(-0.5,0.,1.5,0.);
490   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
491   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
492   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
493   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
494   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
495   CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
496   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode() && v2[1]->getEndNode()==v2[2]->getStartNode());
497   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
498   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
499   e2->decrRef(); e1->decrRef();
500   v1.clear(); v2.clear(); v3.clear();
501   //Test 6 - OUT_BEFORE - OUT_AFTER | same dir. - 90°
502   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,-0.5,0.,1.5);
503   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
504   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
505   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
506   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
507   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
508   CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
509   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode() && v2[1]->getEndNode()==v2[2]->getStartNode());
510   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
511   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
512   e2->decrRef(); e1->decrRef();
513   v1.clear(); v2.clear(); v3.clear();
514   //Test 6 - OUT_BEFORE - OUT_AFTER | same dir. - 45°
515   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(-0.5,-0.5,1.5,1.5);
516   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
517   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
518   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
519   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
520   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
521   CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
522   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode() && v2[1]->getEndNode()==v2[2]->getStartNode());
523   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
524   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
525   e2->decrRef(); e1->decrRef();
526   v1.clear(); v2.clear(); v3.clear();
527   //Test 6 - OUT_BEFORE - OUT_AFTER | opp dir. - 45°
528   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(1.5,1.5,-0.5,-0.5);
529   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
530   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
531   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
532   CPPUNIT_ASSERT_EQUAL(3,(int)v2.size());
533   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
534   CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && !v2[1]->getDirection());
535   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode() && v2[1]->getEndNode()==v2[2]->getStartNode());
536   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
537   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
538   e2->decrRef(); e1->decrRef();
539   v1.clear(); v2.clear(); v3.clear();
540   //Test 7 - END - OUT_AFTER | same dir. - 0°
541   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(1.,0.,1.5,0.);
542   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
543   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
544   CPPUNIT_ASSERT_EQUAL(0,(int)v1.size());
545   CPPUNIT_ASSERT_EQUAL(0,(int)v2.size());
546   e2->decrRef(); e1->decrRef();
547   v1.clear(); v2.clear(); v3.clear();
548   //Test 7 - END - OUT_AFTER | opp dir. - 0°
549   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(1.5,0.,1.,0.);
550   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
551   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
552   CPPUNIT_ASSERT_EQUAL(0,(int)v1.size());
553   CPPUNIT_ASSERT_EQUAL(0,(int)v2.size());
554   CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
555   e2->decrRef(); e1->decrRef();
556   v1.clear(); v2.clear(); v3.clear();
557   //Test 8 - START - END | same dir. - 0°
558   e1=new EdgeLin(0.,0.,0.7,0.); e2=new EdgeLin(0.,0.,0.7,0.);
559   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
560   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
561   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
562   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
563   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection());
564   CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
565   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
566   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
567   e2->decrRef(); e1->decrRef();
568   v1.clear(); v2.clear(); v3.clear();
569   //Test 8 - START - END | same dir. - 90°
570   e1=new EdgeLin(0.,0.,0.,0.7); e2=new EdgeLin(0.,0.,0.,0.7);
571   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
572   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
573   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
574   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
575   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection());
576   CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
577   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
578   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
579   e2->decrRef(); e1->decrRef();
580   v1.clear(); v2.clear(); v3.clear();
581   //Test 8 - START - END | same dir. - 45°
582   e1=new EdgeLin(0.,0.,0.7,0.7); e2=new EdgeLin(0.,0.,0.7,0.7);
583   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
584   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
585   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
586   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
587   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection());
588   CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
589   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
590   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
591   e2->decrRef(); e1->decrRef();
592   v1.clear(); v2.clear(); v3.clear();
593   //Test 8 - START - END | opp. dir. - 45°
594   e1=new EdgeLin(0.,0.,0.7,0.7); e2=new EdgeLin(0.7,0.7,0.,0.);
595   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
596   CPPUNIT_ASSERT_EQUAL(2,(int)v3.getNumberOfAssociations());
597   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
598   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
599   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && !v2[0]->getDirection());
600   CPPUNIT_ASSERT(e1->getStartNode()==e2->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getStartNode());
601   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
602   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
603   e2->decrRef(); e1->decrRef();
604   v1.clear(); v2.clear(); v3.clear();
605   //Test 9 - OUT_BEFORE - START | same dir.
606   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(-0.5,0.,0.,0.);
607   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
608   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
609   CPPUNIT_ASSERT_EQUAL(0,(int)v1.size());
610   CPPUNIT_ASSERT_EQUAL(0,(int)v2.size());
611   CPPUNIT_ASSERT(e2->getEndNode()==e1->getStartNode());
612   e2->decrRef(); e1->decrRef();
613   v1.clear(); v2.clear(); v3.clear();
614   //Test 10 - START - OUT_AFTER | same dir. - 0°
615   e1=new EdgeLin(0.,0.,0.7,0.); e2=new EdgeLin(0.,0.,1.,0.);
616   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
617   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
618   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
619   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
620   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection()); 
621   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(v2[1]->getEndNode()==e2->getEndNode());
622   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
623   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
624   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
625   e2->decrRef(); e1->decrRef();
626   v1.clear(); v2.clear(); v3.clear();
627   //Test 10 - START - OUT_AFTER | same dir. - 90°
628   e1=new EdgeLin(0.,0.,0.,0.7); e2=new EdgeLin(0.,0.,0.,1.);
629   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
630   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
631   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
632   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
633   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection()); 
634   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(v2[1]->getEndNode()==e2->getEndNode());
635   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
636   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
637   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
638   e2->decrRef(); e1->decrRef();
639   v1.clear(); v2.clear(); v3.clear();
640   //Test 10 - START - OUT_AFTER | same dir. - 45°
641   e1=new EdgeLin(0.,0.,0.7,0.7); e2=new EdgeLin(0.,0.,1.,1.);
642   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
643   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
644   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
645   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
646   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && v2[0]->getDirection()); 
647   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(v2[1]->getEndNode()==e2->getEndNode());
648   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
649   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
650   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
651   e2->decrRef(); e1->decrRef();
652   v1.clear(); v2.clear(); v3.clear();
653   //Test 10 - START - OUT_AFTER | opp dir. - 45°
654   e1=new EdgeLin(0.,0.,0.7,0.7); e2=new EdgeLin(1.,1.,0.,0.);
655   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
656   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
657   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
658   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
659   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && !v2[1]->getDirection()); 
660   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getEndNode()); CPPUNIT_ASSERT(v2[1]->getEndNode()==e2->getEndNode());
661   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
662   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
663   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
664   e2->decrRef(); e1->decrRef();
665   v1.clear(); v2.clear(); v3.clear();
666   //Test 11 - INSIDE - END | same dir. - 0°
667   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(0.7,0.,1.,0.);
668   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
669   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
670   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
671   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
672   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection()); 
673   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
674   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
675   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
676   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
677   e2->decrRef(); e1->decrRef();
678   v1.clear(); v2.clear(); v3.clear();
679   //Test 11 - INSIDE - END | same dir. - 90°
680   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,0.7,0.,1.);
681   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
682   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
683   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
684   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
685   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection()); 
686   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
687   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
688   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
689   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
690   e2->decrRef(); e1->decrRef();
691   v1.clear(); v2.clear(); v3.clear();
692   //Test 11 - INSIDE - END | same dir. - 45°
693   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.7,0.7,1.,1.);
694   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
695   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
696   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
697   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
698   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && v1[1]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection()); 
699   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode());
700   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
701   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
702   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
703   e2->decrRef(); e1->decrRef();
704   v1.clear(); v2.clear(); v3.clear();
705   //Test 11 - INSIDE - END | opp dir. - 45°
706   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(1.,1.,0.7,0.7);
707   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
708   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
709   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
710   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
711   CPPUNIT_ASSERT(e1->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getStartNode());
712   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(e2) && !v1[1]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection()); 
713   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
714   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
715   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
716   e2->decrRef(); e1->decrRef();
717   v1.clear(); v2.clear(); v3.clear();
718   //Test 12 - OUT_BEFORE - END | same dir. - 0°
719   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(-0.5,0.,1.,0.);
720   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
721   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
722   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
723   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
724   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
725   CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
726   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
727   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
728   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
729   e2->decrRef(); e1->decrRef();
730   v1.clear(); v2.clear(); v3.clear();
731   //Test 12 - OUT_BEFORE - END | same dir. - 90°
732   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,-0.5,0.,1.);
733   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
734   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
735   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
736   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
737   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
738   CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
739   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
740   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
741   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
742   e2->decrRef(); e1->decrRef();
743   v1.clear(); v2.clear(); v3.clear();
744   //Test 12 - OUT_BEFORE - END | same dir. - 45°
745   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(-0.5,-0.5,1.,1.);
746   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
747   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
748   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
749   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
750   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[1]->intresincEqCoarse(e1) && v2[1]->getDirection());
751   CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getEndNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
752   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
753   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
754   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
755   e2->decrRef(); e1->decrRef();
756   v1.clear(); v2.clear(); v3.clear();
757   //Test 12 - OUT_BEFORE - END | opp dir. - 45°
758   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(1.,1.,-0.5,-0.5);
759   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
760   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
761   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
762   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
763   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e1) && !v2[0]->getDirection());
764   CPPUNIT_ASSERT(e2->getStartNode()==v2[0]->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==e2->getStartNode()); CPPUNIT_ASSERT(e2->getEndNode()==v2[1]->getEndNode());
765   CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
766   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
767   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
768   e2->decrRef(); e1->decrRef();
769   v1.clear(); v2.clear(); v3.clear();
770   //Test 13 - START - INSIDE | same dir. - 0°
771   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(0.,0.,0.5,0.);
772   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
773   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
774   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
775   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
776   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e2) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
777   CPPUNIT_ASSERT(e2->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
778   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
779   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
780   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
781   e2->decrRef(); e1->decrRef();
782   v1.clear(); v2.clear(); v3.clear();
783   //Test 13 - START - INSIDE | same dir. - 90°
784   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,0.,0.,0.5);
785   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
786   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
787   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
788   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
789   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e2) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
790   CPPUNIT_ASSERT(e2->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
791   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
792   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
793   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
794   e2->decrRef(); e1->decrRef();
795   v1.clear(); v2.clear(); v3.clear();
796   //Test 13 - START - INSIDE | same dir. - 45°
797   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.,0.,0.5,0.5);
798   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
799   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
800   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
801   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
802   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e2) && v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
803   CPPUNIT_ASSERT(e2->getStartNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getStartNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
804   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
805   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
806   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
807   e2->decrRef(); e1->decrRef();
808   v1.clear(); v2.clear(); v3.clear();
809   //Test 13 - START - INSIDE | opp dir. - 45°
810   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.5,0.5,0.,0.);
811   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
812   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
813   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
814   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
815   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e2) && !v1[0]->getDirection()); CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
816   CPPUNIT_ASSERT(e2->getEndNode()==v1[0]->getStartNode()); CPPUNIT_ASSERT(e1->getStartNode()==e2->getEndNode()); CPPUNIT_ASSERT(e1->getEndNode()==v1[1]->getEndNode());
817   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode());
818   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
819   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
820   e2->decrRef(); e1->decrRef();
821   v1.clear(); v2.clear(); v3.clear();
822   //Test 14 - INSIDE - START | same dir.
823   e1=buildArcOfCircle(center,radius,-M_PI,2.*M_PI); e2=buildArcOfCircle(center,radius,M_PI/3.,-M_PI);
824   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.*M_PI/3.,e2->getCurveLength(),1e-12);
825   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
826   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
827   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
828   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
829   CPPUNIT_ASSERT(v1[1]->intresicEqual(v2[0]));
830   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getStartNode());
831   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
832   CPPUNIT_ASSERT(v1[1]->getEndNode()==e1->getEndNode());
833   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getEndNode());
834   CPPUNIT_ASSERT_DOUBLES_EQUAL(2*M_PI/3.,v1[0]->getCurveLength(),1.e-12);
835   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v2[0]->getCurveLength(),1.e-12);
836   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-12);
837   e2->decrRef(); e1->decrRef();
838   v1.clear(); v2.clear(); v3.clear();
839   //Test 14 - INSIDE - START | opp dir.
840   e1=buildArcOfCircle(center,radius,-M_PI,2.*M_PI); e2=buildArcOfCircle(center,radius,-M_PI,M_PI/3.);
841   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.*M_PI/3.,e2->getCurveLength(),1e-12);
842   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
843   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
844   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
845   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
846   CPPUNIT_ASSERT(v1[1]->intresincEqCoarse(v2[1]->getPtr()) && !v2[1]->getDirection() && v1[1]->getDirection());
847   CPPUNIT_ASSERT(v2[0]->getStartNode()==e1->getStartNode());
848   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
849   CPPUNIT_ASSERT(v1[1]->getEndNode()==e1->getEndNode());
850   CPPUNIT_ASSERT(v2[1]->getStartNode()==e1->getEndNode());
851   CPPUNIT_ASSERT(v2[0]->getEndNode()==e1->getEndNode());
852   CPPUNIT_ASSERT_DOUBLES_EQUAL(2*M_PI/3.,v1[0]->getCurveLength(),1.e-12);
853   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v2[1]->getCurveLength(),1.e-12);
854   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[0]->getCurveLength(),1.e-12);
855   e2->decrRef(); e1->decrRef();
856   v1.clear(); v2.clear(); v3.clear();
857   //Test 15 - END - INSIDE | same dir.
858   e1=buildArcOfCircle(center,radius,-M_PI,2.*M_PI); e2=buildArcOfCircle(center,radius,0.,-4.*M_PI/3);
859   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.*M_PI/3.,e2->getCurveLength(),1e-12);
860   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
861   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
862   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
863   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
864   CPPUNIT_ASSERT(v1[0]->intresicEqual(v2[1]));
865   CPPUNIT_ASSERT(v2[0]->getEndNode()==e1->getStartNode());
866   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
867   CPPUNIT_ASSERT(v1[1]->getEndNode()==e1->getEndNode());
868   CPPUNIT_ASSERT(v2[0]->getStartNode()==e1->getEndNode());
869   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[0]->getCurveLength(),1.e-12);
870   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[0]->getCurveLength(),1.e-12);
871   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.*M_PI/3.,v1[1]->getCurveLength(),1.e-12);
872   e2->decrRef(); e1->decrRef();
873   v1.clear(); v2.clear(); v3.clear();
874   //Test 15 - END - INSIDE | opp dir.
875   e1=buildArcOfCircle(center,radius,-M_PI,2.*M_PI); e2=buildArcOfCircle(center,radius,-4.*M_PI/3,0.);
876   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,e1->getCurveLength(),1e-12); CPPUNIT_ASSERT_DOUBLES_EQUAL(4.*M_PI/3.,e2->getCurveLength(),1e-12);
877   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
878   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
879   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
880   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
881   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(v2[0]->getPtr()) && !v2[0]->getDirection() && v1[0]->getDirection());
882   CPPUNIT_ASSERT(v2[0]->getEndNode()==e1->getStartNode());
883   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode());
884   CPPUNIT_ASSERT(v1[1]->getEndNode()==e1->getEndNode());
885   CPPUNIT_ASSERT(v2[1]->getEndNode()==e1->getEndNode());
886   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/3.,v1[0]->getCurveLength(),1.e-12);
887   CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI,v2[1]->getCurveLength(),1.e-12);
888   CPPUNIT_ASSERT_DOUBLES_EQUAL(2.*M_PI/3.,v1[1]->getCurveLength(),1.e-12);
889   e2->decrRef(); e1->decrRef();
890   v1.clear(); v2.clear(); v3.clear();
891   //
892   ComposedEdge::Delete(&v1);
893   ComposedEdge::Delete(&v2);
894 }
895
896 /*!
897  * Here there is test of cases where between 2 edges intersects only in points not on edge.
898  */
899 void QuadraticPlanarInterpTest::IntersectionPointOnlyUnitarySegSeg()
900 {
901   // 0° - classical
902   EdgeLin *e1=new EdgeLin(0.,0.,1.,0.);
903   EdgeLin *e2=new EdgeLin(0.3,0.3,0.5,-0.3);
904   ComposedEdge& v1=*(new ComposedEdge);
905   ComposedEdge& v2=*(new ComposedEdge); MergePoints v3;
906   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
907   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
908   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
909   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
910   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
911   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
912   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
913   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.4,(*v1[0]->getEndNode())[0],ADMISSIBLE_ERROR);
914   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,(*v1[0]->getEndNode())[1],ADMISSIBLE_ERROR);
915   e2->decrRef(); e1->decrRef();
916   v1.clear(); v2.clear(); v3.clear();
917   // 90° - classical
918   e1=new EdgeLin(0.,0.,0.,1.);
919   e2=new EdgeLin(-0.3,0.3,0.3,0.5);
920   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
921   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
922   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
923   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
924   CPPUNIT_ASSERT(v1[0]->getEndNode()==v1[1]->getStartNode()); CPPUNIT_ASSERT(v2[0]->getEndNode()==v2[1]->getStartNode());
925   CPPUNIT_ASSERT(e1->getStartNode()==v1.front()->getStartNode() && e1->getEndNode()==v1.back()->getEndNode());
926   CPPUNIT_ASSERT(e2->getStartNode()==v2.front()->getStartNode() && e2->getEndNode()==v2.back()->getEndNode());
927   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,(*v1[0]->getEndNode())[0],ADMISSIBLE_ERROR);
928   CPPUNIT_ASSERT_DOUBLES_EQUAL(0.4,(*v1[0]->getEndNode())[1],ADMISSIBLE_ERROR);
929   e2->decrRef(); e1->decrRef();
930   v1.clear(); v2.clear(); v3.clear();
931   //Test 1 - 0°
932   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(0.,0.,0.,1.);
933   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
934   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
935   CPPUNIT_ASSERT(v3.isStart1(0)); CPPUNIT_ASSERT(v3.isStart2(0));
936   e2->decrRef(); e1->decrRef();
937   v1.clear(); v2.clear(); v3.clear();
938   //Test 1 - 90°
939   e1=new EdgeLin(0.,0.,0.,1.); e2=new EdgeLin(0.,0.,1.,0.);
940   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
941   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
942   CPPUNIT_ASSERT(v3.isStart1(0)); CPPUNIT_ASSERT(v3.isStart2(0));
943   e2->decrRef(); e1->decrRef();
944   v1.clear(); v2.clear(); v3.clear();
945   //Test 1 - 45°
946   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(0.,0.,1.,-1.);
947   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
948   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
949   CPPUNIT_ASSERT(v3.isStart1(0)); CPPUNIT_ASSERT(v3.isStart2(0));
950   e2->decrRef(); e1->decrRef();
951   v1.clear(); v2.clear(); v3.clear();
952   //Test 2
953   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(1.,1.,1.,0.);
954   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
955   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
956   CPPUNIT_ASSERT(v3.isEnd1(0)); CPPUNIT_ASSERT(v3.isEnd2(0));
957   e2->decrRef(); e1->decrRef();
958   v1.clear(); v2.clear(); v3.clear();
959   //Test 3
960   e1=new EdgeLin(0.,0.,1.,0.); e2=new EdgeLin(1.,0.,1.,1.);
961   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
962   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
963   CPPUNIT_ASSERT(v3.isEnd1(0)); CPPUNIT_ASSERT(v3.isStart2(0));
964   e2->decrRef(); e1->decrRef();
965   v1.clear(); v2.clear(); v3.clear();
966   //Test 4
967   e1=new EdgeLin(0.,0.,1.,1.); e2=new EdgeLin(1.,-1.,0.,0.);
968   CPPUNIT_ASSERT(!e1->intersectWith(e2,v3,v1,v2));
969   CPPUNIT_ASSERT_EQUAL(1,(int)v3.getNumberOfAssociations());
970   CPPUNIT_ASSERT(v3.isStart1(0)); CPPUNIT_ASSERT(v3.isEnd2(0));
971   e2->decrRef(); e1->decrRef();
972   v1.clear(); v2.clear(); v3.clear();
973   //Intersection extremity of one edge and inside of other edge. 2 End.
974   e1=new EdgeLin(0.,0.,1.,0.);
975   e2=new EdgeLin(0.5,1.,0.5,0.);
976   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
977   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
978   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
979   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
980   CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
981   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode() && v1[0]->getEndNode()==e2->getEndNode() && v1[1]->getStartNode()==e2->getEndNode() && v1[1]->getEndNode()==e1->getEndNode());
982   CPPUNIT_ASSERT(v1[0]->getDirection() && v1[1]->getDirection());
983   e2->decrRef(); e1->decrRef();
984   v1.clear(); v2.clear(); v3.clear();
985   //Intersection extremity of one edge and inside of other edge. 2 Start.
986   e1=new EdgeLin(0.,0.,1.,0.);
987   e2=new EdgeLin(0.5,0.,0.5,1.);
988   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
989   CPPUNIT_ASSERT_EQUAL(2,(int)v1.size());
990   CPPUNIT_ASSERT_EQUAL(1,(int)v2.size());
991   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
992   CPPUNIT_ASSERT(v2[0]->intresincEqCoarse(e2) && v2[0]->getDirection());
993   CPPUNIT_ASSERT(v1[0]->getStartNode()==e1->getStartNode() && v1[0]->getEndNode()==e2->getStartNode() && v1[1]->getStartNode()==e2->getStartNode() && v1[1]->getEndNode()==e1->getEndNode());
994   CPPUNIT_ASSERT(v1[0]->getDirection() && v1[1]->getDirection());
995   e2->decrRef(); e1->decrRef();
996   v1.clear(); v2.clear(); v3.clear();
997   //Intersection extremity of one edge and inside of other edge. 1 Start.
998   e1=new EdgeLin(0.5,0.,0.5,1.);
999   e2=new EdgeLin(0.,0.,1.,0.);
1000   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
1001   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
1002   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
1003   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
1004   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
1005   CPPUNIT_ASSERT(v2[0]->getStartNode()==e2->getStartNode() && v2[0]->getEndNode()==e1->getStartNode() && v2[1]->getStartNode()==e1->getStartNode() && v2[1]->getEndNode()==e2->getEndNode());
1006   CPPUNIT_ASSERT(v2[0]->getDirection() && v2[1]->getDirection());
1007   e2->decrRef(); e1->decrRef();
1008   v1.clear(); v2.clear(); v3.clear();
1009   //Intersection extremity of one edge and inside of other edge. 1 End.
1010   e1=new EdgeLin(0.5,1.,0.5,0.);
1011   e2=new EdgeLin(0.,0.,1.,0.);
1012   CPPUNIT_ASSERT(e1->intersectWith(e2,v3,v1,v2));
1013   CPPUNIT_ASSERT_EQUAL(1,(int)v1.size());
1014   CPPUNIT_ASSERT_EQUAL(2,(int)v2.size());
1015   CPPUNIT_ASSERT_EQUAL(0,(int)v3.getNumberOfAssociations());
1016   CPPUNIT_ASSERT(v1[0]->intresincEqCoarse(e1) && v1[0]->getDirection());
1017   CPPUNIT_ASSERT(v2[0]->getStartNode()==e2->getStartNode() && v2[0]->getEndNode()==e1->getEndNode() && v2[1]->getStartNode()==e1->getEndNode() && v2[1]->getEndNode()==e2->getEndNode());
1018   CPPUNIT_ASSERT(v2[0]->getDirection() && v2[1]->getDirection());
1019   e2->decrRef(); e1->decrRef();
1020   v1.clear(); v2.clear(); v3.clear();
1021   ComposedEdge::Delete(&v2);
1022   ComposedEdge::Delete(&v1);
1023 }