0022887: Request to make Intf_InterferencePolygon2d class thread-safe.
[occt.git] / src / Intf / Intf_InterferencePolygon2d.gxx
index f72c721..e69de29 100755 (executable)
@@ -1,698 +0,0 @@
-// File:        Intf_InterferencePolygon2d.gxx
-// Created:     Mon Jun 24 11:52:34 1991
-// Author:      Didier PIFFAULT
-//              <dpf@phobox>
-
-#include <gp_Pnt2d.hxx>
-#include <Bnd_Box2d.hxx>
-#include <Intf_SectionPoint.hxx>
-#include <Intf_SeqOfSectionPoint.hxx>
-#include <Intf_TangentZone.hxx>
-#include <Intf_SeqOfTangentZone.hxx>
-#include <Precision.hxx>
-#include <TColStd_ListOfInteger.hxx>
-
-// Angular precision (sinus) below that value two right segments
-// are considered as having a potential zone of tangency.
-namespace
-{
-  static const Standard_Real PRCANG = Precision::Angular();
-};
-
-//=======================================================================
-//function : Intf_InterferencePolygon2d
-//purpose  : constructor empty
-//=======================================================================
-
-Intf_InterferencePolygon2d::Intf_InterferencePolygon2d()
-: Intf_Interference (Standard_False),
-  oClos (Standard_False),
-  tClos (Standard_False),
-  iObje1 (0),
-  iObje2 (0),
-  nbso (0),
-  BeginOfNotClosedObje1 (Standard_False),
-  BeginOfNotClosedObje2 (Standard_False)
-{}
-
-//=======================================================================
-//function : Intf_InterferencePolygon2d
-//purpose  : Constructor of the interference beetween two Polygon.
-//=======================================================================
-
-Intf_InterferencePolygon2d::Intf_InterferencePolygon2d
-  (const Polygon2d1& Obje1, const Polygon2d2& Obje2)
-: Intf_Interference (Standard_False),
-  oClos (Standard_False),
-  tClos (Standard_False),
-  iObje1 (0),
-  iObje2 (0),
-  nbso (0),
-  BeginOfNotClosedObje1 (Standard_False),
-  BeginOfNotClosedObje2 (Standard_False)
-{
-  if (!ToolPolygon2d1::Bounding(Obje1).IsOut
-      (ToolPolygon2d2::Bounding(Obje2))) {
-    Tolerance=ToolPolygon2d1::DeflectionOverEstimation(Obje1)+
-              ToolPolygon2d2::DeflectionOverEstimation(Obje2);
-    if (Tolerance==0.)
-      Tolerance=Epsilon(1000.);
-    nbso=ToolPolygon2d1::NbSegments(Obje1);
-    oClos=ToolPolygon2d1::Closed(Obje1);
-    tClos=ToolPolygon2d2::Closed(Obje2);
-    Interference(Obje1, Obje2);
-    Clean();
-  }
-}
-
-
-//=======================================================================
-//function : Intf_InterferencePolygon2d
-//purpose  : Constructor of the auto interference of a Polygon.
-//=======================================================================
-
-Intf_InterferencePolygon2d::Intf_InterferencePolygon2d
-  (const Polygon2d1& Obje)
-: Intf_Interference (Standard_True),
-  oClos (Standard_False),
-  tClos (Standard_False),
-  iObje1 (0),
-  iObje2 (0),
-  nbso (0),
-  BeginOfNotClosedObje1 (Standard_False),
-  BeginOfNotClosedObje2 (Standard_False)
-{
-  Tolerance=ToolPolygon2d1::DeflectionOverEstimation(Obje)*2;
-  if (Tolerance==0.)
-    Tolerance=Epsilon(1000.);
-  oClos=ToolPolygon2d1::Closed(Obje);
-  tClos=oClos;
-  Interference(Obje);
-  Clean();
-}
-
-//=======================================================================
-//function : Perform
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Perform
-  (const Polygon2d1& Obje1, const Polygon2d2& Obje2)
-{
-  SelfInterference(Standard_False);
-  if (!ToolPolygon2d1::Bounding(Obje1).IsOut(ToolPolygon2d2::Bounding(Obje2))) {
-    Tolerance=ToolPolygon2d1::DeflectionOverEstimation(Obje1)+
-              ToolPolygon2d2::DeflectionOverEstimation(Obje2);
-    if (Tolerance==0.)
-      Tolerance=Epsilon(1000.);
-    nbso=ToolPolygon2d1::NbSegments(Obje1);
-    oClos=ToolPolygon2d1::Closed(Obje1);
-    tClos=ToolPolygon2d2::Closed(Obje2);
-    Interference(Obje1, Obje2);
-    Clean();
-  }
-}
-
-//=======================================================================
-//function : Perform
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Perform 
-  (const Polygon2d1& Obje)
-{
-  SelfInterference(Standard_True);
-  Tolerance=ToolPolygon2d1::DeflectionOverEstimation(Obje)*2;
-  if (Tolerance==0.)
-    Tolerance=Epsilon(1000.);
-  oClos=ToolPolygon2d1::Closed(Obje);
-  tClos=oClos;
-  Interference(Obje);
-  Clean();
-}
-
-//=======================================================================
-//function : Pnt2dValue
-//purpose  : Give the section point of range Index in the interference.
-//=======================================================================
-
-gp_Pnt2d Intf_InterferencePolygon2d::Pnt2dValue
-  (const Standard_Integer Index) const
-{
-  return gp_Pnt2d((mySPoins(Index)).Pnt().X(),
-                 (mySPoins(Index)).Pnt().Y());
-}
-
-
-//=======================================================================
-//function : Interference
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Interference
-  (const Polygon2d1& Obje1,
-   const Polygon2d2& Obje2)
-{
-  Bnd_Box2d bSO;
-  Bnd_Box2d bST;
-
-  BeginOfNotClosedObje1=!oClos;
-  for (iObje1=1; iObje1<=ToolPolygon2d1::NbSegments(Obje1); iObje1++) {
-    bSO.SetVoid();
-    bSO.Add(ToolPolygon2d1::BeginOfSeg(Obje1, iObje1));
-    bSO.Add(ToolPolygon2d1::EndOfSeg(Obje1, iObje1));
-    bSO.Enlarge(ToolPolygon2d1::DeflectionOverEstimation(Obje1));
-    if (!ToolPolygon2d2::Bounding(Obje2).IsOut(bSO)) {
-      BeginOfNotClosedObje2=!tClos;
-      for (iObje2=1; iObje2<=ToolPolygon2d2::NbSegments(Obje2); iObje2++) {
-       bST.SetVoid();
-       bST.Add(ToolPolygon2d2::BeginOfSeg(Obje2, iObje2));
-       bST.Add(ToolPolygon2d2::EndOfSeg(Obje2, iObje2));
-       bST.Enlarge(ToolPolygon2d2::DeflectionOverEstimation(Obje2));
-       if (!bSO.IsOut(bST))
-         Intersect(ToolPolygon2d1::BeginOfSeg(Obje1, iObje1), 
-                   ToolPolygon2d1::EndOfSeg(Obje1, iObje1),
-                   ToolPolygon2d2::BeginOfSeg(Obje2, iObje2), 
-                   ToolPolygon2d2::EndOfSeg(Obje2, iObje2));
-      }
-      BeginOfNotClosedObje2=Standard_False;
-    }
-    BeginOfNotClosedObje1=Standard_False;
-  }
-}
-
-//=======================================================================
-//function : Interference
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Interference
-  (const Polygon2d1& Obje)
-{
-  Bnd_Box2d bSO;
-  Bnd_Box2d bST;
-
-  BeginOfNotClosedObje1=!oClos;
-  for (iObje1=1; iObje1<=ToolPolygon2d1::NbSegments(Obje); iObje1++) {
-    bSO.SetVoid();
-    bSO.Add(ToolPolygon2d1::BeginOfSeg(Obje, iObje1));
-    bSO.Add(ToolPolygon2d1::EndOfSeg(Obje, iObje1));
-    bSO.Enlarge(ToolPolygon2d1::DeflectionOverEstimation(Obje));
-    if (!ToolPolygon2d1::Bounding(Obje).IsOut(bSO)) {
-      BeginOfNotClosedObje2=!tClos;
-      for (iObje2=iObje1+1;iObje2<=ToolPolygon2d1::NbSegments(Obje);iObje2++){
-       bST.SetVoid();
-       bST.Add(ToolPolygon2d1::BeginOfSeg(Obje, iObje2));
-       bST.Add(ToolPolygon2d1::EndOfSeg(Obje, iObje2));
-       bST.Enlarge(ToolPolygon2d1::DeflectionOverEstimation(Obje));
-       if (!bSO.IsOut(bST))
-         Intersect(ToolPolygon2d1::BeginOfSeg(Obje, iObje1), 
-                   ToolPolygon2d1::EndOfSeg(Obje, iObje1),
-                   ToolPolygon2d1::BeginOfSeg(Obje, iObje2), 
-                   ToolPolygon2d1::EndOfSeg(Obje, iObje2));
-      }
-      BeginOfNotClosedObje2=Standard_False;
-    }
-    BeginOfNotClosedObje1=Standard_False;
-  }
-}
-
-
-//=======================================================================
-//function : Clean
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Clean()
-{
-
-// The zones of tangency that concerns only one couple of segments are
-// conserved if the angle between the segments is less than <PRCANG> and
-// if there is no real point of intersection EDGE/EDGE:
-  Standard_Integer nbIt=myTZones.Length();
-  Standard_Integer decal=0;
-  Standard_Integer addr1, addr2;
-  Intf_PIType      dim1, dim2;
-  Standard_Real    par;
-  Standard_Integer tsp, tsps;
-  Standard_Integer lpi, ltz;
-  Standard_Boolean Only1Seg=Standard_False;
-
-#define PI1 (myTZones(ltz-decal).GetPoint(lpi))
-#define PI2 (myTZones(ltz-decal).GetPoint(tsp))
-
-  for (ltz=1; ltz<=nbIt; ltz++) {
-    tsp=tsps=0;
-    Standard_Real pr1mi,pr1ma,pr2mi,pr2ma,delta1,delta2;
-    myTZones(ltz-decal).ParamOnFirst(pr1mi,pr1ma);
-    delta1=pr1ma-pr1mi;
-    myTZones(ltz-decal).ParamOnSecond(pr2mi,pr2ma);
-    delta2=pr2ma-pr2mi;
-    if (delta1<1. && delta2<1.) Only1Seg=Standard_True;
-    if (delta1==0. || delta2==0.) Only1Seg=Standard_True;
-
-    for (lpi=1; lpi<=myTZones(ltz-decal).NumberOfPoints(); lpi++) {
-      if (PI1.Incidence()<=PRCANG) {tsp=tsps=0;break;}
-      PI1.InfoFirst(dim1,addr1,par);
-      PI1.InfoSecond(dim2,addr2,par);
-      if (dim1==Intf_EDGE && dim2==Intf_EDGE) {
-       tsps=0;
-       if (tsp>0) {
-         tsp=0;
-         Only1Seg=Standard_False;
-         break;
-       }
-       tsp=lpi;
-      }
-      else if (dim1!=Intf_EXTERNAL && dim2!=Intf_EXTERNAL) {
-       tsps=lpi;
-      }
-    }
-    if (tsp>0) {
-      mySPoins.Append(myTZones(ltz-decal).GetPoint(tsp));
-      myTZones.Remove(ltz-decal);
-      decal++;
-    }
-    else if (Only1Seg && tsps!=0) {
-      mySPoins.Append(myTZones(ltz-decal).GetPoint(tsps));
-      myTZones.Remove(ltz-decal);
-      decal++;
-    }
-  }
-
-
-// The points of intersection located in the tangency zone are
-// removed from the list :
-  nbIt=mySPoins.Length();
-  decal=0;
-
-  for (lpi=1; lpi<=nbIt; lpi++) {
-    for (ltz=1; ltz<=myTZones.Length(); ltz++) {
-      if (myTZones(ltz).RangeContains(mySPoins(lpi-decal))) {
-       mySPoins.Remove(lpi-decal);
-       decal++;
-       break;
-      }
-    }
-  }
-}
-
-
-//=======================================================================
-//function : Intersect
-//purpose  : 
-//=======================================================================
-
-void Intf_InterferencePolygon2d::Intersect
-  (const gp_Pnt2d& BegO, const gp_Pnt2d& EndO,
-   const gp_Pnt2d& BegT, const gp_Pnt2d& EndT)
-{
-
-
-  if(SelfIntf) { 
-    if(Abs(iObje1-iObje2)<=1) return;  //-- Ajout du 15 jan 98 
-  }
-
-  Standard_Integer nbpi=0;
-  Standard_Real parO[8];
-  Standard_Real parT[8];
-  Intf_SeqOfSectionPoint thePi;
-  gp_XY segT =EndT.XY()-BegT.XY();
-  gp_XY segO =EndO.XY()-BegO.XY();
-
-// If the length of segment is zero, nothing is done
-  Standard_Real lgT =Sqrt(segT*segT);
-  if (lgT<=0.) return;
-  Standard_Real lgO =Sqrt(segO*segO);
-  if (lgO<=0.) return;
-
-// Direction of parsing of segments
-  Standard_Real sigPS=(segO*segT)>0.0 ? 1.0 : -1.0;
-
-// Precision of calculation
-  Standard_Real floatgap=Epsilon(lgO+lgT);
-
-// Angle between two straight lines and radius of interference
-  Standard_Real sinTeta=(segO.CrossMagnitude(segT)/lgO)/lgT;
-  Standard_Real rayIntf=0.;
-  if (sinTeta>0.) rayIntf=Tolerance/sinTeta;
-         
-// Interference <begO> <segT>
-  Standard_Real dbOT=((BegO.XY()-BegT.XY())^segT)/lgT;
-  Standard_Real dbObT=BegO.Distance(BegT);
-  Standard_Real dbOeT=BegO.Distance(EndT);
-  if (Abs(dbOT)<=Tolerance) {
-    if (dbObT<=Tolerance) {
-      nbpi++;
-      parO[nbpi]=0.;parT[nbpi]=0.;
-      thePi.Append(Intf_SectionPoint(BegO,Intf_VERTEX,iObje1,0.,
-                                    Intf_VERTEX,iObje2,0.,sinTeta));
-    }
-    if (dbOeT<=Tolerance) {
-      nbpi++;
-      parO[nbpi]=0.;parT[nbpi]=1.;
-      thePi.Append(Intf_SectionPoint(BegO,Intf_VERTEX,iObje1,0.,
-                                    Intf_VERTEX,iObje2+1,0.,sinTeta));
-    }
-    if (dbObT>Tolerance && dbOeT>Tolerance &&
-       dbObT+dbOeT<=(lgT+Tolerance)) {
-      nbpi++;
-      parO[nbpi]=0.;parT[nbpi]=dbObT/lgT;
-      thePi.Append(Intf_SectionPoint(BegO,Intf_VERTEX,iObje1,0.,
-                                    Intf_EDGE,iObje2,parT[nbpi],sinTeta));
-    }
-  }
-  
-// Interference <endO> <segT>
-  Standard_Real deOT=((EndO.XY()-BegT.XY())^segT)/lgT;
-  Standard_Real deObT=EndO.Distance(BegT);
-  Standard_Real deOeT=EndO.Distance(EndT);
-  if (Abs(deOT)<=Tolerance) {
-    if (deObT<=Tolerance) {
-      nbpi++;
-      parO[nbpi]=1.;parT[nbpi]=0.;
-      thePi.Append(Intf_SectionPoint(EndO,Intf_VERTEX,iObje1+1,0.,
-                                    Intf_VERTEX,iObje2,0.,sinTeta));
-    }
-    if (deOeT<=Tolerance) {
-      nbpi++;
-      parO[nbpi]=1.;parT[nbpi]=1.;
-      thePi.Append(Intf_SectionPoint(EndO,Intf_VERTEX,iObje1+1,0.,
-                                    Intf_VERTEX,iObje2+1,0.,sinTeta));
-    }
-    if (deObT>Tolerance && deOeT>Tolerance &&
-       deObT+deOeT<=(lgT+Tolerance)) {
-      nbpi++;
-      parO[nbpi]=1.;parT[nbpi]=deObT/lgT;
-      thePi.Append(Intf_SectionPoint(EndO,Intf_VERTEX,iObje1+1,0.,
-                                    Intf_EDGE,iObje2,parT[nbpi],sinTeta));
-    }
-  }
-  
-// Interference <begT> <segO>
-  Standard_Real dbTO=((BegT.XY()-BegO.XY())^segO)/lgO;
-  if (Abs(dbTO)<=Tolerance) {
-    if (dbObT>Tolerance && deObT>Tolerance &&
-       dbObT+deObT<=(lgO+Tolerance)) {
-      nbpi++;
-      parO[nbpi]=dbObT/lgO;parT[nbpi]=0.;
-      thePi.Append(Intf_SectionPoint(BegT,Intf_EDGE,iObje1,parO[nbpi],
-                                    Intf_VERTEX,iObje2,0.,sinTeta));
-    }
-  }
-
-// Interference <endT> <segO>
-  Standard_Real deTO=((EndT.XY()-BegO.XY())^segO)/lgO;
-  if (Abs(deTO)<=Tolerance) {
-    if (dbOeT>Tolerance && deOeT>Tolerance &&
-       dbOeT+deOeT<=(lgO+Tolerance)) {
-      nbpi++;
-      parO[nbpi]=dbOeT/lgO;parT[nbpi]=1.;
-      thePi.Append(Intf_SectionPoint(EndT,Intf_EDGE,iObje1,parO[nbpi],
-                                    Intf_VERTEX,iObje2+1,0.,sinTeta));
-    }
-  }
-
-  Standard_Boolean edgeSP=Standard_False;
-  Standard_Real parOSP=0, parTSP=0;
-
-  if (Abs(dbOT-deOT)>floatgap && Abs(dbTO-deTO)>floatgap) {
-    parOSP=dbOT/(dbOT-deOT);
-    parTSP=dbTO/(dbTO-deTO);
-    if (dbOT*deOT<=0. && dbTO*deTO<=0.) {
-      edgeSP=Standard_True;
-    }
-    else if (nbpi==0) return;
-
-// If there is no interference it is necessary to take the points segment by segment
-    if (nbpi==0 && sinTeta>PRCANG) {
-      nbpi++;
-      parO[nbpi]=parOSP;
-      parT[nbpi]=parTSP;
-      thePi.Append(Intf_SectionPoint(gp_Pnt2d (BegO.X()+ (segO.X()*parOSP),
-                                              BegO.Y()+ (segO.Y()*parOSP)),
-                                    Intf_EDGE,iObje1,parOSP,
-                                    Intf_EDGE,iObje2,parTSP,sinTeta));
-    }
-
-// Otherwise it is required to check if there is no other
-    else if (rayIntf>=Tolerance) {
-      Standard_Real deltaO=rayIntf/lgO;
-      Standard_Real deltaT=rayIntf/lgT;
-      Standard_Real x, y;
-      Standard_Real parOdeb=parOSP-deltaO;
-      Standard_Real parOfin=parOSP+deltaO;
-      Standard_Real parTdeb=parTSP-sigPS*deltaT;
-      Standard_Real parTfin=parTSP+sigPS*deltaT;
-      if (nbpi==0) {
-       parO[1]=parOdeb;
-       parO[2]=parOfin;
-       parT[1]=parTdeb;
-       parT[2]=parTfin;
-       while (nbpi<2) {
-         nbpi++;
-         x=BegO.X()+ (segO.X()*parO[nbpi]);
-         y=BegO.Y()+ (segO.Y()*parO[nbpi]);
-         thePi.Append(Intf_SectionPoint(gp_Pnt2d(x, y),
-                                        Intf_EXTERNAL, iObje1, parO[nbpi],
-                                        Intf_EXTERNAL, iObje2, parT[nbpi],
-                                        sinTeta));
-       }
-      }
-      else {  //nbpi>0
-       if (nbpi==1) {
-         Standard_Boolean ok=Standard_True;
-         if (0.<parOdeb && parOdeb<1. && 0.<parTdeb && parTdeb<1. ) {
-           parO[nbpi+1]=parOdeb;
-           parT[nbpi+1]=parTdeb;
-         }
-         else if (0.<parOfin && parOfin<1. && 0.<parTfin && parTfin<1. ) {
-           parO[nbpi+1]= parOfin;
-           parT[nbpi+1]= parTfin;
-         }
-         else {
-           ok=Standard_False;
-         }
-
-         if (ok) {
-           x=BegO.X()+ (segO.X()*parO[nbpi+1]);
-           y=BegO.Y()+ (segO.Y()*parO[nbpi+1]);
-           if (thePi(1).Pnt().Distance(gp_Pnt(x, y, 0)) >= (Tolerance/4.)) {
-             nbpi++;
-             thePi.Append(Intf_SectionPoint(gp_Pnt2d(x, y),
-                                            Intf_EXTERNAL, iObje1, parO[nbpi],
-                                            Intf_EXTERNAL, iObje2, parT[nbpi],
-                                            sinTeta));
-           }
-         }
-       }
-       else { // plus d une singularite
-         Standard_Real parOmin=parO[1];
-         Standard_Real parOmax=parO[1];
-         Standard_Real parTmin=parT[1];
-         Standard_Real parTmax=parT[1];
-         for (Standard_Integer i=2; i<=nbpi; i++) {
-           parOmin=Min(parOmin, parO[i]);
-           parOmax=Max(parOmax, parO[i]);
-           parTmin=Min(parTmin, parT[i]);
-           parTmax=Max(parTmax, parT[i]);
-         }
-
-         Standard_Real    delta;
-         if (parOdeb<0.) {
-           delta=-parOdeb;
-           parOdeb=0.;
-           parTdeb=parTdeb+sigPS*(delta*(deltaT/deltaO));
-         }
-         if (parOfin>1.) {
-           delta=parOfin-1.;
-           parOfin=1.;
-           parTfin=parTfin-sigPS*(delta*(deltaT/deltaO));
-         }
-         if (sigPS>0.) {
-           if (parTdeb<0.) {
-             delta=-parTdeb;
-             parTdeb=0.;
-             parOdeb=parOdeb+delta*(deltaO/deltaT);
-           }
-           if (parTfin>1.) {
-             delta=parTfin-1.;
-             parTfin=1.;
-             parOfin=parOfin-delta*(deltaO/deltaT);
-           }
-         }
-         else {
-           if (parTdeb>1.) {
-             delta=parTdeb-1.;
-             parTdeb=1.;
-             parOdeb=parOdeb+delta*(deltaO/deltaT);
-           }
-           if (parTfin<0.) {
-             delta=-parTfin;
-             parTfin=0.;
-             parOfin=parOfin-delta*(deltaO/deltaT);
-           }
-         }
-
-         if ((parOdeb<parOmin && parOmin>0.) || 
-             (sigPS>0. && parTdeb<parTmin && parTmin>0.) || 
-             (sigPS<0. && parTdeb>parTmax && parTmax<1.)) {
-           nbpi++;
-           parO[nbpi]=Max(0., Min(1., parOdeb));
-           parT[nbpi]=Max(0., Min(1., parTdeb));
-           x=BegO.X()+ (segO.X()*parO[nbpi]);
-           y=BegO.Y()+ (segO.Y()*parO[nbpi]);
-           thePi.Append(Intf_SectionPoint(gp_Pnt2d(x, y),
-                                          Intf_EXTERNAL, iObje1, parO[nbpi],
-                                          Intf_EXTERNAL, iObje2, parT[nbpi],
-                                          sinTeta));
-         }
-
-         if ((parOfin>parOmax && parOmax<1.) || 
-             (sigPS<0. && parTfin<parTmin && parTmin>0.) || 
-             (sigPS>0. && parTfin>parTmax && parTmax<1.)) {
-           nbpi++;
-           parO[nbpi]=Min(1., Max(0., parOfin));
-           parT[nbpi]=Min(1., Max(0., parTfin));
-           x=BegO.X()+ (segO.X()*parO[nbpi]);
-           y=BegO.Y()+ (segO.Y()*parO[nbpi]);
-           thePi.Append(Intf_SectionPoint(gp_Pnt2d(x, y),
-                                          Intf_EXTERNAL, iObje1, parO[nbpi],
-                                          Intf_EXTERNAL, iObje2, parT[nbpi],
-                                          sinTeta));
-         }
-       }
-      }
-    }
-  }
-  
-  //-- lbr : The points too close to each other are suspended
-  Standard_Boolean suppr;
-  do { 
-    suppr=Standard_False;
-    for(Standard_Integer i=2; suppr==Standard_False && i<=nbpi; i++) { 
-      const gp_Pnt& Pim1 = thePi(i-1).Pnt();
-      const gp_Pnt& Pi   = thePi(i).Pnt();
-      Standard_Real d=Pi.Distance(Pim1);
-      d*=50.0;
-      if(d<lgT && d<lgO) { 
-       for(Standard_Integer j=i; j<nbpi; j++) { 
-         thePi(j)=thePi(j+1);
-       }
-       nbpi--;
-       suppr=Standard_True;
-      }
-    }
-  }
-  while(suppr==Standard_True);
-  
-  
-
-
-
-  
-  if (nbpi==1) {
-    if (edgeSP) {
-      thePi(1)=Intf_SectionPoint(gp_Pnt2d (BegO.X()+ (segO.X()*parOSP),
-                                          BegO.Y()+ (segO.Y()*parOSP)),
-                                Intf_EDGE,iObje1,parOSP,
-                                Intf_EDGE,iObje2,parTSP,sinTeta);
-      parO[1]=parOSP;
-      parT[1]=parTSP;
-    }
-    if (!SelfIntf) {
-//      if ((BeginOfNotClosedObje1 && parO[1]==0.) ||
-//       (BeginOfNotClosedObje2 && parT[1]==0.) ||
-//       (parO[1]>0. && parT[1]>0.)) {
-      {
-       Standard_Boolean contains = Standard_False;
-       for (Standard_Integer i = 1; i <= mySPoins.Length(); i++)
-         if (thePi(1).IsEqual(mySPoins(i))) {
-           contains = Standard_True;
-           break;
-         }
-       if (!contains)
-         mySPoins.Append(thePi(1));
-      }
-    }
-    else if (iObje2-iObje1!=1 && 
-            (!oClos || (iObje1!=1 && iObje2!=nbso))) {
-      mySPoins.Append(thePi(1));
-    }
-  }
-
-  else if (nbpi>=2) {
-    Intf_TangentZone TheTZ;
-    if (nbpi==2) {
-      TheTZ.PolygonInsert(thePi(1));
-      TheTZ.PolygonInsert(thePi(2));
-    }
-    else {
-      Standard_Integer lpj;
-      Standard_Integer lmin=1;
-      Standard_Integer lmax=1;
-      for (lpj=2; lpj<=nbpi; lpj++) {
-       if      (parO[lpj]<parO[lmin]) lmin=lpj;
-       else if (parO[lpj]>parO[lmax]) lmax=lpj;
-      }
-      TheTZ.PolygonInsert(thePi(lmin));
-      TheTZ.PolygonInsert(thePi(lmax));
-
-      Standard_Integer ltmin=1;
-      Standard_Integer ltmax=1;
-      for (lpj=2; lpj<=nbpi; lpj++) {
-       if      (parT[lpj]<parT[ltmin]) ltmin=lpj;
-       else if (parT[lpj]>parT[ltmax]) ltmax=lpj;
-      }
-      if (ltmin!=lmin && ltmin!=lmax) TheTZ.PolygonInsert(thePi(ltmin));
-      if (ltmax!=lmin && ltmax!=lmax) TheTZ.PolygonInsert(thePi(ltmax));
-    }
-    
-    if (edgeSP) TheTZ.PolygonInsert(Intf_SectionPoint
-                                   (gp_Pnt2d (BegO.X()+ (segO.X()*parOSP),
-                                              BegO.Y()+ (segO.Y()*parOSP)),
-                                    Intf_EDGE,iObje1,parOSP,
-                                    Intf_EDGE,iObje2,parTSP,sinTeta));
-
-    Standard_Integer nbtz=myTZones.Length();
-#if 0 
-    Standard_Integer decaltz=0;
-    for (Standard_Integer ltz=1; ltz<=nbtz; ltz++) {
-      if (TheTZ.HasCommonRange(myTZones(ltz-decaltz))) {
-       TheTZ.Append(myTZones(ltz-decaltz));
-       myTZones.Remove(ltz-decaltz);
-       decaltz++;
-      }
-    }
-    myTZones.Append(TheTZ);
-#else 
-    TColStd_ListOfInteger LIndex;
-    for (Standard_Integer ltz=1; ltz<=nbtz; ltz++) {
-      if (TheTZ.HasCommonRange(myTZones(ltz))) {
-       LIndex.Append(ltz);
-      }
-    }
-    //------------------------------------------------------------------------
-    //--   The list is parsed in ascending order by index, zone and tg
-    //--
-    if(LIndex.IsEmpty()) { 
-      myTZones.Append(TheTZ);
-    }
-    else {
-      Standard_Integer indexfirst = LIndex.First();
-      LIndex.RemoveFirst();
-      Standard_Integer decal = 0;
-      myTZones(indexfirst).Append(TheTZ);
-      while(!LIndex.IsEmpty()) {
-       Standard_Integer index = LIndex.First();
-       LIndex.RemoveFirst();
-       myTZones(indexfirst).Append(myTZones(index-decal));
-       myTZones.Remove(index-decal);
-       decal++;
-      }
-    }
-#endif
-  }
-}
-
-// EOF File:        Intf_InterferencePolygon2d.gxx