// File: Intf_Tool.cxx // Created: Wed Jun 23 18:38:51 1993 // Author: Didier PIFFAULT // #include #include #include #include #include #include #include #include #include //======================================================================= //function : Intf_Tool //purpose : //======================================================================= Intf_Tool::Intf_Tool() : nbSeg(0) {} //======================================================================= //function : Lin2dBox //purpose : //======================================================================= void Intf_Tool::Lin2dBox(const gp_Lin2d& L2d, const Bnd_Box2d& domain, Bnd_Box2d& boxLin) { nbSeg=0; boxLin.SetVoid(); if (domain.IsWhole()) { boxLin.Set(L2d.Location(), L2d.Direction()); boxLin.Add(L2d.Direction().Reversed()); nbSeg=1; beginOnCurve[0]=-Precision::Infinite(); endOnCurve[0]=Precision::Infinite(); return; } else if (domain.IsVoid()) return; Standard_Real xmin, xmax, ymin, ymax; Standard_Real Xmin=0, Xmax=0, Ymin=0, Ymax=0; Standard_Real parmin=-Precision::Infinite(); Standard_Real parmax=Precision::Infinite(); Standard_Real parcur, par1,par2; Standard_Boolean xToSet, yToSet; domain.Get(xmin,ymin,xmax,ymax); if (L2d.Direction().XY().X()>0.) { if (domain.IsOpenXmin()) parmin=-Precision::Infinite(); else parmin=(xmin-L2d.Location().XY().X())/L2d.Direction().XY().X(); if (domain.IsOpenXmax()) parmax=Precision::Infinite(); else parmax=(xmax-L2d.Location().XY().X())/L2d.Direction().XY().X(); xToSet=Standard_True; } else if (L2d.Direction().XY().X()<0.) { if (domain.IsOpenXmax()) parmin=-Precision::Infinite(); else parmin=(xmax-L2d.Location().XY().X())/L2d.Direction().XY().X(); if (domain.IsOpenXmin()) parmax=Precision::Infinite(); else parmax=(xmin-L2d.Location().XY().X())/L2d.Direction().XY().X(); xToSet=Standard_True; } else { // Parallel to axis X if (L2d.Location().XY().X()0.) { if (domain.IsOpenYmin()) parcur=-Precision::Infinite(); else parcur=(ymin-L2d.Location().XY().Y())/L2d.Direction().XY().Y(); parmin=Max(parmin, parcur); if (domain.IsOpenYmax()) parcur=Precision::Infinite(); else parcur=(ymax-L2d.Location().XY().Y())/L2d.Direction().XY().Y(); parmax=Min(parmax, parcur); yToSet=Standard_True; } else if (L2d.Direction().XY().Y()<0.) { if (domain.IsOpenYmax()) parcur=-Precision::Infinite(); else parcur=(ymax-L2d.Location().XY().Y())/L2d.Direction().XY().Y(); parmin=Max(parmin, parcur); if (domain.IsOpenYmin()) parcur=Precision::Infinite(); else parcur=(ymin-L2d.Location().XY().Y())/L2d.Direction().XY().Y(); parmax=Min(parmax, parcur); yToSet=Standard_True; } else { // Parallel to axis Y if (L2d.Location().XY().Y()0) { Standard_Real Xmin, Xmax, Ymin, Ymax; domain.Get(Xmax, Ymax, Xmin, Ymin); Standard_Integer npi; for (npi=0; npiPrecision::Angular()) { if (sinan>0.) { out=Standard_False; beginOnCurve[nbSeg]=parint[npi]; nbSeg++; } else { if (out) { beginOnCurve[nbSeg]=-Precision::Infinite(); nbSeg++; } endOnCurve[nbSeg-1]=parint[npi]; out=Standard_True; Standard_Integer ipmin; if(beginOnCurve[nbSeg-1] < -10.) ipmin = -10; else ipmin = (Standard_Integer)(beginOnCurve[nbSeg-1]); Standard_Integer ipmax; if(endOnCurve[nbSeg-1] > 10.) ipmax = 10; else ipmax = (Standard_Integer)(endOnCurve[nbSeg-1]); //Standard_Integer ipmin=Max((Standard_Integer)(beginOnCurve[nbSeg-1]), // -10); //Standard_Integer ipmax=Min((Standard_Integer)(endOnCurve[nbSeg-1]), // 10); ipmin=ipmin*10+1; ipmax=ipmax*10-1; Standard_Integer ip, pas=1; for (ip=ipmin; ip<=ipmax; ip+=pas) { boxHypr2d.Add(ElCLib::Value(Standard_Real(ip)/10., theHypr2d)); if (Abs(ip)<=10) pas=1; else pas=10; } } } } } else if (!domain.IsOut(ElCLib::Value(0., theHypr2d))) { boxHypr2d=domain; beginOnCurve[0]=-Precision::Infinite(); endOnCurve[0]=Precision::Infinite(); nbSeg=1; } } //======================================================================= //function : Inters2d //purpose : //======================================================================= Standard_Integer Intf_Tool::Inters2d(const gp_Hypr2d& theCurv, const Bnd_Box2d& Domain) { Standard_Integer nbpi=0; Standard_Integer npi; Standard_Real xmin, xmax, ymin, ymax; Domain.Get(xmin,ymin,xmax,ymax); if (!Domain.IsOpenYmax()) { gp_Lin2d L1(gp_Pnt2d(0., ymax), gp_Dir2d(-1., 0.)); IntAna2d_AnaIntersection Inters1(theCurv, IntAna2d_Conic(L1)); if (Inters1.IsDone()) { if (!Inters1.IsEmpty()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).Value().X(); if (xmin < xint[nbpi] && xint[nbpi] <=xmax) { yint[nbpi]=ymax; parint[nbpi]=Inters1.Point(npi).ParamOnFirst(); bord[nbpi]=1; nbpi++; } } } } } if (!Domain.IsOpenXmin()) { gp_Lin2d L2(gp_Pnt2d(xmin, 0.), gp_Dir2d(0., -1.)); IntAna2d_AnaIntersection Inters2(theCurv, IntAna2d_Conic(L2)); if (Inters2.IsDone()) { if (!Inters2.IsEmpty()) { for (npi=1; npi<=Inters2.NbPoints(); npi++) { yint[nbpi]=Inters2.Point(npi).Value().Y(); if (ymin < yint[nbpi] && yint[nbpi] <=ymax) { xint[nbpi]=xmin; parint[nbpi]=Inters2.Point(npi).ParamOnFirst(); bord[nbpi]=2; nbpi++; } } } } } if (!Domain.IsOpenYmin()) { gp_Lin2d L3(gp_Pnt2d(0., ymin), gp_Dir2d(1., 0.)); IntAna2d_AnaIntersection Inters3(theCurv, IntAna2d_Conic(L3)); if (Inters3.IsDone()) { if (!Inters3.IsEmpty()) { for (npi=1; npi<=Inters3.NbPoints(); npi++) { xint[nbpi]=Inters3.Point(npi).Value().X(); if (xmin <=xint[nbpi] && xint[nbpi] 0) { Standard_Real Xmin, Xmax, Ymin, Ymax; domain.Get(Xmax, Ymax, Xmin, Ymin); Standard_Integer npi; for (npi=0; npiPrecision::Angular()) { if (sinan>0.) { out=Standard_False; beginOnCurve[nbSeg]=parint[npi]; nbSeg++; } else { if (out) { beginOnCurve[nbSeg]=-Precision::Infinite(); nbSeg++; } endOnCurve[nbSeg-1]=parint[npi]; out=Standard_True; Standard_Integer ipmin; if(beginOnCurve[nbSeg-1] < -10.) ipmin = -10; else ipmin = (Standard_Integer)(beginOnCurve[nbSeg-1]); Standard_Integer ipmax; if(endOnCurve[nbSeg-1] > 10.) ipmax = 10; else ipmax = (Standard_Integer)(endOnCurve[nbSeg-1]); //Standard_Integer ipmin=Max((Standard_Integer)(beginOnCurve[nbSeg-1]), // -10); //Standard_Integer ipmax=Min((Standard_Integer)(endOnCurve[nbSeg-1]), // 10); ipmin=ipmin*10+1; ipmax=ipmax*10-1; Standard_Integer ip, pas=1; for (ip=ipmin; ip<=ipmax; ip+=pas) { boxParab2d.Add(ElCLib::Value(Standard_Real(ip)/10., theParab2d)); if (Abs(ip)<=10) pas=1; else pas=10; } } } } } else if (!domain.IsOut(ElCLib::Value(0., theParab2d))) { boxParab2d=domain; beginOnCurve[0]=-Precision::Infinite(); endOnCurve[0]=Precision::Infinite(); nbSeg=1; } } //======================================================================= //function : Inters2d //purpose : //======================================================================= Standard_Integer Intf_Tool::Inters2d(const gp_Parab2d& theCurv, const Bnd_Box2d& Domain) { Standard_Integer nbpi=0; Standard_Integer npi; Standard_Real xmin, xmax, ymin, ymax; Domain.Get(xmin,ymin,xmax,ymax); if (!Domain.IsOpenYmax()) { gp_Lin2d L1(gp_Pnt2d(0., ymax), gp_Dir2d(-1., 0.)); IntAna2d_AnaIntersection Inters1(theCurv, IntAna2d_Conic(L1)); if (Inters1.IsDone()) { if (!Inters1.IsEmpty()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).Value().X(); if (xmin < xint[nbpi] && xint[nbpi] <=xmax) { yint[nbpi]=ymax; parint[nbpi]=Inters1.Point(npi).ParamOnFirst(); bord[nbpi]=1; nbpi++; } } } } } if (!Domain.IsOpenXmin()) { gp_Lin2d L2(gp_Pnt2d(xmin, 0.), gp_Dir2d(0., -1.)); IntAna2d_AnaIntersection Inters2(theCurv, IntAna2d_Conic(L2)); if (Inters2.IsDone()) { if (!Inters2.IsEmpty()) { for (npi=1; npi<=Inters2.NbPoints(); npi++) { yint[nbpi]=Inters2.Point(npi).Value().Y(); if (ymin < yint[nbpi] && yint[nbpi] <=ymax) { xint[nbpi]=xmin; parint[nbpi]=Inters2.Point(npi).ParamOnFirst(); bord[nbpi]=2; nbpi++; } } } } } if (!Domain.IsOpenYmin()) { gp_Lin2d L3(gp_Pnt2d(0., ymin), gp_Dir2d(1., 0.)); IntAna2d_AnaIntersection Inters3(theCurv, IntAna2d_Conic(L3)); if (Inters3.IsDone()) { if (!Inters3.IsEmpty()) { for (npi=1; npi<=Inters3.NbPoints(); npi++) { xint[nbpi]=Inters3.Point(npi).Value().X(); if (xmin <=xint[nbpi] && xint[nbpi] 0.) { if (domain.IsOpenXmin()) parmin=-Precision::Infinite(); else parmin=(xmin-L.Location().XYZ().X())/L.Direction().XYZ().X(); if (domain.IsOpenXmax()) parmax=Precision::Infinite(); else parmax=(xmax-L.Location().XYZ().X())/L.Direction().XYZ().X(); xToSet=Standard_True; } else if (L.Direction().XYZ().X()<0.) { if (domain.IsOpenXmax()) parmin=-Precision::Infinite(); else parmin=(xmax-L.Location().XYZ().X())/L.Direction().XYZ().X(); if (domain.IsOpenXmin()) parmax=Precision::Infinite(); else parmax=(xmin-L.Location().XYZ().X())/L.Direction().XYZ().X(); xToSet=Standard_True; } else { // Perpendiculaire a l axe X if (L.Location().XYZ().X()0.) { if (domain.IsOpenYmin()) parcur=-Precision::Infinite(); else parcur=(ymin-L.Location().XYZ().Y())/L.Direction().XYZ().Y(); parmin=Max(parmin, parcur); if (domain.IsOpenYmax()) parcur=Precision::Infinite(); else parcur=(ymax-L.Location().XYZ().Y())/L.Direction().XYZ().Y(); parmax=Min(parmax, parcur); yToSet=Standard_True; } else if (L.Direction().XYZ().Y()<0.) { if (domain.IsOpenYmax()) parcur=-Precision::Infinite(); else parcur=(ymax-L.Location().XYZ().Y())/L.Direction().XYZ().Y(); parmin=Max(parmin, parcur); if (domain.IsOpenYmin()) parcur=Precision::Infinite(); else parcur=(ymin-L.Location().XYZ().Y())/L.Direction().XYZ().Y(); parmax=Min(parmax, parcur); yToSet=Standard_True; } else { // Perpendiculaire a l axe Y if (L.Location().XYZ().Y()0.) { if (domain.IsOpenZmin()) parcur=-Precision::Infinite(); else parcur=(zmin-L.Location().XYZ().Z())/L.Direction().XYZ().Z(); parmin=Max(parmin, parcur); if (domain.IsOpenZmax()) parcur=Precision::Infinite(); else parcur=(zmax-L.Location().XYZ().Z())/L.Direction().XYZ().Z(); parmax=Min(parmax, parcur); zToSet=Standard_True; } else if (L.Direction().XYZ().Z()<0.) { if (domain.IsOpenZmax()) parcur=-Precision::Infinite(); else parcur=(zmax-L.Location().XYZ().Z())/L.Direction().XYZ().Z(); parmin=Max(parmin, parcur); if (domain.IsOpenZmin()) parcur=Precision::Infinite(); else parcur=(zmin-L.Location().XYZ().Z())/L.Direction().XYZ().Z(); parmax=Min(parmax, parcur); zToSet=Standard_True; } else { // Perpendicular to axis Z if (L.Location().XYZ().Z()0) { Standard_Integer npi; Standard_Real Xmin, Ymin, Zmin, Xmax, Ymax, Zmax; // domain.Get(Xmax, Ymax, Zmax, Xmin, Ymin, Zmin); // for (npi=0; npiPrecision::Angular()) { if (sinan>0.) { out=Standard_False; beginOnCurve[nbSeg]=parint[npi]; //// modified by jgv, 10.11.2009 ///// endOnCurve[nbSeg] = 10.; ////////////////////////////////////// nbSeg++; } else { if (out) { //modified by NIZNHY-PKV Fri Jul 11 13:59:10 2008f beginOnCurve[nbSeg]=-10.; //beginOnCurve[nbSeg]=-Precision::Infinite(); //modified by NIZNHY-PKV Fri Jul 11 13:59:13 2008t nbSeg++; } endOnCurve[nbSeg-1]=parint[npi]; out=Standard_True; // //modified by NIZNHY-PKV Fri Jul 11 13:54:54 2008f Standard_Real ipmin, ipmax, ip, pas; // ipmin=-10.; if (beginOnCurve[nbSeg-1]>ipmin) { ipmin=beginOnCurve[nbSeg-1]; } ipmax=10.; if (endOnCurve[nbSeg-1]0) { else if (!domain.IsOut(ElCLib::Value(0., theHypr))) { boxHypr=domain; //beginOnCurve[0]=-Precision::Infinite(); //endOnCurve[0]=Precision::Infinite(); beginOnCurve[0]=-100.; endOnCurve[0]=100.; nbSeg=1; } } //======================================================================= //function : Inters3d //purpose : //======================================================================= Standard_Integer Intf_Tool::Inters3d(const gp_Hypr& theCurv, const Bnd_Box& Domain) { Standard_Integer nbpi=0; Standard_Integer npi; Standard_Real xmin, ymin, zmin, xmax, ymax, zmax; Domain.Get(xmin, ymin, zmin, xmax, ymax, zmax); if (!Domain.IsOpenXmin()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln(1., 0., 0., xmin), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { yint[nbpi]=Inters1.Point(npi).Y(); zint[nbpi]=Inters1.Point(npi).Z(); if (ymin <=yint[nbpi] && yint[nbpi] < ymax && zmin <=zint[nbpi] && zint[nbpi] < zmax) { xint[nbpi]=xmin; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=1; nbpi++; } } } } } if (!Domain.IsOpenYmin()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln( 0., 1., 0., ymin), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).X(); zint[nbpi]=Inters1.Point(npi).Z(); if (xmin < xint[nbpi] && xint[nbpi] <=xmax && zmin <=zint[nbpi] && zint[nbpi] < zmax) { yint[nbpi]=ymin; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=2; nbpi++; } } } } } if (!Domain.IsOpenZmin()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln( 0., 0., 1., zmin), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).X(); yint[nbpi]=Inters1.Point(npi).Y(); if (xmin < xint[nbpi] && xint[nbpi] <=xmax && ymin < yint[nbpi] && yint[nbpi] <=ymax) { zint[nbpi]=zmin; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=3; nbpi++; } } } } } if (!Domain.IsOpenXmax()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln(-1., 0., 0., xmax), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { yint[nbpi]=Inters1.Point(npi).Y(); zint[nbpi]=Inters1.Point(npi).Z(); if (ymin < yint[nbpi] && yint[nbpi] <=ymax && zmin < zint[nbpi] && zint[nbpi] <=zmax) { xint[nbpi]=xmax; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=4; nbpi++; } } } } } if (!Domain.IsOpenYmax()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln( 0.,-1., 0., ymax), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).X(); zint[nbpi]=Inters1.Point(npi).Z(); if (xmin <=xint[nbpi] && xint[nbpi] < xmax && zmin < zint[nbpi] && zint[nbpi] <=zmax) { yint[nbpi]=ymax; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=5; nbpi++; } } } } } if (!Domain.IsOpenZmax()) { IntAna_IntConicQuad Inters1(theCurv, gp_Pln( 0., 0.,-1., zmax), Precision::Angular()); if (Inters1.IsDone()) { if (!Inters1.IsInQuadric()) { for (npi=1; npi<=Inters1.NbPoints(); npi++) { xint[nbpi]=Inters1.Point(npi).X(); yint[nbpi]=Inters1.Point(npi).Y(); if (xmin <=xint[nbpi] && xint[nbpi] < xmax && ymin <=yint[nbpi] && yint[nbpi] < ymax) { zint[nbpi]=zmax; parint[nbpi]=Inters1.ParamOnConic(npi); bord[nbpi]=6; nbpi++; } } } } } return nbpi; } //======================================================================= //function : ParabBox //purpose : //======================================================================= void Intf_Tool::ParabBox(const gp_Parab&, const Bnd_Box& domain, Bnd_Box& boxParab) { nbSeg=0; boxParab.SetVoid(); if (domain.IsWhole()) { boxParab.SetWhole(); nbSeg=1; beginOnCurve[0]=-Precision::Infinite(); endOnCurve[0]=Precision::Infinite(); return; } else if (domain.IsVoid()) return; } //======================================================================= //function : NbSegments //purpose : //======================================================================= Standard_Integer Intf_Tool::NbSegments() const { return nbSeg; } //======================================================================= //function : BeginParam //purpose : //======================================================================= Standard_Real Intf_Tool::BeginParam(const Standard_Integer SegmentNum) const { Standard_OutOfRange_Raise_if(SegmentNum<1 || SegmentNum>nbSeg , "Intf_Tool::BeginParam"); return beginOnCurve[SegmentNum-1]; } //======================================================================= //function : EndParam //purpose : //======================================================================= Standard_Real Intf_Tool::EndParam(const Standard_Integer SegmentNum) const { Standard_OutOfRange_Raise_if(SegmentNum<1 || SegmentNum>nbSeg , "Intf_Tool::EndParam"); return endOnCurve[SegmentNum-1]; }