Skip to content
Snippets Groups Projects
Commit 2d1d98a8 authored by Jean-François Remacle's avatar Jean-François Remacle
Browse files

Correction of a bug in isosurfacing,

quad rendering was false.
parent a2466dc6
No related branches found
No related tags found
No related merge requests found
// $Id: Views.cpp,v 1.24 2001-01-19 22:32:31 remacle Exp $ // $Id: Views.cpp,v 1.25 2001-01-25 21:36:58 remacle Exp $
#include <set> #include <set>
#include "Gmsh.h" #include "Gmsh.h"
...@@ -768,9 +768,9 @@ void Post_View :: smooth () ...@@ -768,9 +768,9 @@ void Post_View :: smooth ()
n1++; n1++;
n2 += (*it).nboccurences; n2 += (*it).nboccurences;
// test // test
//double val = sqrt (x[j] * x[j] + y[j] * y[j] + z[j] * z[j]); // double val = sqrt ((x[j]-1) * (x[j]-1) + y[j] * y[j] + z[j] * z[j]);
//for(int k=0;k<NbTimeStep;k++)v[j+k*8] = val; //for(int k=0;k<NbTimeStep;k++)v[j+k*8] = val;
for(int k=0;k<NbTimeStep;k++)v[j+k*8] = (*it).vals[k]; for(int k=0;k<NbTimeStep;k++)v[j+k*8] = (*it).vals[k];
} }
} }
} }
......
// $Id: Draw.cpp,v 1.17 2001-01-17 21:26:24 remacle Exp $ // $Id: Draw.cpp,v 1.18 2001-01-25 21:36:59 remacle Exp $
#include "Gmsh.h" #include "Gmsh.h"
#include "GmshUI.h" #include "GmshUI.h"
...@@ -132,8 +132,14 @@ void Orthogonalize(int x, int y){ ...@@ -132,8 +132,14 @@ void Orthogonalize(int x, int y){
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
void InitShading(void){ void InitShading(void){
GLfloat specular[4];
int i; int i;
float ambient[] = {0.1745, 0.01175, 0.01175};
float diffuse[] = {0.61424, 0.04136, 0.04136};
float specular[4];
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE); glEnable(GL_NORMALIZE);
......
// $Id: Iso.cpp,v 1.5 2001-01-19 22:32:31 remacle Exp $ // $Id: Iso.cpp,v 1.6 2001-01-25 21:36:59 remacle Exp $
#include "Gmsh.h" #include "Gmsh.h"
#include "Mesh.h" #include "Mesh.h"
...@@ -35,52 +35,75 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val, ...@@ -35,52 +35,75 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val,
double V, double Vmin, double Vmax, double V, double Vmin, double Vmax,
double *Offset, double Raise[3][5], int shade){ double *Offset, double Raise[3][5], int shade){
int nb,i; int nb,i;
int ed[6] = {0,0,0,0,0,0};
double Xp[6],Yp[6],Zp[6]; double Xp[6],Yp[6],Zp[6];
double Xpi[6],Ypi[6],Zpi[6]; double Xpi[6],Ypi[6],Zpi[6];
if(V != Vmax){ if(V != Vmax){
nb = 0; nb = 0;
if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){ if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[0]++;
} }
if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){ if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[1]++;
} }
if((Val[0] > V && Val[3] <= V) || (Val[3] > V && Val[0] <= V)){ if((Val[0] > V && Val[3] <= V) || (Val[3] > V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[2]++;
} }
if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){ if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){
Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[3]++;
} }
if((Val[1] > V && Val[3] <= V) || (Val[3] > V && Val[1] <= V)){ if((Val[1] > V && Val[3] <= V) || (Val[3] > V && Val[1] <= V)){
Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[4]++;
} }
if((Val[2] > V && Val[3] <= V) || (Val[3] > V && Val[2] <= V)){ if((Val[2] > V && Val[3] <= V) || (Val[3] > V && Val[2] <= V)){
Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[5]++;
} }
} }
else{ else{
nb=0; nb=0;
if((Val[0] < V && Val[1] <= V) || (Val[1] < V && Val[0] <= V)){ if((Val[0] < V && Val[1] <= V) || (Val[1] < V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[0]++;
} }
if((Val[0] < V && Val[2] <= V) || (Val[2] < V && Val[0] <= V)){ if((Val[0] < V && Val[2] <= V) || (Val[2] < V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[1]++;
} }
if((Val[0] < V && Val[3] <= V) || (Val[3] < V && Val[0] <= V)){ if((Val[0] < V && Val[3] <= V) || (Val[3] < V && Val[0] <= V)){
Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[2]++;
} }
if((Val[1] < V && Val[2] <= V) || (Val[2] < V && Val[1] <= V)){ if((Val[1] < V && Val[2] <= V) || (Val[2] < V && Val[1] <= V)){
Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[3]++;
} }
if((Val[1] < V && Val[3] <= V) || (Val[3] < V && Val[1] <= V)){ if((Val[1] < V && Val[3] <= V) || (Val[3] < V && Val[1] <= V)){
Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[4]++;
} }
if((Val[2] < V && Val[3] <= V) || (Val[3] < V && Val[2] <= V)){ if((Val[2] < V && Val[3] <= V) || (Val[3] < V && Val[2] <= V)){
Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;ed[5]++;
} }
} }
/*
3 possibilities for quads
-) 0,2,5,3
-) 0,1,5,4
-) 1,2,4,3
in all cases, simply invert the 2 last ones
for having the quads ordered
*/
if(nb == 4)
{
double xx = Xp[3];
double yy = Yp[3];
double zz = Zp[3];
Xp[3] = Xp[2];
Yp[3] = Yp[2];
Zp[3] = Zp[2];
Xp[2] = xx;
Yp[2] = yy;
Zp[2] = zz;
}
/* /*
for having a nice isosurface, we should have n . grad v > 0 for having a nice isosurface, we should have n . grad v > 0
n = normal to the polygon n = normal to the polygon
...@@ -109,9 +132,9 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val, ...@@ -109,9 +132,9 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val,
double gr[3] = {X[2]-X[0],Y[2]-Y[0],Z[2]-Z[0]}; double gr[3] = {X[2]-X[0],Y[2]-Y[0],Z[2]-Z[0]};
double xx = gr[0] * n[0] + gr[1] * n[1] + gr[2] + n[2]; double xx = gr[0] * n[0] + gr[1] * n[1] + gr[2] + n[2];
if(Val[2] > Val[0]) xx = -xx; if(Val[2] > Val[0]) xx = -xx;
} }
// test
if(xx > 0) if(xx > 0)
{ {
...@@ -125,13 +148,11 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val, ...@@ -125,13 +148,11 @@ void IsoSimplex(double *X, double *Y, double *Z, double *Val,
{ {
Xp[i] = Xpi[nb-i-1]; Xp[i] = Xpi[nb-i-1];
Yp[i] = Ypi[nb-i-1]; Yp[i] = Ypi[nb-i-1];
Zp[i] = Zpi[nb-i-1]; Zp[i] = Zpi[nb-i-1];
} }
} }
} }
if(nb == 3) if(nb == 3)
Draw_Triangle(Xp,Yp,Zp,Offset,Raise,shade); Draw_Triangle(Xp,Yp,Zp,Offset,Raise,shade);
else if(nb == 4) else if(nb == 4)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment