0025992: Method Geom2dAPI_InterCurveCurve::Segment(...) requires detail revision
[occt.git] / src / Geom2dAPI / Geom2dAPI_InterCurveCurve.cxx
1 // Created on: 1994-03-24
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <Geom2dAPI_InterCurveCurve.ixx>
18
19 #include <Geom2dAdaptor_Curve.hxx>
20 #include <Geom2d_TrimmedCurve.hxx>
21 #include <IntRes2d_IntersectionPoint.hxx>
22 #include <IntRes2d_IntersectionSegment.hxx>
23
24 #include <Standard_NotImplemented.hxx>
25
26 //=======================================================================
27 //function : Geom2dAPI_InterCurveCurve
28 //purpose  : 
29 //=======================================================================
30
31 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve()
32 {
33   myIsDone = Standard_False;
34 }
35
36
37 //=======================================================================
38 //function : Geom2dAPI_InterCurveCurve
39 //purpose  : 
40 //=======================================================================
41
42 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve
43   (const Handle(Geom2d_Curve)& C1,
44    const Handle(Geom2d_Curve)& C2,
45    const Standard_Real         Tol)
46 {
47   Init( C1, C2, Tol);
48 }
49
50
51 //=======================================================================
52 //function : Geom2dAPI_InterCurveCurve
53 //purpose  : 
54 //=======================================================================
55
56 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve
57   (const Handle(Geom2d_Curve)& C1,
58    const Standard_Real         Tol)
59 {
60   Init( C1, Tol);
61 }
62
63
64 //=======================================================================
65 //function : Init
66 //purpose  : 
67 //=======================================================================
68
69 void Geom2dAPI_InterCurveCurve::Init
70   (const Handle(Geom2d_Curve)& C1,
71    const Handle(Geom2d_Curve)& C2,
72    const Standard_Real         Tol)
73 {
74   myCurve1 = Handle(Geom2d_Curve)::DownCast(C1->Copy());
75   myCurve2 = Handle(Geom2d_Curve)::DownCast(C2->Copy());
76
77   Geom2dAdaptor_Curve AC1(C1);
78   Geom2dAdaptor_Curve AC2(C2);
79   myIntersector = Geom2dInt_GInter( AC1, AC2, Tol, Tol);
80   myIsDone = myIntersector.IsDone();
81
82 }
83
84
85 //=======================================================================
86 //function : Init
87 //purpose  : 
88 //=======================================================================
89
90 void Geom2dAPI_InterCurveCurve::Init
91   (const Handle(Geom2d_Curve)& C1,
92    const Standard_Real         Tol)
93 {
94   myCurve1 = Handle(Geom2d_Curve)::DownCast(C1->Copy());
95   myCurve2.Nullify();
96
97   Geom2dAdaptor_Curve AC1(C1);
98   myIntersector = Geom2dInt_GInter( AC1, Tol, Tol);
99   myIsDone = myIntersector.IsDone();
100
101 }
102
103
104 //=======================================================================
105 //function : NbPoints
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Integer Geom2dAPI_InterCurveCurve::NbPoints() const 
110 {
111   if ( myIsDone)  
112     return myIntersector.NbPoints();
113   else
114     return 0;
115 }
116
117
118 //=======================================================================
119 //function : Point
120 //purpose  : 
121 //=======================================================================
122
123 gp_Pnt2d Geom2dAPI_InterCurveCurve::Point
124   (const Standard_Integer Index) const 
125 {
126   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbPoints(),
127                                "Geom2dAPI_InterCurveCurve::Points");
128
129   return (myIntersector.Point(Index)).Value();
130 }
131
132
133 //=======================================================================
134 //function : NbSegments
135 //purpose  : 
136 //=======================================================================
137
138 Standard_Integer Geom2dAPI_InterCurveCurve::NbSegments() const 
139 {
140   if ( myIsDone)
141     return myIntersector.NbSegments();
142   else
143     return 0;
144 }
145
146
147 //=======================================================================
148 //function : Segment
149 //purpose  : 
150 //  If aSeg.IsOpposite() == TRUE
151 //
152 //                U1            U2
153 //    Curve 1:    *------------>*
154 //
155 //                V2            V1
156 //    Curve 2:    *<------------*
157 //
158 //    Segment:  FirstPoint--->LastPoint
159 //
160 //
161 //  If aSeg.IsOpposite() == FALSE
162 //
163 //                U1            U2
164 //    Curve 1:    *------------>*
165 //
166 //                V1            V2
167 //    Curve 2:    *------------>*
168 //
169 //    Segment:  FirstPoint--->LastPoint
170 //=======================================================================
171
172 void Geom2dAPI_InterCurveCurve::Segment
173   (const Standard_Integer      theIndex,
174          Handle(Geom2d_Curve)& theCurve1,
175          Handle(Geom2d_Curve)& theCurve2) const 
176 {
177   Standard_OutOfRange_Raise_if(theIndex < 1 || theIndex > NbSegments(),
178                                "Geom2dAPI_InterCurveCurve::Segment");
179
180   Standard_NullObject_Raise_if(myCurve1.IsNull() || myCurve2.IsNull(),
181                                "Geom2dAPI_InterCurveCurve::Segment");
182
183   Standard_Real aU1 = myCurve1->FirstParameter(),
184                 aU2 = myCurve1->LastParameter(),
185                 aV1 = myCurve2->FirstParameter(),
186                 aV2 = myCurve2->LastParameter();
187
188   const IntRes2d_IntersectionSegment& aSeg = myIntersector.Segment(theIndex);
189   const Standard_Boolean isOpposite = aSeg.IsOpposite();
190
191   if(aSeg.HasFirstPoint())
192   {
193     const IntRes2d_IntersectionPoint& anIPF = aSeg.FirstPoint();
194     aU1 = anIPF.ParamOnFirst();
195     
196     if(isOpposite)
197       aV2 = anIPF.ParamOnSecond();
198     else
199       aV1 = anIPF.ParamOnSecond();
200   }
201
202   if(aSeg.HasLastPoint())
203   {
204     const IntRes2d_IntersectionPoint& anIPL = aSeg.LastPoint();
205     aU2 = anIPL.ParamOnFirst();
206
207     if(isOpposite)
208       aV1 = anIPL.ParamOnSecond();
209     else
210       aV2 = anIPL.ParamOnSecond();
211   }
212
213   theCurve1 = new Geom2d_TrimmedCurve(myCurve1, aU1, aU2);
214   theCurve2 = new Geom2d_TrimmedCurve(myCurve2, aV1, aV2);
215 }
216
217 //=======================================================================
218 //function : Segment
219 //purpose  : 
220 //=======================================================================
221
222 void Geom2dAPI_InterCurveCurve::Segment (const Standard_Integer Index,
223                                          Handle(Geom2d_Curve)&) const 
224 {
225   Standard_NotImplemented::Raise(" ");
226   (void)Index; // avoid compiler warning in Release mode
227   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbSegments(),
228                                "Geom2dAPI_InterCurveCurve::Segment");
229 }