1 // Copyright (c) 1996-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <Geom_Curve.hxx>
17 #include <GeomLProp_CLProps.hxx>
22 #include <LocalAnalysis_CurveContinuity.hxx>
23 #include <LocalAnalysis_StatusErrorType.hxx>
24 #include <StdFail_NotDone.hxx>
26 /***********************************************************************/
27 void LocalAnalysis_CurveContinuity::CurvC0( GeomLProp_CLProps& Curv1,
28 GeomLProp_CLProps& Curv2)
29 { myContC0= (Curv1.Value()).Distance(Curv2.Value());
32 /****************************************************************************/
33 void LocalAnalysis_CurveContinuity::CurvC1( GeomLProp_CLProps& Curv1,
34 GeomLProp_CLProps& Curv2)
39 Standard_Real norm1,norm2;
40 norm1 = V1.Magnitude();
41 norm2 = V2.Magnitude();
43 if ((norm1>myepsnul)&&(norm2>myepsnul))
44 { if ( norm1 >= norm2 )
45 { myLambda1 = norm2 / norm1;}
46 else { myLambda1 = norm1 / norm2;}
48 if (ang>M_PI/2) myContC1=M_PI-ang;
51 else {myIsDone= Standard_False;
52 myErrorStatus=LocalAnalysis_NullFirstDerivative;}
55 /*********************************************************************************/
57 void LocalAnalysis_CurveContinuity::CurvC2(GeomLProp_CLProps& Curv1,
58 GeomLProp_CLProps& Curv2)
59 { gp_Vec V1, V2, V12, V22;
61 Standard_Real norm1, norm2, norm12, norm22,ang;
66 norm1 = V1.Magnitude();
67 norm2 = V2.Magnitude();
68 norm12 = V12.Magnitude();
69 norm22 = V22.Magnitude();
71 if ((norm1>myepsnul)&&(norm2>myepsnul))
72 {if((norm12>myepsnul)&&(norm22>myepsnul))
74 { myLambda1 = norm2 / norm1;
75 myLambda2 = norm22 / norm12;}
77 else {myLambda1 = norm1 / norm2;
78 myLambda2 = norm12 / norm22;}
80 if (ang>M_PI/2) myContC2=M_PI-ang;
83 else{myIsDone= Standard_False ;
84 myErrorStatus=LocalAnalysis_NullSecondDerivative;} }
86 else {myIsDone= Standard_False ;
87 myErrorStatus=LocalAnalysis_NullFirstDerivative;}
90 /*********************************************************************************/
92 void LocalAnalysis_CurveContinuity::CurvG1 ( GeomLProp_CLProps& Curv1,
93 GeomLProp_CLProps & Curv2)
96 if (Curv1.IsTangentDefined() && Curv2.IsTangentDefined ())
97 { Curv1.Tangent(Tang1);
99 ang=Tang1.Angle(Tang2);
100 if (ang>M_PI/2) myContG1=M_PI-ang;
103 else {myIsDone= Standard_False ;
104 myErrorStatus=LocalAnalysis_TangentNotDefined;}
107 /*********************************************************************************/
109 void LocalAnalysis_CurveContinuity::CurvG2( GeomLProp_CLProps& Curv1,
110 GeomLProp_CLProps & Curv2 )
114 Standard_Real epscrb= 8*myepsC0/(myMaxLon*myMaxLon);
116 if (Curv1.IsTangentDefined() && Curv2.IsTangentDefined())
117 { myCourbC1= Curv1.Curvature();
118 myCourbC2 = Curv2.Curvature();
119 if( (Abs(myCourbC1)>epscrb)&& (Abs(myCourbC2)>epscrb))
125 if (ang>M_PI/2) myContG2=M_PI-ang;
127 myCourbC1= Curv1.Curvature();
128 myCourbC2 = Curv2.Curvature();
129 myG2Variation= Abs(myCourbC1-myCourbC2) / sqrt (myCourbC1* myCourbC2);}
130 else {myIsDone = Standard_False ;
131 myErrorStatus=LocalAnalysis_NormalNotDefined; }
133 else { myIsDone = Standard_False ;
134 myErrorStatus=LocalAnalysis_TangentNotDefined;}
137 /*********************************************************************************/
139 LocalAnalysis_CurveContinuity::LocalAnalysis_CurveContinuity(const Handle(Geom_Curve)& Curv1,
140 const Standard_Real u1, const Handle(Geom_Curve)& Curv2, const Standard_Real u2,
141 const GeomAbs_Shape Order,
142 const Standard_Real Epsnul,
143 const Standard_Real EpsC0,
144 const Standard_Real EpsC1,
145 const Standard_Real EpsC2,
146 const Standard_Real EpsG1,
147 const Standard_Real EpsG2,
148 const Standard_Real Percent,
149 const Standard_Real Maxlen )
150 { myTypeCont = Order;
160 myIsDone = Standard_True;
163 { case GeomAbs_C0 : { //TypeCont=GeomAbs_C0;
164 GeomLProp_CLProps Curve1 ( Curv1, u1, 0, myepsnul);
165 GeomLProp_CLProps Curve2 ( Curv2, u2, 0, myepsnul);
166 CurvC0(Curve1, Curve2);}
168 case GeomAbs_C1 : { //TypeCont=GeomAbs_C1;
170 GeomLProp_CLProps Curve1 ( Curv1, u1, 1, myepsnul);
171 GeomLProp_CLProps Curve2 ( Curv2, u2, 1, myepsnul );
172 CurvC0(Curve1, Curve2);
173 CurvC1(Curve1, Curve2);}
175 case GeomAbs_C2 : { //TypeCont=GeomAbs_C2;
177 GeomLProp_CLProps Curve1 ( Curv1, u1, 2, myepsnul);
178 GeomLProp_CLProps Curve2 ( Curv2, u2, 2, myepsnul);
179 CurvC0(Curve1, Curve2);
180 CurvC1(Curve1, Curve2);
181 CurvC2(Curve1, Curve2);}
183 case GeomAbs_G1 : { //TypeCont=GeomAbs_G1;
184 GeomLProp_CLProps Curve1 ( Curv1, u1, 1, myepsnul);
185 GeomLProp_CLProps Curve2 ( Curv2, u2, 1, myepsnul);
186 CurvC0(Curve1, Curve2);
187 CurvG1(Curve1, Curve2);}
189 case GeomAbs_G2 : { //TypeCont=GeomAbs_G2;
190 GeomLProp_CLProps Curve1 ( Curv1, u1, 2, myepsnul);
191 GeomLProp_CLProps Curve2 ( Curv2, u2, 2, myepsnul);
192 CurvC0(Curve1, Curve2);
193 CurvG1(Curve1, Curve2);
194 CurvG2(Curve1, Curve2);}
200 /*********************************************************************************/
202 Standard_Boolean LocalAnalysis_CurveContinuity::IsC0() const
204 if (!myIsDone) { throw StdFail_NotDone();}
205 if (myContC0 <= myepsC0 )
206 return Standard_True;
207 else return Standard_False;
210 /*********************************************************************************/
212 Standard_Boolean LocalAnalysis_CurveContinuity::IsC1() const
214 if (!myIsDone) { throw StdFail_NotDone();}
215 if ( IsC0() && ( (myContC1 <= myepsC1)||(Abs(myContC1-M_PI)<=myepsC1)))
216 return Standard_True;
217 else return Standard_False;
220 /*********************************************************************************/
222 Standard_Boolean LocalAnalysis_CurveContinuity::IsC2() const
223 { Standard_Real epsil1, epsil2;
225 if (!myIsDone) { throw StdFail_NotDone();}
227 { if ((myContC2 <= myepsC2)||(Abs(myContC2-M_PI)<=myepsC2))
228 { epsil1 = 0.5*myepsC1*myepsC1*myLambda1;
229 epsil2 = 0.5*myepsC2*myepsC2*myLambda2;
230 if ( (Abs(myLambda1*myLambda1-myLambda2)) <= (epsil1*epsil1+epsil2))
231 return Standard_True;}
232 else return Standard_False;
234 return Standard_False;
239 /*********************************************************************************/
241 Standard_Boolean LocalAnalysis_CurveContinuity::IsG1() const
243 if (!myIsDone) { throw StdFail_NotDone();}
244 if ( IsC0() && (( myContG1 <= myepsG1||(Abs(myContG1-M_PI)<=myepsG1))))
245 return Standard_True;
246 else return Standard_False;
249 /*********************************************************************************/
251 Standard_Boolean LocalAnalysis_CurveContinuity::IsG2()const
252 { Standard_Real CRBINF, CRBNUL;
253 Standard_Integer IETA1, IETA2;
254 // etat des coubures IETA. -> 0 Crbure nulle
256 // -> 2 Crbure infinie
258 if (!myIsDone) { throw StdFail_NotDone();}
260 { CRBINF = 1/myepsC0;
261 CRBNUL = 8*myepsC0/(myMaxLon*myMaxLon);
263 if (myCourbC1 > CRBINF) IETA1=2;
264 else if (myCourbC1 < CRBNUL) IETA1=0;
266 if (myCourbC2 > CRBINF) IETA2=2;
267 else if (myCourbC2 < CRBNUL) IETA2=0;
271 { Standard_Real eps= RealPart( (myContG2+myepsG2)/M_PI) * M_PI;
272 if (Abs( eps - myepsG2) < myepsG2)
273 {if (myG2Variation < myperce )
274 return Standard_True;
275 else return Standard_False;}
276 else return Standard_False;
278 else return Standard_True;
280 else return Standard_False;
282 else return Standard_False;
285 /*********************************************************************************/
287 Standard_Real LocalAnalysis_CurveContinuity::C0Value() const
289 if (!myIsDone) {throw StdFail_NotDone();}
293 /*********************************************************************************/
295 Standard_Real LocalAnalysis_CurveContinuity::C1Angle() const
297 if (!myIsDone) { throw StdFail_NotDone();}
301 /*********************************************************************************/
303 Standard_Real LocalAnalysis_CurveContinuity::C2Angle() const
305 if (!myIsDone) { throw StdFail_NotDone();}
309 /*********************************************************************************/
311 Standard_Real LocalAnalysis_CurveContinuity::G1Angle() const
313 if (!myIsDone) { throw StdFail_NotDone();}
316 /*********************************************************************************/
318 Standard_Real LocalAnalysis_CurveContinuity::G2Angle() const
320 if (!myIsDone) { throw StdFail_NotDone();}
326 /*********************************************************************************/
328 Standard_Real LocalAnalysis_CurveContinuity::C1Ratio() const
330 if (!myIsDone) {throw StdFail_NotDone();}
331 return ( myLambda1 );
334 /*********************************************************************************/
336 Standard_Real LocalAnalysis_CurveContinuity::C2Ratio() const
338 if (!myIsDone) {throw StdFail_NotDone();}
339 return ( myLambda2 );
342 /********************************************************************************/
343 Standard_Real LocalAnalysis_CurveContinuity::G2CurvatureVariation() const
345 if (!myIsDone) {throw StdFail_NotDone();}
346 return ( myG2Variation);
350 /********************************************************************************/
352 Standard_Boolean LocalAnalysis_CurveContinuity::IsDone() const
353 { return ( myIsDone );
356 /*********************************************************************************/
358 LocalAnalysis_StatusErrorType LocalAnalysis_CurveContinuity::StatusError() const
360 return myErrorStatus;
362 /*************************************************************************/
363 GeomAbs_Shape LocalAnalysis_CurveContinuity::ContinuityStatus() const
365 if (!myIsDone) { throw StdFail_NotDone();}
368 /*********************************************************************************/