mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
0028500: Artifact in shaded view of the shape
Increase minimum number of discretization points by one explicitly on each iteration of model healer to cover cases degenerated to line (for cases when face consists of 2 edges only).
This commit is contained in:
@@ -35,11 +35,13 @@ IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_CurveTessellator, IMeshTools_CurveTessellato
|
||||
//=======================================================================
|
||||
BRepMesh_CurveTessellator::BRepMesh_CurveTessellator(
|
||||
const IMeshData::IEdgeHandle& theEdge,
|
||||
const IMeshTools_Parameters& theParameters)
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb)
|
||||
: myDEdge(theEdge),
|
||||
myParameters(theParameters),
|
||||
myEdge(theEdge->GetEdge()),
|
||||
myCurve(myEdge)
|
||||
myCurve(myEdge),
|
||||
myMinPointsNb (theMinPointsNb)
|
||||
{
|
||||
init();
|
||||
}
|
||||
@@ -52,11 +54,13 @@ BRepMesh_CurveTessellator::BRepMesh_CurveTessellator (
|
||||
const IMeshData::IEdgeHandle& theEdge,
|
||||
const TopAbs_Orientation theOrientation,
|
||||
const IMeshData::IFaceHandle& theFace,
|
||||
const IMeshTools_Parameters& theParameters)
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb)
|
||||
: myDEdge(theEdge),
|
||||
myParameters(theParameters),
|
||||
myEdge(TopoDS::Edge(theEdge->GetEdge().Oriented(theOrientation))),
|
||||
myCurve(myEdge, theFace->GetFace())
|
||||
myCurve(myEdge, theFace->GetFace()),
|
||||
myMinPointsNb (theMinPointsNb)
|
||||
{
|
||||
init();
|
||||
}
|
||||
@@ -97,7 +101,8 @@ void BRepMesh_CurveTessellator::init()
|
||||
myEdgeSqTol = BRep_Tool::Tolerance (myEdge);
|
||||
myEdgeSqTol *= myEdgeSqTol;
|
||||
|
||||
const Standard_Integer aMinPntNb = (myCurve.GetType() == GeomAbs_Circle) ? 4 : 2; //OCC287
|
||||
const Standard_Integer aMinPntNb = Max(myMinPointsNb,
|
||||
(myCurve.GetType() == GeomAbs_Circle) ? 4 : 2); //OCC287
|
||||
|
||||
myDiscretTool.Initialize (myCurve,
|
||||
myCurve.FirstParameter(), myCurve.LastParameter(),
|
||||
|
@@ -34,14 +34,16 @@ public:
|
||||
//! Constructor.
|
||||
Standard_EXPORT BRepMesh_CurveTessellator(
|
||||
const IMeshData::IEdgeHandle& theEdge,
|
||||
const IMeshTools_Parameters& theParameters);
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb = 2);
|
||||
|
||||
//! Constructor.
|
||||
Standard_EXPORT BRepMesh_CurveTessellator (
|
||||
const IMeshData::IEdgeHandle& theEdge,
|
||||
const TopAbs_Orientation theOrientation,
|
||||
const IMeshData::IFaceHandle& theFace,
|
||||
const IMeshTools_Parameters& theParameters);
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb = 2);
|
||||
|
||||
//! Destructor.
|
||||
Standard_EXPORT virtual ~BRepMesh_CurveTessellator ();
|
||||
@@ -96,6 +98,7 @@ private:
|
||||
const IMeshTools_Parameters& myParameters;
|
||||
TopoDS_Edge myEdge;
|
||||
BRepAdaptor_Curve myCurve;
|
||||
Standard_Integer myMinPointsNb;
|
||||
GCPnts_TangentialDeflection myDiscretTool;
|
||||
TopoDS_Vertex myFirstVertex;
|
||||
TopoDS_Vertex myLastVertex;
|
||||
|
@@ -49,9 +49,10 @@ BRepMesh_EdgeDiscret::~BRepMesh_EdgeDiscret ()
|
||||
//=======================================================================
|
||||
Handle(IMeshTools_CurveTessellator) BRepMesh_EdgeDiscret::CreateEdgeTessellator(
|
||||
const IMeshData::IEdgeHandle& theDEdge,
|
||||
const IMeshTools_Parameters& theParameters)
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb)
|
||||
{
|
||||
return new BRepMesh_CurveTessellator(theDEdge, theParameters);
|
||||
return new BRepMesh_CurveTessellator(theDEdge, theParameters, theMinPointsNb);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -62,11 +63,12 @@ Handle(IMeshTools_CurveTessellator) BRepMesh_EdgeDiscret::CreateEdgeTessellator(
|
||||
const IMeshData::IEdgeHandle& theDEdge,
|
||||
const TopAbs_Orientation theOrientation,
|
||||
const IMeshData::IFaceHandle& theDFace,
|
||||
const IMeshTools_Parameters& theParameters)
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb)
|
||||
{
|
||||
return theDEdge->GetSameParam() ?
|
||||
new BRepMesh_CurveTessellator(theDEdge, theParameters) :
|
||||
new BRepMesh_CurveTessellator(theDEdge, theOrientation, theDFace, theParameters);
|
||||
new BRepMesh_CurveTessellator(theDEdge, theParameters, theMinPointsNb) :
|
||||
new BRepMesh_CurveTessellator(theDEdge, theOrientation, theDFace, theParameters, theMinPointsNb);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -38,14 +38,16 @@ public:
|
||||
//! Creates instance of free edge tessellator.
|
||||
Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellator(
|
||||
const IMeshData::IEdgeHandle& theDEdge,
|
||||
const IMeshTools_Parameters& theParameters);
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb = 2);
|
||||
|
||||
//! Creates instance of edge tessellator.
|
||||
Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellator(
|
||||
const IMeshData::IEdgeHandle& theDEdge,
|
||||
const TopAbs_Orientation theOrientation,
|
||||
const IMeshData::IFaceHandle& theDFace,
|
||||
const IMeshTools_Parameters& theParameters);
|
||||
const IMeshTools_Parameters& theParameters,
|
||||
const Standard_Integer theMinPointsNb = 2);
|
||||
|
||||
//! Creates instance of tessellation extractor.
|
||||
Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellationExtractor(
|
||||
|
@@ -50,14 +50,32 @@ namespace
|
||||
void operator()(const IMeshData::IEdgePtr& theDEdge) const
|
||||
{
|
||||
const IMeshData::IEdgeHandle aDEdge = theDEdge;
|
||||
|
||||
Standard_Integer aPointsNb = aDEdge->GetCurve()->ParametersNb();
|
||||
|
||||
aDEdge->Clear(Standard_True);
|
||||
aDEdge->SetDeflection(Max(aDEdge->GetDeflection() / 3., Precision::Confusion()));
|
||||
|
||||
for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb(); ++aPCurveIt)
|
||||
{
|
||||
const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(aPCurveIt);
|
||||
const IMeshData::IFaceHandle aDFace = aPCurve->GetFace();
|
||||
|
||||
// Check that outer wire contains 2 edges or less and add an additional point.
|
||||
const IMeshData::IWireHandle& aDWire = aDFace->GetWire(0);
|
||||
if (aDWire->EdgesNb() <= 2)
|
||||
{
|
||||
++aPointsNb;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(0);
|
||||
const IMeshData::IFaceHandle aDFace = aPCurve->GetFace();
|
||||
Handle(IMeshTools_CurveTessellator) aTessellator =
|
||||
BRepMesh_EdgeDiscret::CreateEdgeTessellator(
|
||||
aDEdge, aPCurve->GetOrientation(), aDFace, myParameters);
|
||||
aDEdge, aPCurve->GetOrientation(), aDFace,
|
||||
myParameters, aPointsNb);
|
||||
|
||||
BRepMesh_EdgeDiscret::Tessellate3d(aDEdge, aTessellator, Standard_False);
|
||||
BRepMesh_EdgeDiscret::Tessellate2d(aDEdge, Standard_False);
|
||||
|
Reference in New Issue
Block a user