1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +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.

(cherry picked from commit 7cb2f40993)
This commit is contained in:
emv
2016-08-11 11:55:29 +03:00
committed by nbv
parent 9c2e67b6da
commit fe0a0085cc
6 changed files with 22 additions and 62 deletions

View File

@@ -2629,59 +2629,6 @@ Handle(Geom2d_BSplineCurve) MakeBSpline2d(const Handle(IntPatch_WLine)& theWLine
}
}
//
{
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;
@@ -2736,16 +2683,13 @@ Handle(Geom2d_BSplineCurve) MakeBSpline2d(const Handle(IntPatch_WLine)& theWLine
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)

View File

@@ -6,4 +6,4 @@ tscale s1 0 0 0 SCALE1
tscale s2 0 0 0 SCALE1
bfuseblend result s1 s2 1*SCALE1
set square 53457.8
set square 52920.7

View File

@@ -6,7 +6,7 @@ puts ""
# Wrong result of two trimmed cylinders intersection
######################################################
set Tolerance 1.1e-7
set Tolerance 2.0e-6
set D_good 0.
set Limit_Tol 1.0e-7

View File

@@ -7,9 +7,9 @@ puts ""
#################################################
if { [regexp {Debug mode} [dversion]] } {
set max_time 1.0
set max_time 3.0
} else {
set max_time 0.5
set max_time 1.0
}
set ExpTol1 1.3823335207427231e-006

View File

@@ -0,0 +1,16 @@
puts "========"
puts "OCC27761"
puts "========"
puts ""
#################################################
# Intersection loops infinitely
#################################################
restore [locate_data_file bug27761_c1.brep] c1
restore [locate_data_file bug27761_c2.brep] c2
bsection result c1 c2
checkshape result
# approximate theoretical length of the result
set length 0.00192547

View File

@@ -6,7 +6,7 @@ puts ""
# Incorrect section curves between attached cylinders
#################################################
set ExpTol 1.0e-7
set ExpTol 2.3528376469664739e-011
set GoodNbCurv 3
restore [locate_data_file bug27761_c1.brep] c1
@@ -27,4 +27,4 @@ don c_*
fit
disp c1 c2
checkview -screenshot -2d -path ${imagedir}/${test_image}.png
set only_screen_axo 1