1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-04 18:06:22 +03:00

CR23589: performance improvements in curve-curve intersection

This commit is contained in:
Roman Lygin 2012-11-28 12:35:10 +04:00
parent 337a0f4e30
commit 0d167958d9
2 changed files with 30 additions and 33 deletions

View File

@ -111,6 +111,8 @@ fields
myV : Real; myV : Real;
myP1 : Pnt; -- current point C1(U) myP1 : Pnt; -- current point C1(U)
myP2 : Pnt; -- current point C2(U) myP2 : Pnt; -- current point C2(U)
myDu : Vec; -- current D1 C1(U)
myDv : Vec; -- current D1 C2(V)
mySqDist: SequenceOfReal from TColStd; mySqDist: SequenceOfReal from TColStd;
myPoints: SeqPOnC; myPoints: SeqPOnC;

View File

@ -59,28 +59,26 @@ Standard_Boolean Extrema_FuncExtCC::Value (const math_Vector& UV,
math_Vector& F) math_Vector& F)
{ {
Vec Du, Dv;
myU = UV(1); myU = UV(1);
myV = UV(2); myV = UV(2);
Tool1::D1(*((Curve1*)myC1), myU,myP1,Du); Tool1::D1(*((Curve1*)myC1), myU,myP1,myDu);
Tool2::D1(*((Curve2*)myC2), myV,myP2,Dv); Tool2::D1(*((Curve2*)myC2), myV,myP2,myDv);
Vec P1P2 (myP1,myP2); Vec P1P2 (myP1,myP2);
Standard_Real Ndu = Du.Magnitude(); Standard_Real Ndu = myDu.Magnitude();
if (Ndu <= Tol) { if (Ndu <= Tol) {
Pnt P1, P2; Pnt P1, P2;
P1 = Tool1::Value(*((Curve1*)myC1), myU-delta); P1 = Tool1::Value(*((Curve1*)myC1), myU-delta);
P2 = Tool1::Value(*((Curve1*)myC1), myU+delta); P2 = Tool1::Value(*((Curve1*)myC1), myU+delta);
Vec V(P1,P2); Vec V(P1,P2);
Du = V; myDu = V;
Ndu = Du.Magnitude(); Ndu = myDu.Magnitude();
if (Ndu <= Tol) { if (Ndu <= Tol) {
return Standard_False; return Standard_False;
} }
} }
Standard_Real Ndv = Dv.Magnitude(); Standard_Real Ndv = myDv.Magnitude();
if (Ndv <= Tol) { if (Ndv <= Tol) {
// Traitement des singularite, on approche la Tangente // Traitement des singularite, on approche la Tangente
// par une corde // par une corde
@ -88,15 +86,15 @@ Standard_Boolean Extrema_FuncExtCC::Value (const math_Vector& UV,
P1 = Tool2::Value(*((Curve2*)myC2), myV-delta); P1 = Tool2::Value(*((Curve2*)myC2), myV-delta);
P2 = Tool2::Value(*((Curve2*)myC2), myV+delta); P2 = Tool2::Value(*((Curve2*)myC2), myV+delta);
Vec V(P1,P2); Vec V(P1,P2);
Dv = V; myDv = V;
Ndv = Dv.Magnitude(); Ndv = myDv.Magnitude();
if (Ndv <= Tol) { if (Ndv <= Tol) {
return Standard_False; return Standard_False;
} }
} }
F(1) = P1P2.Dot(Du)/Ndu; F(1) = P1P2.Dot(myDu)/Ndu;
F(2) = P1P2.Dot(Dv)/Ndv; F(2) = P1P2.Dot(myDv)/Ndv;
return Standard_True; return Standard_True;
} }
//============================================================================= //=============================================================================
@ -108,56 +106,55 @@ Standard_Boolean Extrema_FuncExtCC::Derivatives (const math_Vector& UV,
return Values(UV,F,Df); return Values(UV,F,Df);
} }
//============================================================================= //=============================================================================
Standard_Boolean Extrema_FuncExtCC::Values (const math_Vector& UV, Standard_Boolean Extrema_FuncExtCC::Values (const math_Vector& UV,
math_Vector& F, math_Vector& F,
math_Matrix& Df) math_Matrix& Df)
{ {
myU = UV(1); myU = UV(1);
myV = UV(2); myV = UV(2);
Vec Du, Dv, Duu, Dvv; Vec Duu, Dvv;
Tool1::D2(*((Curve1*)myC1), myU,myP1,Du,Duu); Tool1::D2(*((Curve1*)myC1), myU,myP1,myDu,Duu);
Tool2::D2(*((Curve2*)myC2), myV,myP2,Dv,Dvv); Tool2::D2(*((Curve2*)myC2), myV,myP2,myDv,Dvv);
Vec P1P2 (myP1,myP2); Vec P1P2 (myP1,myP2);
Standard_Real Ndu = Du.Magnitude(); Standard_Real Ndu = myDu.Magnitude();
if (Ndu <= Tol) { if (Ndu <= Tol) {
Pnt P1, P2; Pnt P1, P2;
Vec V1; Vec V1;
Tool1::D1(*((Curve1*)myC1),myU+delta, P2, Duu); Tool1::D1(*((Curve1*)myC1),myU+delta, P2, Duu);
Tool1::D1(*((Curve1*)myC1),myU-delta, P1, V1); Tool1::D1(*((Curve1*)myC1),myU-delta, P1, V1);
Vec V(P1,P2); Vec V(P1,P2);
Du = V; myDu = V;
Duu -= V1; Duu -= V1;
Ndu = Du.Magnitude(); Ndu = myDu.Magnitude();
if (Ndu <= Tol) { if (Ndu <= Tol) {
return Standard_False; return Standard_False;
} }
} }
Standard_Real Ndv = Dv.Magnitude(); Standard_Real Ndv = myDv.Magnitude();
if (Ndv <= Tol) { if (Ndv <= Tol) {
Pnt P1, P2; Pnt P1, P2;
Vec V1; Vec V1;
Tool2::D1(*((Curve2*)myC2),myV+delta, P2, Dvv); Tool2::D1(*((Curve2*)myC2),myV+delta, P2, Dvv);
Tool2::D1(*((Curve2*)myC2),myV-delta, P1, V1); Tool2::D1(*((Curve2*)myC2),myV-delta, P1, V1);
Vec V(P1,P2); Vec V(P1,P2);
Dv = V; myDv = V;
Dvv -= V1; Dvv -= V1;
Ndv = Dv.Magnitude(); Ndv = myDv.Magnitude();
if (Ndv <= Tol) { if (Ndv <= Tol) {
return Standard_False; return Standard_False;
} }
} }
F(1) = P1P2.Dot(Du)/Ndu; F(1) = P1P2.Dot(myDu)/Ndu;
F(2) = P1P2.Dot(Dv)/Ndv; F(2) = P1P2.Dot(myDv)/Ndv;
Df(1,1) = - Ndu + (P1P2.Dot(Duu)/Ndu) - F(1)*(Du.Dot(Duu)/(Ndu*Ndu)); Df(1,1) = - Ndu + (P1P2.Dot(Duu)/Ndu) - F(1)*(myDu.Dot(Duu)/(Ndu*Ndu));
Df(1,2) = Dv.Dot(Du)/Ndu; Df(1,2) = myDv.Dot(myDu)/Ndu;
Df(2,1) = -Du.Dot(Dv)/Ndv; Df(2,1) = -myDu.Dot(myDv)/Ndv;
Df(2,2) = Ndv + (P1P2.Dot(Dvv)/Ndv) - F(2)*(Dv.Dot(Dvv)/(Ndv*Ndv)); Df(2,2) = Ndv + (P1P2.Dot(Dvv)/Ndv) - F(2)*(myDv.Dot(Dvv)/(Ndv*Ndv));
return Standard_True; return Standard_True;
} }
@ -165,11 +162,9 @@ Standard_Boolean Extrema_FuncExtCC::Values (const math_Vector& UV,
Standard_Integer Extrema_FuncExtCC::GetStateNumber () Standard_Integer Extrema_FuncExtCC::GetStateNumber ()
{ {
Vec Du, Dv; Vec Du (myDu), Dv (myDv);
Pnt P1, P2; Vec P1P2 (myP1, myP2);
Tool1::D1(*((Curve1*)myC1), myU, P1, Du);
Tool2::D1(*((Curve2*)myC2), myV, P2, Dv);
Vec P1P2 (P1, P2);
Standard_Real mod = Du.Magnitude(); Standard_Real mod = Du.Magnitude();
if(mod > Tol) { if(mod > Tol) {
Du /= mod; Du /= mod;