1 // Created on: 2012-11-29
2 // Created by: Peter KURNEV
3 // Copyright (c) 2012 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
21 #include <IntTools_EdgeEdge.ixx>
23 #include <gp_Elips.hxx>
30 #include <Geom_Curve.hxx>
31 #include <Geom_Line.hxx>
32 #include <Geom_Circle.hxx>
33 #include <Geom_Ellipse.hxx>
34 #include <Geom_Parabola.hxx>
35 #include <Geom_Hyperbola.hxx>
36 #include <Geom_BezierCurve.hxx>
37 #include <Geom_BSplineCurve.hxx>
38 #include <Geom_TrimmedCurve.hxx>
39 #include <Geom_OffsetCurve.hxx>
41 #include <GeomAPI_ProjectPointOnCurve.hxx>
43 #include <BRep_Tool.hxx>
46 //=======================================================================
47 //class : IntTools_ComparatorCurve
49 //=======================================================================
50 class IntTools_ComparatorCurve {
52 IntTools_ComparatorCurve() {
57 myIsSame=Standard_False;
60 virtual ~IntTools_ComparatorCurve(){
63 void SetCurve1(const BRepAdaptor_Curve& aBC3D) {
67 const BRepAdaptor_Curve& Curve1()const {
71 void SetRange1(const Standard_Real aT1,
72 const Standard_Real aT2) {
77 void Range1(Standard_Real& aT1, Standard_Real& aT2)const {
82 void SetCurve2(const BRepAdaptor_Curve& aBC3D){
86 const BRepAdaptor_Curve& Curve2()const{
90 void SetRange2(const Standard_Real aT1,
91 const Standard_Real aT2){
96 void Range2(Standard_Real& aT1,
97 Standard_Real& aT2)const {
102 Standard_Boolean IsSame()const {
108 //--------------------------------------
113 void IsSameBSplineCurve();
117 IsSameReal(const Standard_Real aR1,
118 const Standard_Real aR2);
122 IsSameAx2(const gp_Ax2& aAx21,
123 const gp_Ax2& aAx22);
127 IsSameAx1(const gp_Ax1& aAx1,
132 IsSamePnt(const gp_Pnt& aP1,
136 IsSameDir(const gp_Dir& aDir1,
137 const gp_Dir& aDir2);
141 IsSameXYZ(const gp_XYZ& aXYZ1,
142 const gp_XYZ& aXYZ2);
145 void GetCurveBase(const Handle(Geom_Curve)& aC3D,
146 GeomAbs_CurveType& aTypeBase,
147 Handle(Geom_Curve)& aCurveBase);
151 IsTypeBase(const Handle(Geom_Curve)& aC,
152 GeomAbs_CurveType& aTypeB);
155 BRepAdaptor_Curve myBC1;
159 BRepAdaptor_Curve myBC2;
163 Standard_Boolean myIsSame;
166 //=======================================================================
169 //=======================================================================
170 void IntTools_ComparatorCurve::Perform()
172 GeomAbs_CurveType aCurveType1, aCurveType2;
174 myIsSame=Standard_False;
176 aCurveType1=myBC1.GetType();
177 aCurveType2=myBC2.GetType();
179 myIsSame=(aCurveType1==aCurveType2);
184 myIsSame=IsSameReal(myT11, myT21);
189 myIsSame=IsSameReal(myT12, myT22);
194 if (aCurveType1==GeomAbs_Ellipse) {
198 else if (aCurveType1==GeomAbs_BSplineCurve) {
199 IsSameBSplineCurve();
203 myIsSame=Standard_False;
207 //=======================================================================
208 //function : IsSameBSplineCurve
210 //=======================================================================
211 void IntTools_ComparatorCurve::IsSameBSplineCurve()
213 Standard_Boolean bIsRational, bIsPreiodic;
214 Standard_Integer iNbPoles, iNbKnots, iDegree;
216 bIsRational=myBC1.IsRational();
217 myIsSame=(bIsRational==myBC2.IsRational());
222 iNbPoles=myBC1.NbPoles();
223 myIsSame=(iNbPoles==myBC2.NbPoles());
228 iNbKnots=myBC1.NbKnots();
229 myIsSame=(iNbKnots==myBC2.NbKnots());
234 iDegree=myBC1.Degree();
235 myIsSame=(iDegree==myBC2.Degree());
240 bIsPreiodic=myBC1.IsPeriodic();
241 myIsSame=(bIsPreiodic==myBC2.IsPeriodic());
246 //-------------------------------------------
247 Standard_Integer i, j, aM[2];
248 Standard_Real aT1, aT2, aX0[4], aX1[4];
249 GeomAbs_CurveType aTypeBase;
251 Handle(Geom_Curve) aC;
252 Handle(Geom_BSplineCurve) aBSp[2];
253 TopoDS_Edge aE1, aE2;
258 aC=BRep_Tool::Curve (aE1, aT1, aT2);
259 GetCurveBase(aC, aTypeBase, aBSp[0]);
261 aC=BRep_Tool::Curve (aE2, aT1, aT2);
262 GetCurveBase(aC, aTypeBase, aBSp[1]);
265 for(i=1; i<=iNbPoles; ++i) {
267 aP.Coord(aX0[0], aX0[1], aX0[2]);
268 aX0[3]=aBSp[0]->Weight(i);
271 aP.Coord(aX1[0], aX1[1], aX1[2]);
272 aX1[3]=aBSp[1]->Weight(i);
274 for (j=0; j<4; ++j) {
275 myIsSame=IsSameReal(aX0[j], aX1[j]);
280 }//for(i=1; i<iNbPoles; ++i) {
282 // Knots / Multiplicities
283 for(i=1; i<=iNbKnots; ++i) {
284 aX0[0]=aBSp[0]->Knot(i);
285 aX0[1]=aBSp[1]->Knot(i);
286 myIsSame=IsSameReal(aX0[0], aX0[1]);
291 aM[0]=aBSp[0]->Multiplicity(i);
292 aM[1]=aBSp[1]->Multiplicity(i);
293 myIsSame=(aM[0]==aM[1]);
299 //=======================================================================
300 //function : GetCurveBase
302 //=======================================================================
303 void IntTools_ComparatorCurve::GetCurveBase(const Handle(Geom_Curve)& aC3D,
304 GeomAbs_CurveType& aTypeBase,
305 Handle(Geom_Curve)& aCurveBase)
307 Standard_Boolean bIsTypeBase;
308 Standard_Integer iTrimmed, iOffset;
309 Standard_Real aOffsetBase;
310 GeomAbs_CurveType aTypeB;
311 Handle(Geom_Curve) aC3DB;
312 Handle(Geom_TrimmedCurve) aCT3D;
313 Handle(Geom_OffsetCurve) aCF3D;
315 aTypeBase=GeomAbs_OtherCurve;
319 bIsTypeBase=IsTypeBase(aC3DB, aTypeB);
329 aCT3D=Handle(Geom_TrimmedCurve)::DownCast(aC3DB);
330 if (!aCT3D.IsNull()) {
331 aC3DB=aCT3D->BasisCurve();
335 aCF3D=Handle(Geom_OffsetCurve)::DownCast(aC3DB);
336 if (!aCF3D.IsNull()) {
337 Standard_Real aOffset;
339 aOffset=aCF3D->Offset();
340 aOffsetBase=aOffsetBase+aOffset;
342 aC3DB=aCF3D->BasisCurve();
346 if (!(iTrimmed || iOffset)) {
350 bIsTypeBase=IsTypeBase(aC3DB, aTypeB);
358 //=======================================================================
359 //function : IsTypeBase
361 //=======================================================================
363 IntTools_ComparatorCurve::IsTypeBase(const Handle(Geom_Curve)& aC,
364 GeomAbs_CurveType& aTypeB)
366 Standard_Boolean bRet;
367 Handle(Standard_Type) aType;
371 aType=aC->DynamicType();
372 if (aType==STANDARD_TYPE(Geom_Line)) {
375 else if (aType==STANDARD_TYPE(Geom_Circle)) {
376 aTypeB=GeomAbs_Circle;
378 else if (aType==STANDARD_TYPE(Geom_Ellipse)) {
379 aTypeB=GeomAbs_Ellipse;
381 else if (aType==STANDARD_TYPE(Geom_Parabola)) {
382 aTypeB=GeomAbs_Parabola;
384 else if (aType==STANDARD_TYPE(Geom_Hyperbola)) {
385 aTypeB=GeomAbs_Hyperbola;
387 else if (aType==STANDARD_TYPE(Geom_BezierCurve)) {
388 aTypeB=GeomAbs_BezierCurve;
390 else if (aType==STANDARD_TYPE(Geom_BSplineCurve)) {
391 aTypeB=GeomAbs_BSplineCurve;
394 aTypeB=GeomAbs_OtherCurve;
399 //=======================================================================
400 //function : IsSameElipse
402 //=======================================================================
403 void IntTools_ComparatorCurve::IsSameElipse()
405 Standard_Real aR1, aR2;
406 gp_Elips aElips1, aElips2;
408 myIsSame=Standard_False;
410 aElips1=myBC1.Ellipse();
411 aElips2=myBC2.Ellipse();
413 aR1=aElips1.MajorRadius();
414 aR2=aElips2.MajorRadius();
415 myIsSame=IsSameReal(aR1, aR2);
420 aR1=aElips1.MinorRadius();
421 aR2=aElips2.MinorRadius();
422 myIsSame=IsSameReal(aR1, aR2);
427 const gp_Ax2& aAx21=aElips1.Position();
428 const gp_Ax2& aAx22=aElips2.Position();
429 myIsSame=IsSameAx2(aAx21, aAx22);
431 //=======================================================================
432 //function : IsSameAx2
434 //=======================================================================
436 IntTools_ComparatorCurve::IsSameAx2(const gp_Ax2& aAx21,
439 Standard_Boolean bRet;
441 const gp_Ax1& aAx1=aAx21.Axis();
442 const gp_Ax1& aAx2=aAx22.Axis();
444 bRet=IsSameAx1(aAx1, aAx2);
449 const gp_Dir& aDirX1=aAx21.XDirection();
450 const gp_Dir& aDirX2=aAx22.XDirection();
452 bRet=IsSameDir(aDirX1, aDirX2);
458 const gp_Dir& aDirY1=aAx21.YDirection();
459 const gp_Dir& aDirY2=aAx22.YDirection();
461 bRet=IsSameDir(aDirY1, aDirY2);
465 //=======================================================================
466 //function : IsSamePnt
468 //=======================================================================
470 IntTools_ComparatorCurve::IsSamePnt(const gp_Pnt& aP1,
473 const gp_XYZ& aXYZ1=aP1.XYZ();
474 const gp_XYZ& aXYZ2=aP2.XYZ();
475 return IsSameXYZ(aXYZ1, aXYZ2);
477 //=======================================================================
478 //function : IsSameAx1
480 //=======================================================================
482 IntTools_ComparatorCurve::IsSameAx1(const gp_Ax1& aAx1,
485 Standard_Boolean bRet;
487 const gp_Pnt& aP1=aAx1.Location();
488 const gp_Pnt& aP2=aAx2.Location();
490 bRet=IsSamePnt(aP1, aP2);
495 const gp_Dir& aDir1=aAx1.Direction();
496 const gp_Dir& aDir2=aAx2.Direction();
498 bRet=IsSameDir(aDir1, aDir2);
501 //=======================================================================
502 //function : IsSameDir
504 //=======================================================================
506 IntTools_ComparatorCurve::IsSameDir(const gp_Dir& aDir1,
509 const gp_XYZ& aXYZ1=aDir1.XYZ();
510 const gp_XYZ& aXYZ2=aDir2.XYZ();
511 return IsSameXYZ(aXYZ1, aXYZ2);
513 //=======================================================================
514 //function : IsSameXYZ
516 //=======================================================================
518 IntTools_ComparatorCurve::IsSameXYZ(const gp_XYZ& aXYZ1,
521 Standard_Boolean bRet;
523 Standard_Real aX1[3], aX2[3];
525 aXYZ1.Coord(aX1[0], aX1[1], aX1[2]);
526 aXYZ2.Coord(aX2[0], aX2[1], aX2[2]);
528 for (i=0; i<3; ++i) {
529 bRet=IsSameReal(aX1[i], aX2[i]);
536 //=======================================================================
537 //function : IsSameReal
539 //=======================================================================
541 IntTools_ComparatorCurve::IsSameReal(const Standard_Real aR1,
542 const Standard_Real aR2)
544 Standard_Boolean bRet;
545 Standard_Real aEpsilon;
547 aEpsilon=Epsilon(aR1);
548 bRet=(fabs(aR1-aR2)<aEpsilon);
552 //modified by NIZNHY-PKV Tue Jan 15 07:44:33 2013f
553 //=======================================================================
554 // class: IntTools_DistCC
556 //=======================================================================
557 class IntTools_DistCC {
576 void SetCurve1(const Handle(Geom_Curve)& aC1) {
580 const Handle(Geom_Curve)& Curve1()const {
584 void SetRange1(const Standard_Real aT11,
585 const Standard_Real aT12) {
590 void Range1(Standard_Real& aT11,
591 Standard_Real& aT12)const {
596 void SetCurve2(const Handle(Geom_Curve)& aC2) {
600 const Handle(Geom_Curve)& Curve2()const {
604 void SetRange2(const Standard_Real aT21,
605 const Standard_Real aT22) {
610 void Range2(Standard_Real& aT21,
611 Standard_Real& aT22)const {
616 void SetThreshold(const Standard_Real aD) {
620 Standard_Real Threshold() const {
626 Standard_Integer ErrorStatus()const {
627 return myErrorStatus;
630 Standard_Real MaxDeviation()const {
634 Standard_Real MaxParameter()const {
637 //-----------------------------------------------------
644 Standard_Real Distance(const Standard_Real aT);
646 void FindMaxDeviation();
648 void FindMaxLocal (const Standard_Real aT11,
649 const Standard_Real aT12,
650 const Standard_Real aEps,
658 Handle(Geom_Curve) myC1;
662 Handle(Geom_Curve) myC2;
664 Standard_Real myThreshold;
665 Standard_Integer myErrorStatus;
670 Standard_Integer myNbP;
671 Standard_Real myIndent;
673 GeomAPI_ProjectPointOnCurve myPPC2;
676 //=======================================================================
679 //=======================================================================
680 void IntTools_DistCC::Perform()
689 myPPC2.Init(myC2, myT21, myT22);
696 //=======================================================================
697 //function : CheckData
699 //=======================================================================
700 void IntTools_DistCC::CheckData()
715 //=======================================================================
716 //function : FindMaxDeviation
718 //=======================================================================
719 void IntTools_DistCC::FindMaxDeviation()
721 Standard_Integer i, aNbP1, aNbP2;
722 Standard_Real aTmax, aT, aT1, aT2, dT, aDmax, aEps, aD;
730 aEps=myEps*(myT12-myT11);
734 dT=(myT12-myT11)/aNbP1;
735 for (i=0; i<aNbP1; ++i) {
749 FindMaxLocal(aT1, aT2, aEps, aD, aT);
763 //=======================================================================
764 //function : FindMaxLocal
765 //purpose : Solver: Golden Mean
766 //=======================================================================
767 void IntTools_DistCC::FindMaxLocal(const Standard_Real aT11,
768 const Standard_Real aT12,
769 const Standard_Real aEps,
773 Standard_Integer iErr;
774 Standard_Real aA, aB, aCf, aX1, aX2, aF1, aF2, aX, aF;
781 aCf=1.6180339887498948482045868343656;// =0.5*(1.+sqrt(5.));
799 if (fabs(aA-aB)<aEps) {
833 //=======================================================================
834 //function : Distance
836 //=======================================================================
837 Standard_Real IntTools_DistCC::Distance(const Standard_Real aT)
839 Standard_Integer aNbP2;
851 aNbP2=myPPC2.NbPoints();
857 aD=myPPC2.LowerDistance();
858 if (aD>myThreshold) {
863 //modified by NIZNHY-PKV Tue Jan 15 07:44:44 2013t
865 //=======================================================================
866 //function : IsSameCurves
868 //=======================================================================
869 Standard_Boolean IntTools_EdgeEdge::IsSameCurves()
871 Standard_Boolean bRet, bIsBC;
872 GeomAbs_CurveType aCT1, aCT2;
873 IntTools_ComparatorCurve aICC;
876 aICC.SetCurve1(myCFrom);
877 aICC.SetRange1(myTminFrom, myTmaxFrom);
879 aICC.SetCurve2(myCTo);
880 aICC.SetRange2(myTminTo, myTmaxTo);
889 aCT1=myCFrom.GetType();
890 aCT2=myCTo.GetType();
891 bIsBC=(aCT1==GeomAbs_BSplineCurve ||
892 aCT1==GeomAbs_BezierCurve ||
893 aCT2==GeomAbs_BSplineCurve ||
894 aCT2==GeomAbs_BezierCurve);
897 Standard_Integer iErr;
898 Standard_Real aT11, aT12, aT21, aT22;
899 Handle(Geom_Curve) aC1, aC2;
900 IntTools_DistCC aDistCC;
902 const TopoDS_Edge& aE1=myCFrom.Edge();
903 aC1=BRep_Tool::Curve(aE1, aT11, aT12);
905 const TopoDS_Edge& aE2=myCTo.Edge();
906 aC2=BRep_Tool::Curve(aE2, aT21, aT22);
908 aDistCC.SetCurve1(aC1);
909 aDistCC.SetRange1(myTminFrom, myTmaxFrom);
910 aDistCC.SetCurve2(aC2);
911 aDistCC.SetRange2(myTminTo, myTmaxTo);
912 aDistCC.SetThreshold(myCriteria);
916 iErr=aDistCC.ErrorStatus();