#include <Adaptor3d_Surface.hxx>
#include <ElSLib.hxx>
+#include <ElCLib.hxx>
#include <IntPatch_ALine.hxx>
#include <IntPatch_Point.hxx>
#include <IntPatch_SpecialPoints.hxx>
{
IntPatch_Point &aCurVert = theALine->ChangeVertex(i);
const IntSurf_PntOn2S &aCurrPt = aCurVert.PntOn2S();
+ const gp_Pnt& aCurPnt = aCurVert.Value();
const Standard_Real aCurToler = aCurVert.Tolerance();
for (Standard_Integer j = i + 1; j <= aNbVert; j++)
{
IntPatch_Point &aVert = theALine->ChangeVertex(j);
const IntSurf_PntOn2S &aNewPt = aVert.PntOn2S();
+ const gp_Pnt& aPnt = aVert.Value();
const Standard_Real aToler = aVert.Tolerance();
const Standard_Real aSumTol = aCurToler + aToler;
+ gp_Vec aVec (aCurPnt, aPnt);
if (aCurrPt.IsSame(aNewPt, aSumTol))
{
- aCurVert.SetTolerance(aSumTol);
- aVert.SetTolerance(aSumTol);
+ Standard_Real aDist = aVec.Magnitude();
+ Standard_Real aBiggerTol = Max (aCurToler, aToler);
+ Standard_Real aSmallerTol = Min (aCurToler, aToler);
+ if (aDist + aSmallerTol <= aBiggerTol) //one tolsphere is inside another or they coincide
+ {
+ if (aCurToler < aToler)
+ {
+ aCurVert.SetValue (aPnt);
+ aCurVert.SetTolerance (aToler);
+ }
+ else
+ {
+ aVert.SetValue (aCurPnt);
+ aVert.SetTolerance (aCurToler);
+ }
+ }
+ else //two tolspheres have a common part or a point of contact
+ {
+ gp_Dir aDir (aVec);
+ gp_Lin aLin (aCurPnt, aDir);
+ gp_Pnt aLeftPnt = ElCLib::Value(-aCurToler, aLin);
+ gp_Pnt aRightPnt = ElCLib::Value(aDist + aToler, aLin);
+ gp_Pnt aMidPnt((aLeftPnt.XYZ() + aRightPnt.XYZ())/2);
+ Standard_Real aNewTol = (aCurToler + aDist + aToler)/2;
+
+ aCurVert.SetValue (aMidPnt);
+ aVert.SetValue (aMidPnt);
+ aCurVert.SetTolerance (aNewTol);
+ aVert.SetTolerance (aNewTol);
+ }
}
}
}
IntPatch_Point aLVtx = theALine->Vertex(i);
aLVtx.SetValue(aVertP2S);
aLVtx.SetTolerance(aVertToler);
- aLVtx.SetParameter(aNewVertexParam);
+ Standard_Real aParam = aLVtx.ParameterOnLine();
+ if (Abs(aParam - theLPar) <= Precision::PConfusion()) //in the case of closed curve,
+ aLVtx.SetParameter(-1); //we don't know yet the number of points in the curve
+ else
+ aLVtx.SetParameter(aNewVertexParam);
aSeqVertex(++aNewVertID) = aLVtx;
hasVertexBeenChecked(i) = Standard_True;
isFound = Standard_True;
for(Standard_Integer i = aSeqVertex.Lower(); i <= aNewVertID; i++)
{
- const IntPatch_Point& aVtx = aSeqVertex(i);
+ IntPatch_Point aVtx = aSeqVertex(i);
+ if (aVtx.ParameterOnLine() == -1) //in the case of closed curve,
+ aVtx.SetParameter (aWLine->NbPnts()); //we set the last parameter
aWLine->AddVertex(aVtx);
}
//the method ComputeVertexParameters can reduce the number of points in <aWLine>
aWLine->ComputeVertexParameters(myTol3D);
-
+
if (aWLine->NbPnts() > 1)
{
aWLine->EnablePurging(Standard_False);