Salome HOME
PAL9163. Fix GetFaceNormal() for badly shaped quadrangles
authoreap <eap@opencascade.com>
Tue, 14 Jun 2005 10:19:12 +0000 (10:19 +0000)
committereap <eap@opencascade.com>
Tue, 14 Jun 2005 10:19:12 +0000 (10:19 +0000)
src/SMDS/SMDS_VolumeTool.cxx

index dd98851eb8f84f9239f18fd5a1e6bded4ec87b69..2b549d217e7ac10998624bc43c9c2a30dfde19a0 100644 (file)
@@ -536,6 +536,15 @@ bool SMDS_VolumeTool::GetFaceNormal (int faceIndex, double & X, double & Y, doub
   XYZ aVec13( p3 - p1 );
   XYZ cross = aVec12.Crossed( aVec13 );
 
+  if ( myFaceNbNodes[ faceIndex ] == 4 ) {
+    XYZ p4 ( myFaceNodes[3] );
+    XYZ aVec14( p4 - p1 );
+    XYZ cross2 = aVec13.Crossed( aVec14 );
+    cross.x += cross2.x;
+    cross.y += cross2.y;
+    cross.z += cross2.z;    
+  }
+
   double size = cross.Magnitude();
   if ( size <= DBL_MIN )
     return false;
@@ -952,8 +961,9 @@ bool SMDS_VolumeTool::setFace( int faceIndex )
 
     // set face nodes
     myFaceNodes = new const SMDS_MeshNode* [myFaceNbNodes + 1];
-    for ( int iNode = 0; iNode <= myFaceNbNodes; iNode++ )
+    for ( int iNode = 0; iNode < myFaceNbNodes; iNode++ )
       myFaceNodes[ iNode ] = myVolumeNodes[ myFaceNodeIndices[ iNode ]];
+    myFaceNodes[ myFaceNbNodes ] = myFaceNodes[ 0 ];
   }
 
   myCurFace = faceIndex;