0024428: Implementation of LGPL license
[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
9 // under the terms of the GNU Lesser General Public 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 //=======================================================================
151
152 void Geom2dAPI_InterCurveCurve::Segment
153   (const Standard_Integer      Index,
154          Handle(Geom2d_Curve)& Curve1,
155          Handle(Geom2d_Curve)& Curve2) const 
156 {
157   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbSegments(),
158                                "Geom2dAPI_InterCurveCurve::Segment");
159
160   Standard_NullObject_Raise_if(myCurve2.IsNull(),
161                                "Geom2dAPI_InterCurveCurve::Segment");
162
163   Standard_Real U1, U2, V1, V2;
164
165   IntRes2d_IntersectionSegment Seg = myIntersector.Segment(Index);
166   if ( Seg.IsOpposite()) {
167     if ( Seg.HasFirstPoint()) {
168       IntRes2d_IntersectionPoint IP1 = Seg.FirstPoint();
169       U1 = IP1.ParamOnFirst();
170       V2 = IP1.ParamOnSecond();
171     }
172     else {
173       U1 = Curve1->FirstParameter();
174       V2 = Curve2->LastParameter();
175     }
176     if ( Seg.HasLastPoint()) {
177       IntRes2d_IntersectionPoint IP2 = Seg.LastPoint();
178       U2 = IP2.ParamOnFirst();
179       V1 = IP2.ParamOnSecond();
180     }
181     else {
182       U2 = Curve1->FirstParameter();
183       V1 = Curve2->LastParameter();
184     }
185   }
186   else {
187     if ( Seg.HasFirstPoint()) {
188       IntRes2d_IntersectionPoint IP1 = Seg.FirstPoint();
189       U1 = IP1.ParamOnFirst();
190       V1 = IP1.ParamOnSecond();
191     }
192     else {
193       U1 = Curve1->FirstParameter();
194       V1 = Curve2->FirstParameter();
195     }
196     if ( Seg.HasLastPoint()) {
197       IntRes2d_IntersectionPoint IP2 = Seg.LastPoint();
198       U2 = IP2.ParamOnFirst();
199       V2 = IP2.ParamOnSecond();
200     }
201     else {
202       U2 = Curve1->FirstParameter();
203       V2 = Curve2->FirstParameter();
204     }
205   }
206
207   Curve1 = new Geom2d_TrimmedCurve(myCurve1, U1, U2);
208   Curve2 = new Geom2d_TrimmedCurve(myCurve2, V1, V2);
209
210 }
211
212
213 //=======================================================================
214 //function : Segment
215 //purpose  : 
216 //=======================================================================
217
218 void Geom2dAPI_InterCurveCurve::Segment (const Standard_Integer Index,
219                                          Handle(Geom2d_Curve)&) const 
220 {
221   Standard_NotImplemented::Raise(" ");
222   (void)Index; // avoid compiler warning in Release mode
223   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbSegments(),
224                                "Geom2dAPI_InterCurveCurve::Segment");
225 }