1 // Created on: 2012-11-29
2 // Created by: Peter KURNEV
3 // Copyright (c) 2012-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and / or modify it
8 // under the terms of the GNU Lesser General Public version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <IntTools_EdgeEdge.ixx>
18 #include <gp_Elips.hxx>
25 #include <Geom_Curve.hxx>
26 #include <Geom_Line.hxx>
27 #include <Geom_Circle.hxx>
28 #include <Geom_Ellipse.hxx>
29 #include <Geom_Parabola.hxx>
30 #include <Geom_Hyperbola.hxx>
31 #include <Geom_BezierCurve.hxx>
32 #include <Geom_BSplineCurve.hxx>
33 #include <Geom_TrimmedCurve.hxx>
34 #include <Geom_OffsetCurve.hxx>
36 #include <GeomAPI_ProjectPointOnCurve.hxx>
38 #include <BRep_Tool.hxx>
41 //=======================================================================
42 //class : IntTools_ComparatorCurve
44 //=======================================================================
45 class IntTools_ComparatorCurve {
47 IntTools_ComparatorCurve() {
52 myIsSame=Standard_False;
55 virtual ~IntTools_ComparatorCurve(){
58 void SetCurve1(const BRepAdaptor_Curve& aBC3D) {
62 const BRepAdaptor_Curve& Curve1()const {
66 void SetRange1(const Standard_Real aT1,
67 const Standard_Real aT2) {
72 void Range1(Standard_Real& aT1, Standard_Real& aT2)const {
77 void SetCurve2(const BRepAdaptor_Curve& aBC3D){
81 const BRepAdaptor_Curve& Curve2()const{
85 void SetRange2(const Standard_Real aT1,
86 const Standard_Real aT2){
91 void Range2(Standard_Real& aT1,
92 Standard_Real& aT2)const {
97 Standard_Boolean IsSame()const {
103 //--------------------------------------
108 void IsSameBSplineCurve();
112 IsSameReal(const Standard_Real aR1,
113 const Standard_Real aR2);
117 IsSameAx2(const gp_Ax2& aAx21,
118 const gp_Ax2& aAx22);
122 IsSameAx1(const gp_Ax1& aAx1,
127 IsSamePnt(const gp_Pnt& aP1,
131 IsSameDir(const gp_Dir& aDir1,
132 const gp_Dir& aDir2);
136 IsSameXYZ(const gp_XYZ& aXYZ1,
137 const gp_XYZ& aXYZ2);
140 void GetCurveBase(const Handle(Geom_Curve)& aC3D,
141 GeomAbs_CurveType& aTypeBase,
142 Handle(Geom_Curve)& aCurveBase);
146 IsTypeBase(const Handle(Geom_Curve)& aC,
147 GeomAbs_CurveType& aTypeB);
150 BRepAdaptor_Curve myBC1;
154 BRepAdaptor_Curve myBC2;
158 Standard_Boolean myIsSame;
161 //=======================================================================
164 //=======================================================================
165 void IntTools_ComparatorCurve::Perform()
167 GeomAbs_CurveType aCurveType1, aCurveType2;
169 myIsSame=Standard_False;
171 aCurveType1=myBC1.GetType();
172 aCurveType2=myBC2.GetType();
174 myIsSame=(aCurveType1==aCurveType2);
179 myIsSame=IsSameReal(myT11, myT21);
184 myIsSame=IsSameReal(myT12, myT22);
189 if (aCurveType1==GeomAbs_Ellipse) {
193 else if (aCurveType1==GeomAbs_BSplineCurve) {
194 IsSameBSplineCurve();
198 myIsSame=Standard_False;
202 //=======================================================================
203 //function : IsSameBSplineCurve
205 //=======================================================================
206 void IntTools_ComparatorCurve::IsSameBSplineCurve()
208 Standard_Boolean bIsRational, bIsPreiodic;
209 Standard_Integer iNbPoles, iNbKnots, iDegree;
211 bIsRational=myBC1.IsRational();
212 myIsSame=(bIsRational==myBC2.IsRational());
217 iNbPoles=myBC1.NbPoles();
218 myIsSame=(iNbPoles==myBC2.NbPoles());
223 iNbKnots=myBC1.NbKnots();
224 myIsSame=(iNbKnots==myBC2.NbKnots());
229 iDegree=myBC1.Degree();
230 myIsSame=(iDegree==myBC2.Degree());
235 bIsPreiodic=myBC1.IsPeriodic();
236 myIsSame=(bIsPreiodic==myBC2.IsPeriodic());
241 //-------------------------------------------
242 Standard_Integer i, j, aM[2];
243 Standard_Real aT1, aT2, aX0[4], aX1[4];
244 GeomAbs_CurveType aTypeBase;
246 Handle(Geom_Curve) aC;
247 Handle(Geom_BSplineCurve) aBSp[2];
248 TopoDS_Edge aE1, aE2;
253 aC=BRep_Tool::Curve (aE1, aT1, aT2);
254 GetCurveBase(aC, aTypeBase, aBSp[0]);
256 aC=BRep_Tool::Curve (aE2, aT1, aT2);
257 GetCurveBase(aC, aTypeBase, aBSp[1]);
260 for(i=1; i<=iNbPoles; ++i) {
262 aP.Coord(aX0[0], aX0[1], aX0[2]);
263 aX0[3]=aBSp[0]->Weight(i);
266 aP.Coord(aX1[0], aX1[1], aX1[2]);
267 aX1[3]=aBSp[1]->Weight(i);
269 for (j=0; j<4; ++j) {
270 myIsSame=IsSameReal(aX0[j], aX1[j]);
275 }//for(i=1; i<iNbPoles; ++i) {
277 // Knots / Multiplicities
278 for(i=1; i<=iNbKnots; ++i) {
279 aX0[0]=aBSp[0]->Knot(i);
280 aX0[1]=aBSp[1]->Knot(i);
281 myIsSame=IsSameReal(aX0[0], aX0[1]);
286 aM[0]=aBSp[0]->Multiplicity(i);
287 aM[1]=aBSp[1]->Multiplicity(i);
288 myIsSame=(aM[0]==aM[1]);
294 //=======================================================================
295 //function : GetCurveBase
297 //=======================================================================
298 void IntTools_ComparatorCurve::GetCurveBase(const Handle(Geom_Curve)& aC3D,
299 GeomAbs_CurveType& aTypeBase,
300 Handle(Geom_Curve)& aCurveBase)
302 Standard_Boolean bIsTypeBase;
303 Standard_Integer iTrimmed, iOffset;
304 Standard_Real aOffsetBase;
305 GeomAbs_CurveType aTypeB;
306 Handle(Geom_Curve) aC3DB;
307 Handle(Geom_TrimmedCurve) aCT3D;
308 Handle(Geom_OffsetCurve) aCF3D;
310 aTypeBase=GeomAbs_OtherCurve;
314 bIsTypeBase=IsTypeBase(aC3DB, aTypeB);
324 aCT3D=Handle(Geom_TrimmedCurve)::DownCast(aC3DB);
325 if (!aCT3D.IsNull()) {
326 aC3DB=aCT3D->BasisCurve();
330 aCF3D=Handle(Geom_OffsetCurve)::DownCast(aC3DB);
331 if (!aCF3D.IsNull()) {
332 Standard_Real aOffset;
334 aOffset=aCF3D->Offset();
335 aOffsetBase=aOffsetBase+aOffset;
337 aC3DB=aCF3D->BasisCurve();
341 if (!(iTrimmed || iOffset)) {
345 bIsTypeBase=IsTypeBase(aC3DB, aTypeB);
353 //=======================================================================
354 //function : IsTypeBase
356 //=======================================================================
358 IntTools_ComparatorCurve::IsTypeBase(const Handle(Geom_Curve)& aC,
359 GeomAbs_CurveType& aTypeB)
361 Standard_Boolean bRet;
362 Handle(Standard_Type) aType;
366 aType=aC->DynamicType();
367 if (aType==STANDARD_TYPE(Geom_Line)) {
370 else if (aType==STANDARD_TYPE(Geom_Circle)) {
371 aTypeB=GeomAbs_Circle;
373 else if (aType==STANDARD_TYPE(Geom_Ellipse)) {
374 aTypeB=GeomAbs_Ellipse;
376 else if (aType==STANDARD_TYPE(Geom_Parabola)) {
377 aTypeB=GeomAbs_Parabola;
379 else if (aType==STANDARD_TYPE(Geom_Hyperbola)) {
380 aTypeB=GeomAbs_Hyperbola;
382 else if (aType==STANDARD_TYPE(Geom_BezierCurve)) {
383 aTypeB=GeomAbs_BezierCurve;
385 else if (aType==STANDARD_TYPE(Geom_BSplineCurve)) {
386 aTypeB=GeomAbs_BSplineCurve;
389 aTypeB=GeomAbs_OtherCurve;
394 //=======================================================================
395 //function : IsSameElipse
397 //=======================================================================
398 void IntTools_ComparatorCurve::IsSameElipse()
400 Standard_Real aR1, aR2;
401 gp_Elips aElips1, aElips2;
403 myIsSame=Standard_False;
405 aElips1=myBC1.Ellipse();
406 aElips2=myBC2.Ellipse();
408 aR1=aElips1.MajorRadius();
409 aR2=aElips2.MajorRadius();
410 myIsSame=IsSameReal(aR1, aR2);
415 aR1=aElips1.MinorRadius();
416 aR2=aElips2.MinorRadius();
417 myIsSame=IsSameReal(aR1, aR2);
422 const gp_Ax2& aAx21=aElips1.Position();
423 const gp_Ax2& aAx22=aElips2.Position();
424 myIsSame=IsSameAx2(aAx21, aAx22);
426 //=======================================================================
427 //function : IsSameAx2
429 //=======================================================================
431 IntTools_ComparatorCurve::IsSameAx2(const gp_Ax2& aAx21,
434 Standard_Boolean bRet;
436 const gp_Ax1& aAx1=aAx21.Axis();
437 const gp_Ax1& aAx2=aAx22.Axis();
439 bRet=IsSameAx1(aAx1, aAx2);
444 const gp_Dir& aDirX1=aAx21.XDirection();
445 const gp_Dir& aDirX2=aAx22.XDirection();
447 bRet=IsSameDir(aDirX1, aDirX2);
453 const gp_Dir& aDirY1=aAx21.YDirection();
454 const gp_Dir& aDirY2=aAx22.YDirection();
456 bRet=IsSameDir(aDirY1, aDirY2);
460 //=======================================================================
461 //function : IsSamePnt
463 //=======================================================================
465 IntTools_ComparatorCurve::IsSamePnt(const gp_Pnt& aP1,
468 const gp_XYZ& aXYZ1=aP1.XYZ();
469 const gp_XYZ& aXYZ2=aP2.XYZ();
470 return IsSameXYZ(aXYZ1, aXYZ2);
472 //=======================================================================
473 //function : IsSameAx1
475 //=======================================================================
477 IntTools_ComparatorCurve::IsSameAx1(const gp_Ax1& aAx1,
480 Standard_Boolean bRet;
482 const gp_Pnt& aP1=aAx1.Location();
483 const gp_Pnt& aP2=aAx2.Location();
485 bRet=IsSamePnt(aP1, aP2);
490 const gp_Dir& aDir1=aAx1.Direction();
491 const gp_Dir& aDir2=aAx2.Direction();
493 bRet=IsSameDir(aDir1, aDir2);
496 //=======================================================================
497 //function : IsSameDir
499 //=======================================================================
501 IntTools_ComparatorCurve::IsSameDir(const gp_Dir& aDir1,
504 const gp_XYZ& aXYZ1=aDir1.XYZ();
505 const gp_XYZ& aXYZ2=aDir2.XYZ();
506 return IsSameXYZ(aXYZ1, aXYZ2);
508 //=======================================================================
509 //function : IsSameXYZ
511 //=======================================================================
513 IntTools_ComparatorCurve::IsSameXYZ(const gp_XYZ& aXYZ1,
516 Standard_Boolean bRet = Standard_False;
518 Standard_Real aX1[3], aX2[3];
520 aXYZ1.Coord(aX1[0], aX1[1], aX1[2]);
521 aXYZ2.Coord(aX2[0], aX2[1], aX2[2]);
523 for (i=0; i<3; ++i) {
524 bRet=IsSameReal(aX1[i], aX2[i]);
531 //=======================================================================
532 //function : IsSameReal
534 //=======================================================================
536 IntTools_ComparatorCurve::IsSameReal(const Standard_Real aR1,
537 const Standard_Real aR2)
539 Standard_Boolean bRet;
540 Standard_Real aEpsilon;
542 aEpsilon=Epsilon(aR1);
543 bRet=(fabs(aR1-aR2)<aEpsilon);
547 //modified by NIZNHY-PKV Tue Jan 15 07:44:33 2013f
548 //=======================================================================
549 // class: IntTools_DistCC
551 //=======================================================================
552 class IntTools_DistCC {
571 void SetCurve1(const Handle(Geom_Curve)& aC1) {
575 const Handle(Geom_Curve)& Curve1()const {
579 void SetRange1(const Standard_Real aT11,
580 const Standard_Real aT12) {
585 void Range1(Standard_Real& aT11,
586 Standard_Real& aT12)const {
591 void SetCurve2(const Handle(Geom_Curve)& aC2) {
595 const Handle(Geom_Curve)& Curve2()const {
599 void SetRange2(const Standard_Real aT21,
600 const Standard_Real aT22) {
605 void Range2(Standard_Real& aT21,
606 Standard_Real& aT22)const {
611 void SetThreshold(const Standard_Real aD) {
615 Standard_Real Threshold() const {
621 Standard_Integer ErrorStatus()const {
622 return myErrorStatus;
625 Standard_Real MaxDeviation()const {
629 Standard_Real MaxParameter()const {
632 //-----------------------------------------------------
639 Standard_Real Distance(const Standard_Real aT);
641 void FindMaxDeviation();
643 void FindMaxLocal (const Standard_Real aT11,
644 const Standard_Real aT12,
645 const Standard_Real aEps,
653 Handle(Geom_Curve) myC1;
657 Handle(Geom_Curve) myC2;
659 Standard_Real myThreshold;
660 Standard_Integer myErrorStatus;
665 Standard_Integer myNbP;
666 Standard_Real myIndent;
668 GeomAPI_ProjectPointOnCurve myPPC2;
671 //=======================================================================
674 //=======================================================================
675 void IntTools_DistCC::Perform()
684 myPPC2.Init(myC2, myT21, myT22);
691 //=======================================================================
692 //function : CheckData
694 //=======================================================================
695 void IntTools_DistCC::CheckData()
710 //=======================================================================
711 //function : FindMaxDeviation
713 //=======================================================================
714 void IntTools_DistCC::FindMaxDeviation()
716 Standard_Integer i, aNbP1, aNbP2;
717 Standard_Real aTmax, aT, aT1, aT2, dT, aDmax, aEps, aD;
725 aEps=myEps*(myT12-myT11);
729 dT=(myT12-myT11)/aNbP1;
730 for (i=0; i<aNbP1; ++i) {
744 FindMaxLocal(aT1, aT2, aEps, aD, aT);
758 //=======================================================================
759 //function : FindMaxLocal
760 //purpose : Solver: Golden Mean
761 //=======================================================================
762 void IntTools_DistCC::FindMaxLocal(const Standard_Real aT11,
763 const Standard_Real aT12,
764 const Standard_Real aEps,
768 Standard_Integer iErr;
769 Standard_Real aA, aB, aCf, aX1, aX2, aF1, aF2, aX, aF;
776 aCf=1.6180339887498948482045868343656;// =0.5*(1.+sqrt(5.));
794 if (fabs(aA-aB)<aEps) {
828 //=======================================================================
829 //function : Distance
831 //=======================================================================
832 Standard_Real IntTools_DistCC::Distance(const Standard_Real aT)
834 Standard_Integer aNbP2;
846 aNbP2=myPPC2.NbPoints();
852 aD=myPPC2.LowerDistance();
853 if (aD>myThreshold) {
858 //modified by NIZNHY-PKV Tue Jan 15 07:44:44 2013t
860 //=======================================================================
861 //function : IsSameCurves
863 //=======================================================================
864 Standard_Boolean IntTools_EdgeEdge::IsSameCurves()
866 Standard_Boolean bRet, bIsBC;
867 GeomAbs_CurveType aCT1, aCT2;
868 IntTools_ComparatorCurve aICC;
871 aICC.SetCurve1(myCFrom);
872 aICC.SetRange1(myTminFrom, myTmaxFrom);
874 aICC.SetCurve2(myCTo);
875 aICC.SetRange2(myTminTo, myTmaxTo);
884 aCT1=myCFrom.GetType();
885 aCT2=myCTo.GetType();
886 bIsBC=(aCT1==GeomAbs_BSplineCurve ||
887 aCT1==GeomAbs_BezierCurve ||
888 aCT2==GeomAbs_BSplineCurve ||
889 aCT2==GeomAbs_BezierCurve);
892 Standard_Integer iErr;
893 Standard_Real aT11, aT12, aT21, aT22;
894 Handle(Geom_Curve) aC1, aC2;
895 IntTools_DistCC aDistCC;
897 const TopoDS_Edge& aE1=myCFrom.Edge();
898 aC1=BRep_Tool::Curve(aE1, aT11, aT12);
900 const TopoDS_Edge& aE2=myCTo.Edge();
901 aC2=BRep_Tool::Curve(aE2, aT21, aT22);
903 aDistCC.SetCurve1(aC1);
904 aDistCC.SetRange1(myTminFrom, myTmaxFrom);
905 aDistCC.SetCurve2(aC2);
906 aDistCC.SetRange2(myTminTo, myTmaxTo);
907 aDistCC.SetThreshold(myCriteria);
911 iErr=aDistCC.ErrorStatus();