aWL1FindStatus = 2; //start a new line
}
}
-
+
if( ((aUSurf2f-aU22) <= theTol2D) &&
((aU22-aUSurf2l) <= theTol2D) &&
((aVSurf1f - aV12) <= theTol2D) &&
}
else if(aWLine1->NbPnts() > 1)
{
- isTheEmpty = Standard_False;
- isAddedIntoWL1 = Standard_True;
+ Standard_Boolean isGood = Standard_True;
+
+ if(aWLine1->NbPnts() == 2)
+ {
+ const IntSurf_PntOn2S& aPf = aWLine1->Point(1);
+ const IntSurf_PntOn2S& aPl = aWLine1->Point(2);
+
+ if(aPf.IsSame(aPl, Precision::Confusion()))
+ isGood = Standard_False;
+ }
+
+ if(isGood)
+ {
+ isTheEmpty = Standard_False;
+ isAddedIntoWL1 = Standard_True;
- SeekAdditionalPoints(theQuad1, theQuad2, aWLine1->Curve(),
- anEquationCoeffs, aNbPoints, aUSurf2f, aUSurf2l,
- theTol2D, aPeriod, 1.0, isTheReverse);
+ SeekAdditionalPoints( theQuad1, theQuad2, aWLine1->Curve(),
+ anEquationCoeffs, aNbPoints, aUSurf2f, aUSurf2l,
+ theTol2D, aPeriod, 1.0, isTheReverse);
- aWLine1->ComputeVertexParameters(theTol3D);
- theSlin.Append(aWLine1);
+ aWLine1->ComputeVertexParameters(theTol3D);
+ theSlin.Append(aWLine1);
+ }
}
else
{
}
else if(aWLine2->NbPnts() > 1)
{
- isTheEmpty = Standard_False;
- isAddedIntoWL2 = Standard_True;
+ Standard_Boolean isGood = Standard_True;
+ if(aWLine2->NbPnts() == 2)
+ {
+ const IntSurf_PntOn2S& aPf = aWLine2->Point(1);
+ const IntSurf_PntOn2S& aPl = aWLine2->Point(2);
+
+ if(aPf.IsSame(aPl, Precision::Confusion()))
+ isGood = Standard_False;
+ }
+
+ if(isGood)
+ {
+ isTheEmpty = Standard_False;
+ isAddedIntoWL2 = Standard_True;
- SeekAdditionalPoints(theQuad1, theQuad2, aWLine2->Curve(),
- anEquationCoeffs, aNbPoints, aUSurf2f, aUSurf2l,
- theTol2D, aPeriod, -1.0, isTheReverse);
+ SeekAdditionalPoints(theQuad1, theQuad2, aWLine2->Curve(),
+ anEquationCoeffs, aNbPoints, aUSurf2f, aUSurf2l,
+ theTol2D, aPeriod, -1.0, isTheReverse);
- aWLine2->ComputeVertexParameters(theTol3D);
- theSlin.Append(aWLine2);
+ aWLine2->ComputeVertexParameters(theTol3D);
+ theSlin.Append(aWLine2);
+ }
}
else
{
}
+Standard_Boolean IntSurf_PntOn2S::IsSame( const IntSurf_PntOn2S& theOterPoint,
+ const Standard_Real theTol3D,
+ const Standard_Real theTol2D) const
+{
+ if(pt.SquareDistance(theOterPoint.Value()) > theTol3D*theTol3D)
+ return Standard_False;
+ if(IsEqual(theTol2D, 0.0))
+ {//We need not compare 2D-coordinates of the points
+ return Standard_True;
+ }
+
+ Standard_Real aU1 = 0.0, aV1 = 0.0, aU2 = 0.0, aV2 = 0.0;
+ theOterPoint.Parameters(aU1, aV1, aU2, aV2);
+
+ gp_Pnt2d aP1(u1, v1), aP2(aU1, aV1);
+
+ if(!aP1.IsEqual(aP2, theTol2D))
+ return Standard_False;
+
+ aP1.SetCoord(u2, v2);
+ aP2.SetCoord(aU2, aV2);
+
+ if(!aP1.IsEqual(aP2, theTol2D))
+ return Standard_False;
+
+ return Standard_True;
+}
--- /dev/null
+puts "========"
+puts "OCC25488"
+puts "========"
+puts ""
+######################################################
+# Wrong result of two trimmed cylinders intersection
+######################################################
+
+set Tolerance 3.0e-7
+set D_good 0.
+
+restore [locate_data_file OCC25488_sb1_1t.draw] sb1
+restore [locate_data_file OCC25488_sb2_1t.draw] sb2
+
+set bug_info [intersect res sb1 sb2]
+
+set i 0
+while {$i != [llength $bug_info]} {
+ set res_i [lindex $bug_info $i]
+ dlog reset
+ dlog on
+ xdistcs ${res_i} sb1 0 1 10
+ set BugLog [dlog get]
+ set BugList [split ${BugLog} {TD= \t\n}]
+ checkList ${BugList} ${Tolerance} ${D_good}
+ dlog reset
+ dlog on
+ xdistcs ${res_i} sb2 0 1 10
+ set BugLog [dlog get]
+ set BugList [split ${BugLog} {TD= \t\n}]
+ checkList ${BugList} ${Tolerance} ${D_good}
+ set i [expr {$i + 1}]
+}