Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Geom2dAPI / Geom2dAPI_InterCurveCurve.cxx
1 // File:        Geom2dAPI_InterCurveCurve.cxx
2 // Created:     Thu Mar 24 11:41:35 1994
3 // Author:      Bruno DUMORTIER
4 //              <dub@fuegox>
5
6
7 #include <Geom2dAPI_InterCurveCurve.ixx>
8
9 #include <Geom2dAdaptor_Curve.hxx>
10 #include <Geom2d_TrimmedCurve.hxx>
11 #include <IntRes2d_IntersectionPoint.hxx>
12 #include <IntRes2d_IntersectionSegment.hxx>
13
14 #include <Standard_NotImplemented.hxx>
15
16 //=======================================================================
17 //function : Geom2dAPI_InterCurveCurve
18 //purpose  : 
19 //=======================================================================
20
21 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve()
22 {
23   myIsDone = Standard_False;
24 }
25
26
27 //=======================================================================
28 //function : Geom2dAPI_InterCurveCurve
29 //purpose  : 
30 //=======================================================================
31
32 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve
33   (const Handle(Geom2d_Curve)& C1,
34    const Handle(Geom2d_Curve)& C2,
35    const Standard_Real         Tol)
36 {
37   Init( C1, C2, Tol);
38 }
39
40
41 //=======================================================================
42 //function : Geom2dAPI_InterCurveCurve
43 //purpose  : 
44 //=======================================================================
45
46 Geom2dAPI_InterCurveCurve::Geom2dAPI_InterCurveCurve
47   (const Handle(Geom2d_Curve)& C1,
48    const Standard_Real         Tol)
49 {
50   Init( C1, Tol);
51 }
52
53
54 //=======================================================================
55 //function : Init
56 //purpose  : 
57 //=======================================================================
58
59 void Geom2dAPI_InterCurveCurve::Init
60   (const Handle(Geom2d_Curve)& C1,
61    const Handle(Geom2d_Curve)& C2,
62    const Standard_Real         Tol)
63 {
64   myCurve1 = Handle(Geom2d_Curve)::DownCast(C1->Copy());
65   myCurve2 = Handle(Geom2d_Curve)::DownCast(C2->Copy());
66
67   Geom2dAdaptor_Curve AC1(C1);
68   Geom2dAdaptor_Curve AC2(C2);
69   myIntersector = Geom2dInt_GInter( AC1, AC2, Tol, Tol);
70   myIsDone = myIntersector.IsDone();
71
72 }
73
74
75 //=======================================================================
76 //function : Init
77 //purpose  : 
78 //=======================================================================
79
80 void Geom2dAPI_InterCurveCurve::Init
81   (const Handle(Geom2d_Curve)& C1,
82    const Standard_Real         Tol)
83 {
84   myCurve1 = Handle(Geom2d_Curve)::DownCast(C1->Copy());
85   myCurve2.Nullify();
86
87   Geom2dAdaptor_Curve AC1(C1);
88   myIntersector = Geom2dInt_GInter( AC1, Tol, Tol);
89   myIsDone = myIntersector.IsDone();
90
91 }
92
93
94 //=======================================================================
95 //function : NbPoints
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Integer Geom2dAPI_InterCurveCurve::NbPoints() const 
100 {
101   if ( myIsDone)  
102     return myIntersector.NbPoints();
103   else
104     return 0;
105 }
106
107
108 //=======================================================================
109 //function : Point
110 //purpose  : 
111 //=======================================================================
112
113 gp_Pnt2d Geom2dAPI_InterCurveCurve::Point
114   (const Standard_Integer Index) const 
115 {
116   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbPoints(),
117                                "Geom2dAPI_InterCurveCurve::Points");
118
119   return (myIntersector.Point(Index)).Value();
120 }
121
122
123 //=======================================================================
124 //function : NbSegments
125 //purpose  : 
126 //=======================================================================
127
128 Standard_Integer Geom2dAPI_InterCurveCurve::NbSegments() const 
129 {
130   if ( myIsDone)
131     return myIntersector.NbSegments();
132   else
133     return 0;
134 }
135
136
137 //=======================================================================
138 //function : Segment
139 //purpose  : 
140 //=======================================================================
141
142 void Geom2dAPI_InterCurveCurve::Segment
143   (const Standard_Integer      Index,
144          Handle(Geom2d_Curve)& Curve1,
145          Handle(Geom2d_Curve)& Curve2) const 
146 {
147   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbSegments(),
148                                "Geom2dAPI_InterCurveCurve::Segment");
149
150   Standard_NullObject_Raise_if(myCurve2.IsNull(),
151                                "Geom2dAPI_InterCurveCurve::Segment");
152
153   Standard_Real U1, U2, V1, V2;
154
155   IntRes2d_IntersectionSegment Seg = myIntersector.Segment(Index);
156   if ( Seg.IsOpposite()) {
157     if ( Seg.HasFirstPoint()) {
158       IntRes2d_IntersectionPoint IP1 = Seg.FirstPoint();
159       U1 = IP1.ParamOnFirst();
160       V2 = IP1.ParamOnSecond();
161     }
162     else {
163       U1 = Curve1->FirstParameter();
164       V2 = Curve2->LastParameter();
165     }
166     if ( Seg.HasLastPoint()) {
167       IntRes2d_IntersectionPoint IP2 = Seg.LastPoint();
168       U2 = IP2.ParamOnFirst();
169       V1 = IP2.ParamOnSecond();
170     }
171     else {
172       U2 = Curve1->FirstParameter();
173       V1 = Curve2->LastParameter();
174     }
175   }
176   else {
177     if ( Seg.HasFirstPoint()) {
178       IntRes2d_IntersectionPoint IP1 = Seg.FirstPoint();
179       U1 = IP1.ParamOnFirst();
180       V1 = IP1.ParamOnSecond();
181     }
182     else {
183       U1 = Curve1->FirstParameter();
184       V1 = Curve2->FirstParameter();
185     }
186     if ( Seg.HasLastPoint()) {
187       IntRes2d_IntersectionPoint IP2 = Seg.LastPoint();
188       U2 = IP2.ParamOnFirst();
189       V2 = IP2.ParamOnSecond();
190     }
191     else {
192       U2 = Curve1->FirstParameter();
193       V2 = Curve2->FirstParameter();
194     }
195   }
196
197   Curve1 = new Geom2d_TrimmedCurve(myCurve1, U1, U2);
198   Curve2 = new Geom2d_TrimmedCurve(myCurve2, V1, V2);
199
200 }
201
202
203 //=======================================================================
204 //function : Segment
205 //purpose  : 
206 //=======================================================================
207
208 void Geom2dAPI_InterCurveCurve::Segment
209   (const Standard_Integer      Index,
210          Handle(Geom2d_Curve)& //Curve1
211    ) const 
212 {
213   Standard_NotImplemented::Raise(" ");
214
215   Standard_OutOfRange_Raise_if(Index < 0 || Index > NbSegments(),
216                                "Geom2dAPI_InterCurveCurve::Segment");
217
218 }