From 9498ffd3ab01250dc79f4d9d3ec60caec02a0a16 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 22 Jun 2004 18:04:10 +0000
Subject: [PATCH] another quick hack for non-convex surfaces

---
 Mesh/2D_Mesh.cpp | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index a39659cda3..3a6f257ae2 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh.cpp,v 1.61 2004-06-22 17:34:10 geuzaine Exp $
+// $Id: 2D_Mesh.cpp,v 1.62 2004-06-22 18:04:10 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -789,6 +789,18 @@ void ActionInvertTriQua(void *a, void *b)
   }
 }
 
+int isPointOnPlanarSurface(Surface * S, double X, double Y, double Z, double n[3]);
+
+int isMiddlePointOnPlanarSurface(Surface *s, Vertex *v1, Vertex *v2)
+{
+  double n[3] = {s->a, s->b, s->c};
+  norme(n);
+  double x = 0.5 * (v1->Pos.X + v2->Pos.X);
+  double y = 0.5 * (v1->Pos.Y + v2->Pos.Y);
+  double z = 0.5 * (v1->Pos.Z + v2->Pos.Z);
+  return isPointOnPlanarSurface(s, x, y, z, n);
+}
+
 void Get_SurfaceNormal(Surface *s, double n[3])
 {
   double t1[3], t2[3];
@@ -817,7 +829,7 @@ void Get_SurfaceNormal(Surface *s, double n[3])
 	t2[1] = v3->Pos.Y - v1->Pos.Y;
 	t2[2] = v3->Pos.Z - v1->Pos.Z;
 	prodve(t1, t2, n);
-	if(norme(n))
+	if(norme(n) && isMiddlePointOnPlanarSurface(s, v1, v3))
 	  break;
       }
     }
@@ -827,6 +839,7 @@ void Get_SurfaceNormal(Surface *s, double n[3])
       n[0] = s->a;
       n[1] = s->b;
       n[2] = s->c;
+      norme(n);
     }
     List_Delete(points);
   }
-- 
GitLab