mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-03 17:56:21 +03:00
0026485: Problem with the normals of a triangulated shape
Use gp::Resolution() instead of Precision::SquareConfustion() in order to normalize normal vectors according to implementation of gp_Vec::Normalize(). Test case Test-case for issue #26485
This commit is contained in:
parent
8c820969cc
commit
db6c6404bc
@ -460,7 +460,7 @@ void Poly::ComputeNormals(const Handle(Poly_Triangulation)& Tri)
|
||||
Standard_Real aCoord[3];
|
||||
Standard_Integer iNode[3] = {0, 0, 0};
|
||||
Standard_Integer iN, iTri;
|
||||
const Standard_Real eps2 = Precision::SquareConfusion();
|
||||
const Standard_Real eps2 = gp::Resolution();
|
||||
|
||||
for (iTri = 1; iTri <= arrTri.Length(); iTri++) {
|
||||
// Get the nodes of the current triangle
|
||||
|
@ -3805,6 +3805,77 @@ static Standard_Integer OCC26407 (Draw_Interpretor& theDI, Standard_Integer theA
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : OCC26485
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
#include <Poly.hxx>
|
||||
static Standard_Integer OCC26485 (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
|
||||
{
|
||||
if (theArgNb != 2)
|
||||
{
|
||||
std::cerr << "Error: wrong number of arguments! See usage:\n";
|
||||
theDI.PrintHelp (theArgVec[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
TopoDS_Shape aShape = DBRep::Get(theArgVec[1]);
|
||||
if (aShape.IsNull())
|
||||
{
|
||||
theDI << "Failed. Null shape\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_Boolean isFailed = Standard_False;
|
||||
TopExp_Explorer aExplorer(aShape, TopAbs_FACE);
|
||||
for (; aExplorer.More(); aExplorer.Next())
|
||||
{
|
||||
const TopoDS_Face& aFace = TopoDS::Face( aExplorer.Current() );
|
||||
TopLoc_Location L = TopLoc_Location();
|
||||
const Handle(Poly_Triangulation)& aT = BRep_Tool::Triangulation( aFace , L );
|
||||
|
||||
if(aT.IsNull())
|
||||
continue;
|
||||
|
||||
Poly::ComputeNormals(aT);
|
||||
const TColgp_Array1OfPnt& aVertices = aT->Nodes();
|
||||
const TShort_Array1OfShortReal& aNormals = aT->Normals();
|
||||
|
||||
// Number of nodes in the triangulation
|
||||
int aVertexNb = aT->Nodes().Length();
|
||||
if (aVertexNb*3 != aNormals.Length())
|
||||
{
|
||||
theDI << "Failed. Different number of normals vs. vertices\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Get each vertex index, checking common vertexes between shapes
|
||||
for( int i=0; i < aVertexNb; i++ )
|
||||
{
|
||||
gp_Pnt aPoint = aVertices.Value( i+1 );
|
||||
gp_Vec aNormal = gp_Vec(
|
||||
aNormals.Value( i*3 + 1 ),
|
||||
aNormals.Value( i*3 + 2 ),
|
||||
aNormals.Value( i*3 + 3 ) );
|
||||
|
||||
if (aNormal.X() == 0 && aNormal.Y() == 0 && aNormal.Z() == 1)
|
||||
{
|
||||
char buf[256];
|
||||
sprintf(buf, "fail_%d", i+1);
|
||||
theDI << "Failed. Point " << buf << ": "
|
||||
<< aPoint.X() << " "
|
||||
<< aPoint.Y() << " "
|
||||
<< aPoint.Z() << "\n";
|
||||
|
||||
DrawTrSurf::Set (buf, aPoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
theDI << (isFailed ? "Test failed" : "Test completed") << "\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QABugs::Commands_19(Draw_Interpretor& theCommands) {
|
||||
const char *group = "QABugs";
|
||||
|
||||
@ -3879,5 +3950,6 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
|
||||
theCommands.Add ("OCC26446", "OCC26446 r c1 c2", __FILE__, OCC26446, group);
|
||||
theCommands.Add ("OCC26448", "OCC26448: check method Prepend() of sequence", __FILE__, OCC26448, group);
|
||||
theCommands.Add ("OCC26407", "OCC26407 result_name", __FILE__, OCC26407, group);
|
||||
theCommands.Add ("OCC26485", "OCC26485 shape", __FILE__, OCC26485, group);
|
||||
return;
|
||||
}
|
||||
|
12
tests/bugs/fclasses/bug26485
Normal file
12
tests/bugs/fclasses/bug26485
Normal file
@ -0,0 +1,12 @@
|
||||
puts "========"
|
||||
puts "OCC26485"
|
||||
puts "========"
|
||||
puts ""
|
||||
####################################################
|
||||
# Problem with the normals of a triangulated shape
|
||||
####################################################
|
||||
|
||||
pload QAcommands
|
||||
|
||||
restore [locate_data_file OCC26485-meshed_shape.brep] a
|
||||
OCC26485 a
|
Loading…
x
Reference in New Issue
Block a user