From 8041cb5ed9f167b577d80c3eb95f116b94413335 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 29 Aug 2007 07:57:39 +0000
Subject: [PATCH] fix bug for ruled surfaces with holes (part 1)

---
 Geo/GeoInterpolation.cpp | 10 ++++++----
 Geo/gmshEdge.cpp         |  4 ++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/Geo/GeoInterpolation.cpp b/Geo/GeoInterpolation.cpp
index b4b5ec0368..300dd998ce 100644
--- a/Geo/GeoInterpolation.cpp
+++ b/Geo/GeoInterpolation.cpp
@@ -1,4 +1,4 @@
-// $Id: GeoInterpolation.cpp,v 1.27 2007-05-24 14:44:06 remacle Exp $
+// $Id: GeoInterpolation.cpp,v 1.28 2007-08-29 07:57:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -456,6 +456,7 @@ Vertex InterpolateRuledSurface(Surface * s, double u, double v)
   Vertex *c1, *c2;
   int issphere = 1;
   for(int i = 0; i < List_Nbr(s->Generatrices); i++) {
+    if(i == 4) break; // we accept holes in ruled surfaces!
     List_Read(s->Generatrices, i, &C[i]);
     if(C[i]->Typ != MSH_SEGM_CIRC && C[i]->Typ != MSH_SEGM_CIRC_INV) {
       issphere = 0;
@@ -474,7 +475,7 @@ Vertex InterpolateRuledSurface(Surface * s, double u, double v)
 
   Vertex *S[4], V[4], T;
 
-  if(s->Typ == MSH_SURF_REGL){
+  if(s->Typ == MSH_SURF_REGL && List_Nbr(s->Generatrices) >= 4){
     S[0] = C[0]->beg;
     S[1] = C[1]->beg;
     S[2] = C[2]->beg;
@@ -484,8 +485,9 @@ Vertex InterpolateRuledSurface(Surface * s, double u, double v)
     V[2] = InterpolateCurve(C[2], C[2]->ubeg + (C[2]->uend - C[2]->ubeg) * (1. - u), 0);
     V[3] = InterpolateCurve(C[3], C[3]->ubeg + (C[3]->uend - C[3]->ubeg) * (1. - v), 0);
     T = TransfiniteQua(V[0], V[1], V[2], V[3], *S[0], *S[1], *S[2], *S[3], u, v);
+    if(issphere) TransfiniteSph(*S[0], *c1, &T);
   }
-  else{
+  else if(List_Nbr(s->Generatrices) >= 3){
     S[0] = C[0]->beg;
     S[1] = C[1]->beg;
     S[2] = C[2]->beg;
@@ -493,9 +495,9 @@ Vertex InterpolateRuledSurface(Surface * s, double u, double v)
     V[1] = InterpolateCurve(C[1], C[1]->ubeg + (C[1]->uend - C[1]->ubeg) * v, 0);
     V[2] = InterpolateCurve(C[2], C[2]->ubeg + (C[2]->uend - C[2]->ubeg) * (1.-u), 0);
     T = TransfiniteTri(V[0], V[1], V[2], *S[0], *S[1], *S[2], u, v);
+    if(issphere) TransfiniteSph(*S[0], *c1, &T);
   }
 
-  if(issphere) TransfiniteSph(*S[0], *c1, &T);
   return T;
 }
 
diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp
index debde454d7..2c64cb82c9 100644
--- a/Geo/gmshEdge.cpp
+++ b/Geo/gmshEdge.cpp
@@ -1,4 +1,4 @@
-// $Id: gmshEdge.cpp,v 1.35 2007-07-25 15:48:32 geuzaine Exp $
+// $Id: gmshEdge.cpp,v 1.36 2007-08-29 07:57:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -227,7 +227,7 @@ SPoint2 gmshEdge::reparamOnFace(GFace *face, double epar,int dir) const
   }
   
   if(s->Typ ==  MSH_SURF_REGL){
-    Curve *C[4];
+    Curve *C[4]; // BUG !!!!!!!!!!!!!!!!!!!!!
     for(int i = 0; i < 4; i++)
       List_Read(s->Generatrices, i, &C[i]);
 
-- 
GitLab