mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-06 18:26:22 +03:00
0025488: Wrong result of two trimmed cylinders intersection
1. Function IsSame(...) for IntSurf_PntOn2S was added (see IntSurf_PntOn2S.cdl for detail information). 2. Inserting additional points is forbidden if existing WLine contains only two points coincided. Test-case for issue #25488
This commit is contained in:
parent
80d659a5a6
commit
baf72cd2e7
@ -2236,6 +2236,19 @@ Standard_Boolean IntCyCyTrim( const IntSurf_Quadric& theQuad1,
|
|||||||
theSPnt.Append(aP);
|
theSPnt.Append(aP);
|
||||||
}
|
}
|
||||||
else if(aWLine1->NbPnts() > 1)
|
else if(aWLine1->NbPnts() > 1)
|
||||||
|
{
|
||||||
|
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;
|
isTheEmpty = Standard_False;
|
||||||
isAddedIntoWL1 = Standard_True;
|
isAddedIntoWL1 = Standard_True;
|
||||||
@ -2247,6 +2260,7 @@ Standard_Boolean IntCyCyTrim( const IntSurf_Quadric& theQuad1,
|
|||||||
aWLine1->ComputeVertexParameters(theTol3D);
|
aWLine1->ComputeVertexParameters(theTol3D);
|
||||||
theSlin.Append(aWLine1);
|
theSlin.Append(aWLine1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
isAddedIntoWL1 = Standard_False;
|
isAddedIntoWL1 = Standard_False;
|
||||||
@ -2266,6 +2280,18 @@ Standard_Boolean IntCyCyTrim( const IntSurf_Quadric& theQuad1,
|
|||||||
theSPnt.Append(aP);
|
theSPnt.Append(aP);
|
||||||
}
|
}
|
||||||
else if(aWLine2->NbPnts() > 1)
|
else if(aWLine2->NbPnts() > 1)
|
||||||
|
{
|
||||||
|
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;
|
isTheEmpty = Standard_False;
|
||||||
isAddedIntoWL2 = Standard_True;
|
isAddedIntoWL2 = Standard_True;
|
||||||
@ -2277,6 +2303,7 @@ Standard_Boolean IntCyCyTrim( const IntSurf_Quadric& theQuad1,
|
|||||||
aWLine2->ComputeVertexParameters(theTol3D);
|
aWLine2->ComputeVertexParameters(theTol3D);
|
||||||
theSlin.Append(aWLine2);
|
theSlin.Append(aWLine2);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
isAddedIntoWL2 = Standard_False;
|
isAddedIntoWL2 = Standard_False;
|
||||||
|
@ -119,6 +119,15 @@ is
|
|||||||
|
|
||||||
is static;
|
is static;
|
||||||
|
|
||||||
|
IsSame(me; theOterPoint : PntOn2S from IntSurf;
|
||||||
|
theTol3D, theTol2D: Real from Standard = 0.0)
|
||||||
|
|
||||||
|
---Purpose: Returns TRUE if 2D- and 3D-coordinates of theOterPoint are equal to
|
||||||
|
-- corresponding coordinates of me (with given tolerance).
|
||||||
|
-- If theTol2D == 0.0 we will compare 3D-points only.
|
||||||
|
|
||||||
|
returns Boolean from Standard;
|
||||||
|
|
||||||
|
|
||||||
fields
|
fields
|
||||||
|
|
||||||
|
@ -49,4 +49,31 @@ void IntSurf_PntOn2S::SetValue (const Standard_Boolean OnFirst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
33
tests/bugs/modalg_5/bug25488
Normal file
33
tests/bugs/modalg_5/bug25488
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
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}]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user