// File: LProp_FuncCurExt.gxx // Created: Tue Sep 6 08:36:29 1994 // Author: Yves FRICAUD // #include #include //============================================================================= //function : // purpose : //============================================================================= LProp_FuncCurExt::LProp_FuncCurExt(const Curve& C, const Standard_Real Tol) :theCurve(C) { epsX = Tol; } //============================================================================= //function : Value // purpose : KC = (V1^V2.Z) / ||V1||^3 avec V1 tangente etV2 derivee seconde. // F = d KC/ dU. //============================================================================= Standard_Boolean LProp_FuncCurExt::Value (const Standard_Real X, Standard_Real& F) { Pnt P1; Vec V1,V2,V3; Tool::D3(theCurve,X,P1,V1,V2,V3); Standard_Real CPV1V2 = V1.Crossed(V2); Standard_Real CPV1V3 = V1.Crossed(V3); Standard_Real V1V2 = V1.Dot(V2); Standard_Real V1V1 = V1.SquareMagnitude(); Standard_Real NV1 = Sqrt(V1V1); Standard_Real V13 = V1V1*NV1; Standard_Real V15 = V13*V1V1; if (V15 < gp::Resolution()) { return Standard_False; } F = CPV1V3/V13 - 3*CPV1V2*V1V2/V15; return Standard_True; } //============================================================================= //function : Derivative // purpose : //============================================================================= Standard_Boolean LProp_FuncCurExt::Derivative(const Standard_Real X, Standard_Real& D) { Standard_Real F; return Values (X,F,D) ; } //============================================================================= //function : Values // purpose : //============================================================================= Standard_Boolean LProp_FuncCurExt::Values (const Standard_Real X, Standard_Real& F, Standard_Real& D) { Standard_Real F2; Standard_Real Dx= epsX/100.; if (X+Dx > Tool::LastParameter(theCurve)) {Dx = - Dx;} Value (X,F); Value (X+Dx,F2); D = (F2 - F)/Dx; return Standard_True; } //============================================================================= //function : IsMinKC // purpose : Teste si le parametere coorespond a un minimum du rayon de courbure // par comparaison avec un point voisin. //============================================================================= Standard_Boolean LProp_FuncCurExt::IsMinKC (const Standard_Real X) const { Pnt P1; Vec V1,V2,V3; Standard_Real Dx= epsX; Standard_Real KC,KP; Tool::D3(theCurve,X,P1,V1,V2,V3); Standard_Real CPV1V2 = V1.Crossed(V2); Standard_Real V1V1 = V1.SquareMagnitude(); Standard_Real NV1 = Sqrt(V1V1); Standard_Real V13 = V1V1*NV1; if (V13 < gp::Resolution()) {return Standard_False;} KC = CPV1V2/V13; if (X+Dx > Tool::LastParameter(theCurve)) {Dx = - Dx;} Tool::D3(theCurve,X+Dx,P1,V1,V2,V3); CPV1V2 = V1.Crossed(V2); V1V1 = V1.SquareMagnitude(); NV1 = Sqrt(V1V1); V13 = V1V1*NV1; if (V13 < gp::Resolution()) { return Standard_False;} KP = CPV1V2/V13; if (Abs(KC) > Abs(KP)) {return Standard_True ;} else {return Standard_False;} }