1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-04 13:13:25 +03:00

0027761: Intersection loops infinitely

The static method CorrectSurfaceBoundaries() in the class IntTools_FaceFace,
which is used for correction of the boundaries of the faces before their intersection,
contains two inconsistent adjustments of the boundaries of the faces based on periodic surfaces.
One of these adjustments has been removed. The remaining adjustment, the one that is based on the
2D bounding boxes of the closed curves, should be sufficient.

Test case for the issue.
This commit is contained in:
emv
2016-08-11 11:55:29 +03:00
committed by mkv
parent 3e05329c4c
commit 7cb2f40993
2 changed files with 19 additions and 56 deletions

View File

@@ -2381,59 +2381,6 @@ Handle(Geom_Curve) MakeBSpline (const Handle(IntPatch_WLine)& WL,
}
}
//
{
Standard_Integer aNbP;
Standard_Real aXP, dXfact, aXmid, aX1, aX2, aTolPA;
//
aTolPA=Precision::Angular();
// U
if (isuperiodic) {
aXP=anAdaptorSurface.UPeriod();
dXfact=theumax-theumin;
if (dXfact-aTolPA>aXP) {
aXmid=0.5*(theumax+theumin);
aNbP=RealToInt(aXmid/aXP);
if (aXmid<0.) {
aNbP=aNbP-1;
}
aX1=aNbP*aXP;
if (theumin>aTolPA) {
aX1=theumin+aNbP*aXP;
}
aX2=aX1+aXP;
if (theumin<aX1) {
theumin=aX1;
}
if (theumax>aX2) {
theumax=aX2;
}
}
}
// V
if (isvperiodic) {
aXP=anAdaptorSurface.VPeriod();
dXfact=thevmax-thevmin;
if (dXfact-aTolPA>aXP) {
aXmid=0.5*(thevmax+thevmin);
aNbP=RealToInt(aXmid/aXP);
if (aXmid<0.) {
aNbP=aNbP-1;
}
aX1=aNbP*aXP;
if (thevmin>aTolPA) {
aX1=thevmin+aNbP*aXP;
}
aX2=aX1+aXP;
if (thevmin<aX1) {
thevmin=aX1;
}
if (thevmax>aX2) {
thevmax=aX2;
}
}
}
}
//
if(isuperiodic || isvperiodic) {
Standard_Boolean correct = Standard_False;
Standard_Boolean correctU = Standard_False;
@@ -2488,16 +2435,13 @@ Handle(Geom_Curve) MakeBSpline (const Handle(IntPatch_WLine)& WL,
aBox.Get(umin, vmin, umax, vmax);
if(isuperiodic && correctU) {
if(theumin < umin)
theumin = umin;
if(theumax > umax) {
theumax = umax;
}
}
if(isvperiodic && correctV) {
if(thevmin < vmin)
thevmin = vmin;
if(thevmax > vmax)