diff --git a/src/IntTools/IntTools_EdgeEdge_1.cxx b/src/IntTools/IntTools_EdgeEdge_1.cxx index 7fbca1d7e1..53ef989f3f 100644 --- a/src/IntTools/IntTools_EdgeEdge_1.cxx +++ b/src/IntTools/IntTools_EdgeEdge_1.cxx @@ -38,8 +38,10 @@ #include #include // +#include +// #include -#include + //======================================================================= //class : IntTools_ComparatorCurve @@ -160,6 +162,7 @@ class IntTools_ComparatorCurve { // Standard_Boolean myIsSame; }; +// //======================================================================= //function : Perform //purpose : @@ -545,15 +548,331 @@ Standard_Boolean bRet=(fabs(aR1-aR2)myT12) { + aT2=myT12; + } + } + // + FindMaxLocal(aT1, aT2, aEps, aD, aT); + if (myErrorStatus) { + return ; + } + // + if (aD>aDmax) { + aDmax=aD; + aTmax=aT; + } + } + // + myTx=aTmax; + myDx=aDmax; +} +//======================================================================= +//function : FindMaxLocal +//purpose : Solver: Golden Mean +//======================================================================= +void IntTools_DistCC::FindMaxLocal(const Standard_Real aT11, + const Standard_Real aT12, + const Standard_Real aEps, + Standard_Real& aDx, + Standard_Real& aTx) +{ + Standard_Integer iErr; + Standard_Real aA, aB, aCf, aX1, aX2, aF1, aF2, aX, aF; + // + myErrorStatus=0; + iErr=0; + aDx=0.; + aTx=0.; + // + aCf=1.6180339887498948482045868343656;// =0.5*(1.+sqrt(5.)); + // + aA=aT11; + aB=aT12; + // + aX1=aB-(aB-aA)/aCf; + aF1=Distance(aX1); + if (myErrorStatus) { + return ; + } + // + aX2=aA+(aB-aA)/aCf; + aF2=Distance(aX2); + if (myErrorStatus) { + return; + } + // + while(1) { + if (fabs(aA-aB)D0(aT, aP1); + myPPC2.Perform(aP1); + // + aNbP2=myPPC2.NbPoints(); + if (!aNbP2) { + myErrorStatus=4; + return aD; + } + // + aD=myPPC2.LowerDistance(); + if (aD>myThreshold) { + myErrorStatus=10; + } + return aD; +} +//modified by NIZNHY-PKV Tue Jan 15 07:44:44 2013t +// //======================================================================= //function : IsSameCurves //purpose : //======================================================================= Standard_Boolean IntTools_EdgeEdge::IsSameCurves() { - Standard_Boolean bRet; + Standard_Boolean bRet, bIsBC; + GeomAbs_CurveType aCT1, aCT2; IntTools_ComparatorCurve aICC; // + // 1. Check letter aICC.SetCurve1(myCFrom); aICC.SetRange1(myTminFrom, myTmaxFrom); // @@ -562,6 +881,43 @@ Standard_Boolean IntTools_EdgeEdge::IsSameCurves() // aICC.Perform(); bRet=aICC.IsSame(); + if (bRet) { + return bRet; + } // + // 2. Check inwards + aCT1=myCFrom.GetType(); + aCT2=myCTo.GetType(); + bIsBC=(aCT1==GeomAbs_BSplineCurve || + aCT1==GeomAbs_BezierCurve || + aCT2==GeomAbs_BSplineCurve || + aCT2==GeomAbs_BezierCurve); + // + if (bIsBC) { + Standard_Integer iErr; + Standard_Real aT11, aT12, aT21, aT22; + Handle(Geom_Curve) aC1, aC2; + IntTools_DistCC aDistCC; + // + const TopoDS_Edge& aE1=myCFrom.Edge(); + aC1=BRep_Tool::Curve(aE1, aT11, aT12); + // + const TopoDS_Edge& aE2=myCTo.Edge(); + aC2=BRep_Tool::Curve(aE2, aT21, aT22); + // + aDistCC.SetCurve1(aC1); + aDistCC.SetRange1(myTminFrom, myTmaxFrom); + aDistCC.SetCurve2(aC2); + aDistCC.SetRange2(myTminTo, myTmaxTo); + aDistCC.SetThreshold(myCriteria); + // + aDistCC.Perform(); + // + iErr=aDistCC.ErrorStatus(); + // + bRet=(!iErr); + // + } return bRet; } +