diff --git a/Common/Views.cpp b/Common/Views.cpp index ab3c14ae09773c042774edff721e2265baedf6a1..0396689bb8fa7d13ac647c10ee42dac405c37648 100644 --- a/Common/Views.cpp +++ b/Common/Views.cpp @@ -1,4 +1,4 @@ -// $Id: Views.cpp,v 1.187 2006-03-15 08:29:06 remacle Exp $ +// $Id: Views.cpp,v 1.188 2006-04-18 09:57:32 remacle Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -111,6 +111,7 @@ Post_View *BeginView(int allocate) if(allocate) { v->DataSize = sizeof(double); v->Grains = new std::map < int , List_T * > ; + v->DisplayListsOfGrains= new std::map < int , int > ; #define LCD List_Create(1, 1000, sizeof(double)) v->Time = LCD; @@ -132,6 +133,7 @@ Post_View *BeginView(int allocate) else { v->Time = NULL; v->Grains = 0; + v->DisplayListsOfGrains = 0; v->SP = v->VP = v->TP = NULL; v->SL = v->VL = v->TL = v->SL2 = v->VL2 = v->TL2 = NULL; v->ST = v->VT = v->TT = v->ST2 = v->VT2 = v->TT2 = NULL; @@ -598,6 +600,7 @@ void FreeView(Post_View * v) List_Delete(v->T2D); List_Delete(v->T2C); List_Delete(v->T3D); List_Delete(v->T3C); delete v->Grains; + delete v->DisplayListsOfGrains; // Note: all the second order elements have already been freed in xxxx if(v->normals) delete v->normals; if(v->TriVertexArray) delete v->TriVertexArray; diff --git a/Common/Views.h b/Common/Views.h index 98e4a75b2aa838e81f073bb6393bc4e844df1158..c22da3ef99204a09bd4e25ef2b9afeee52caebd7 100644 --- a/Common/Views.h +++ b/Common/Views.h @@ -70,6 +70,7 @@ class Post_View{ int NbT2, NbT3; List_T *T2D, *T2C, *T3D, *T3C; // 2D and 3D text strings std::map < int , List_T * > *Grains; // For LMGC90, grains shapes + std::map < int , int > *DisplayListsOfGrains; // For LMGC90, grains shapes // vertex arrays to draw triangles and lines efficiently diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp index 030ee99ad8233a6153a2a1c6f72de612ef208f2c..fe7bf6d1d0626c8059b9a830b2511bbf37282c71 100644 --- a/Graphics/PostElement.cpp +++ b/Graphics/PostElement.cpp @@ -1,4 +1,4 @@ -// $Id: PostElement.cpp,v 1.72 2006-04-18 07:49:20 remacle Exp $ +// $Id: PostElement.cpp,v 1.73 2006-04-18 09:57:42 remacle Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -36,10 +36,6 @@ using namespace std; -int state = -1; // to distinguish the different LMGC cases to output -double zmin[1],zmax[1]; -int k = 0; -int kk =0; extern Context_T CTX; void Draw_ElementBoundary(int type, Post_View * View, @@ -1254,12 +1250,15 @@ void Draw_VectorPyramid(ARGS) // Tensor Elements +static int state = -1; + void Draw_TensorElement(int type, Post_View * View, int preproNormals, double ValMin, double ValMax, - double *X, double *Y, double *Z, double *V) + double *iX, double *iY, double *iZ, double *V) { int nbnod = 0; + switch (type) { case POST_POINT: nbnod = 1; break; case POST_LINE: nbnod = 2; break; @@ -1275,427 +1274,320 @@ void Draw_TensorElement(int type, Post_View * View, int preproNormals, /// their Von Mises invariant (J2 invariant); this will simply call /// the scalar function... + int ts = View->TimeStep; + if(View->TensorType == DRAW_POST_VONMISES){ - int ts = View->TimeStep; View->TimeStep = 0; double V_VonMises[8]; for(int i = 0; i < nbnod; i++){ V_VonMises[i] = ComputeVonMises(V + 9*(i + nbnod * ts)); } - Draw_ScalarElement(type, View, preproNormals, ValMin, ValMax, X, Y, Z, V_VonMises); - - View->TimeStep = ts; - + Draw_ScalarElement(type, View, preproNormals, ValMin, ValMax, iX, iY, iZ, V_VonMises); } + + else if(View->TensorType == DRAW_POST_LMGC90 || + View->TensorType == DRAW_POST_LMGC90_TYPE || + View->TensorType == DRAW_POST_LMGC90_COORD || + View->TensorType == DRAW_POST_LMGC90_PRES || + View->TensorType == DRAW_POST_LMGC90_SN || + View->TensorType == DRAW_POST_LMGC90_DEPX || + View->TensorType == DRAW_POST_LMGC90_DEPY|| + View->TensorType == DRAW_POST_LMGC90_DEPZ || + View->TensorType == DRAW_POST_LMGC90_DEPAV || + View->TensorType == DRAW_POST_LMGC90_DEPNORM){ + + //cout << View->TensorType << endl; + + static double zmin[3],zmax[3]; + int it; + double DEP[3]; // déplacement relatif cdf % a config de référence + double CDG[3]; // coordonnées du centre de gravité au tps t0 + double VIT[3]; // vitesse en x,y,z du cdg % au repère absolu + double ROT[3]; // angles de rotation du cdg % au repère absolu + double VAR[3]; // valeur des 3 variables supplémentaires + double X[3],Y[3],Z[3]; + double a11,a12,a13,a21,a22,a23,a31,a32,a33; + double ztmp[3]; + + View->TimeStep = 0; + + List_T * list = (*(View->Grains))[(int)V[6]]; + // Liste contenant toutes les info sur les lignes TP : (x,x,x) et {x,x,x,x,x,x,x,x,x, ...} + // info rangé à la suite + List_T * listt = View->TP; + + CDG[0] = iX[0]; + CDG[1] = iY[0]; + CDG[2] = iZ[0]; + + // Lecture des coordonnées du cdg dans le repère absolu + // List_Read(listt,0+it,&CDG[0]); + // List_Read(listt,1+it,&CDG[1]); + // List_Read(listt,2+it,&CDG[2]); + + // Lecture des déplacements par rapport au cdg initital - if(View->TensorType == DRAW_POST_LMGC90 || View->TensorType == DRAW_POST_LMGC90_TYPE || View->TensorType == DRAW_POST_LMGC90_COORD || View->TensorType == DRAW_POST_LMGC90_PRES || View->TensorType == DRAW_POST_LMGC90_SN || View->TensorType == DRAW_POST_LMGC90_DEPX || View->TensorType == DRAW_POST_LMGC90_DEPY|| View->TensorType == DRAW_POST_LMGC90_DEPZ || View->TensorType == DRAW_POST_LMGC90_DEPAV || View->TensorType == DRAW_POST_LMGC90_DEPNORM){ -//cout << View->TensorType << endl; - int ts = View->TimeStep; - int it; - double DEP[3]; // déplacement relatif cdf % a config de référence - double CDG[3]; // coordonnées du centre de gravité au tps t0 - double VIT[3]; // vitesse en x,y,z du cdg % au repère absolu - double ROT[3]; // angles de rotation du cdg % au repère absolu - double VAR[3]; // valeur des 3 variables supplémentaires - double a11,a12,a13,a21,a22,a23,a31,a32,a33; - double ztmp[3]; - - View->TimeStep = 0; - - List_T * list = (*(View->Grains))[(int)V[6]]; - // Liste contenant toutes les info sur les lignes TP : (x,x,x) et {x,x,x,x,x,x,x,x,x, ...} - // info rangé à la suite - List_T * listt = View->TP; - - k = k+1; - it = (k-1)*List_Nbr(listt)/View->NbTP; - - // Lecture des coordonnées du cdg dans le repère absolu - List_Read(listt,0+it,&CDG[0]); - List_Read(listt,1+it,&CDG[1]); - List_Read(listt,2+it,&CDG[2]); - - // Lecture des déplacements par rapport au cdg initital - List_Read(listt,3+ts*9+it,&DEP[0]); - List_Read(listt,4+ts*9+it,&DEP[1]); - List_Read(listt,5+ts*9+it,&DEP[2]); - - // Lecture des rotations du centre de gravité - List_Read(listt,6+ts*9+it,&ROT[0]); - List_Read(listt,7+ts*9+it,&ROT[1]); - List_Read(listt,8+ts*9+it,&ROT[2]); - - /*if(vz==0 || vy == 0){ - ROT[0] = 0; - else{ - ROT[0] = atan(vz/vy);} - if(vx==0 || vz == 0){ - ROT[1] = 0;} - else{ - ROT[1] = atan(vx/vz);} - if(vy==0 || vx == 0){ - ROT[2] = 0;} - else{ - ROT[2] = atan(vy/vx);} */ - - // Lecture des valeurs des variables supplémentaires - List_Read(listt,9+ts*9+it,&VAR[0]); - List_Read(listt,10+ts*9+it,&VAR[1]); - List_Read(listt,11+ts*9+it,&VAR[2]); -// cout << "var8 " << VAR[1] << endl; -// cout << "var9 " << VAR[2] << endl; - // calcule les valeurs min et max d'une info 1 seule fois - if(state != View->TensorType){ - switch (View->TensorType) { - case DRAW_POST_LMGC90: - // couleur uniforme - zmin[0]=1; - zmax[0]=1; - state = DRAW_POST_LMGC90; - break; - case DRAW_POST_LMGC90_TYPE: - // couleur en fonction du type de grain - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,9,&zmin[0]); - List_Read(listt,9,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - List_Read(listt,i*it+9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - state = DRAW_POST_LMGC90_TYPE; - break; - case DRAW_POST_LMGC90_COORD: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,9,&zmin[0]); - List_Read(listt,9,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9-1; j++){ - List_Read(listt,i*it+18+j*9,&ztmp[0]); // on part pas du premier - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_COORD; - break; - case DRAW_POST_LMGC90_PRES: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,10,&zmin[0]); - List_Read(listt,10,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+10+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_PRES; - break; - case DRAW_POST_LMGC90_SN: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,11,&zmin[0]); - List_Read(listt,11,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+11+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_SN; - break; - case DRAW_POST_LMGC90_DEPX: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&zmin[0]); - List_Read(listt,3,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPX; - break; - case DRAW_POST_LMGC90_DEPY: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,4,&zmin[0]); - List_Read(listt,4,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+4+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPY; - break; - case DRAW_POST_LMGC90_DEPZ: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,5,&zmin[0]); - List_Read(listt,5,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+5+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPZ; - break; - case DRAW_POST_LMGC90_DEPAV: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmin[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmax[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - List_Read(listt,i*it+4+j*9,&ztmp[1]); - List_Read(listt,i*it+5+j*9,&ztmp[2]); - ztmp[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPAV ; - break; - case DRAW_POST_LMGC90_DEPNORM: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmin[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmax[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - List_Read(listt,i*it+4+j*9,&ztmp[1]); - List_Read(listt,i*it+5+j*9,&ztmp[2]); - ztmp[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPNORM ; - break; - -/* - case DRAW_POST_LMGC90_DEPX: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&zmin[0]); - List_Read(listt,3,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPX; - break; - case DRAW_POST_LMGC90_DEPY: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,4,&zmin[0]); - List_Read(listt,4,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+4+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPY; - break; - case DRAW_POST_LMGC90_DEPZ: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,5,&zmin[0]); - List_Read(listt,5,&zmax[0]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+5+j*9,&ztmp[0]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEP; - break; - case DRAW_POST_LMGC90_DEPAV: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmin[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3; - List_Read(listt,3,&zmax[0]); - List_Read(listt,4,&zmax[1]); - List_Read(listt,5,&zmax[2]); - zmax[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3; - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - List_Read(listt,i*it+4+j*9,&ztmp[0]); - List_Read(listt,i*it+5+j*9,&ztmp[0]); - ztmp[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3; - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPAV ; - break; - case DRAW_POST_LMGC90_DEPNORM: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,3,&ztmp[0]); - List_Read(listt,4,&ztmp[1]); - List_Read(listt,5,&ztmp[2]); - zmin[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]); - List_Read(listt,3,&zmax[0]); - List_Read(listt,4,&zmax[1]); - List_Read(listt,5,&zmax[2]); - zmax[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]); - for(int i = 0; i < View->NbTP; i++){ - for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ - List_Read(listt,i*it+3+j*9,&ztmp[0]); - List_Read(listt,i*it+4+j*9,&ztmp[0]); - List_Read(listt,i*it+5+j*9,&ztmp[0]); - if(k==View->NbTP){ - k = 0; - } ztmp[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]); - if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} - if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} - } - } - state = DRAW_POST_LMGC90_DEPNORM ; - break;*/ - } //end switch - } //end if - - // matrice de changement de base, pour la rotation - a11 = cos(ROT[0])*cos(ROT[1]); a12 = -sin(ROT[0])*cos(ROT[1]); a13 = -sin(ROT[1]); - a21 = sin(ROT[0])*cos(ROT[2])-cos(ROT[0])*sin(ROT[1])*sin(ROT[2]); - a22 = cos(ROT[0])*cos(ROT[2])+sin(ROT[0])*sin(ROT[1])*sin(ROT[2]); - a23 = -cos(ROT[1])*sin(ROT[2]); - a31 = sin(ROT[0])*sin(ROT[2])+cos(ROT[0])*sin(ROT[1])*cos(ROT[2]); - a32 = cos(ROT[0])*sin(ROT[2])-sin(ROT[0])*sin(ROT[1])*cos(ROT[2]); - a33 = cos(ROT[1])*cos(ROT[2]); - - for(int i = 0; i < List_Nbr(list) ; i = i+9){ - double tmp[9]; - List_Read(list,i,&tmp[0]); //X - List_Read(list,i+1,&tmp[1]); //Y - List_Read(list,i+2,&tmp[2]); //Z - List_Read(list,i+3,&tmp[3]); - List_Read(list,i+4,&tmp[4]); - List_Read(list,i+5,&tmp[5]); - List_Read(list,i+6,&tmp[6]); - List_Read(list,i+7,&tmp[7]); - List_Read(list,i+8,&tmp[8]); - - X[0] = ((tmp[0])*a11+(tmp[1])*a12+(tmp[2])*a13)+CDG[0]+DEP[0]; - Y[0] = ((tmp[0])*a21+(tmp[1])*a22+(tmp[2])*a23)+CDG[1]+DEP[1]; - Z[0] = ((tmp[0])*a31+(tmp[1])*a32+(tmp[2])*a33)+CDG[2]+DEP[2]; - - X[1] = ((tmp[3])*a11+(tmp[4])*a12+(tmp[5])*a13)+CDG[0]+DEP[0]; - Y[1] = ((tmp[3])*a21+(tmp[4])*a22+(tmp[5])*a23)+CDG[1]+DEP[1]; - Z[1] = ((tmp[3])*a31+(tmp[4])*a32+(tmp[5])*a33)+CDG[2]+DEP[2]; - - X[2] = ((tmp[6])*a11+(tmp[7])*a12+(tmp[8])*a13)+CDG[0]+DEP[0]; - Y[2] = ((tmp[6])*a21+(tmp[7])*a22+(tmp[8])*a23)+CDG[1]+DEP[1]; - Z[2] = ((tmp[6])*a31+(tmp[7])*a32+(tmp[8])*a33)+CDG[2]+DEP[2]; - - double n[3]; - double n1[3]; - double n2[3]; - double n3[3]; - double racine; - normal3points(X[0], Y[0], Z[0], X[1], Y[1], Z[1], X[2], Y[2], Z[2], n); - //vertex 1 -/* n1[0] = X[0]+X[1]-2*(CDG[0]+DEP[0]); - n1[1] = Y[0]+Y[1]-2*(CDG[1]+DEP[1]); - n1[2] = Z[0]+Z[1]-2*(CDG[2]+DEP[2]); - racine = sqrt(n1[0]*n1[0]+n1[1]*n1[1]+n1[2]*n1[2]); - n1[0] = n1[0]/racine; n1[1] = n1[1]/racine; n1[2] = n1[2]/racine; - //vertex 2 - n2[0] = X[2]+X[1]-2*(CDG[0]+DEP[0]); - n2[1] = Y[2]+Y[1]-2*(CDG[1]+DEP[1]); - n2[2] = Z[2]+Z[1]-2*(CDG[2]+DEP[2]); - racine = sqrt(n2[0]*n2[0]+n2[1]*n2[1]+n2[2]*n2[2]); - n2[0] = n2[0]/racine; n2[1] = n2[1]/racine; n2[2] = n1[2]/racine; - //vertex 3 - n3[0] = X[0]+X[2]-2*(CDG[0]+DEP[0]); - n3[1] = Y[0]+Y[2]-2*(CDG[1]+DEP[1]); - n3[2] = Z[0]+Z[2]-2*(CDG[2]+DEP[2]); - racine = sqrt(n3[0]*n3[0]+n3[1]*n3[1]+n3[2]*n3[2]); - n3[0] = n3[0]/racine; n3[1] = n3[1]/racine; n3[2] = n3[2]/racine;*/ - switch (View->TensorType) { - case DRAW_POST_LMGC90: - PaletteContinuous(View,zmin[0],zmax[0],1); - break; - case DRAW_POST_LMGC90_TYPE: - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,(k-1)*it+9,&ztmp[0]); - PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); - break; - case DRAW_POST_LMGC90_COORD: - if(ts!=0){ - PaletteContinuous(View,zmin[0],zmax[0],VAR[0]);} - else{ - it = List_Nbr(listt)/View->NbTP; - List_Read(listt,(k-1)*it+18,&ztmp[0]); - PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); - } - break; - case DRAW_POST_LMGC90_PRES: - PaletteContinuous(View,zmin[0],zmax[0],VAR[1]); - break; - case DRAW_POST_LMGC90_SN: - PaletteContinuous(View,zmin[0],zmax[0],VAR[2]); - break; - case DRAW_POST_LMGC90_DEPX: - PaletteContinuous(View,zmin[0],zmax[0],DEP[0]); - break; - case DRAW_POST_LMGC90_DEPY: - PaletteContinuous(View,zmin[0],zmax[0],DEP[1]); - break; - case DRAW_POST_LMGC90_DEPZ: - PaletteContinuous(View,zmin[0],zmax[0],DEP[2]); - break; - case DRAW_POST_LMGC90_DEPAV: - PaletteContinuous(View,zmin[0],zmax[0],(DEP[0]+DEP[1]+DEP[2])/3); - break; - case DRAW_POST_LMGC90_DEPNORM: - PaletteContinuous(View,zmin[0],zmax[0],sqrt(DEP[0]*DEP[0]+DEP[1]*DEP[1]+DEP[2]*DEP[2])); - break; + double *VV = V + 9* nbnod * ts ; - } - glEnable(GL_LIGHTING); - glBegin(GL_TRIANGLES); - glNormal3dv(n); - glVertex3d(X[0], Y[0], Z[0]); -// glNormal3dv(n2); - glVertex3d(X[1], Y[1], Z[1]); -// glNormal3dv(n3); - glVertex3d(X[2], Y[2], Z[2]); - glEnd(); - glDisable(GL_LIGHTING); - } + DEP[0] = VV[0]; + DEP[1] = VV[1]; + DEP[2] = VV[2]; + + // List_Read(listt,3+ts*9+it,&DEP[0]); + // List_Read(listt,4+ts*9+it,&DEP[1]); + // List_Read(listt,5+ts*9+it,&DEP[2]); + + // Lecture des rotations du centre de gravité - View->TimeStep = ts; - if(k==View->NbTP){ - k = 0; + ROT[0] = VV[3]; + ROT[1] = VV[4]; + ROT[2] = VV[5]; + + /// List_Read(listt,6+ts*9+it,&ROT[0]); + // List_Read(listt,7+ts*9+it,&ROT[1]); + // List_Read(listt,8+ts*9+it,&ROT[2]); + + VAR[0] = VV[6]; + VAR[1] = VV[7]; + VAR[2] = VV[8]; + + // Lecture des valeurs des variables supplémentaires + // List_Read(listt,9+ts*9+it,&VAR[0]); + // List_Read(listt,10+ts*9+it,&VAR[1]); + // List_Read(listt,11+ts*9+it,&VAR[2]); + + // calcule les valeurs min et max d'une info 1 seule fois + if(state != View->TensorType) + { + printf("coucouc\n"); + state = View->TensorType; + switch (View->TensorType) { + case DRAW_POST_LMGC90: + // couleur uniforme + zmin[0]=1; + zmax[0]=1; + break; + case DRAW_POST_LMGC90_TYPE: + // couleur en fonction du type de grain + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,9,&zmin[0]); + List_Read(listt,9,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + List_Read(listt,i*it+9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + break; + case DRAW_POST_LMGC90_COORD: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,9,&zmin[0]); + List_Read(listt,9,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9-1; j++){ + List_Read(listt,i*it+18+j*9,&ztmp[0]); // on part pas du premier + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_PRES: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,10,&zmin[0]); + List_Read(listt,10,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+10+j*9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_SN: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,11,&zmin[0]); + List_Read(listt,11,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+11+j*9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_DEPX: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,3,&zmin[0]); + List_Read(listt,3,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+3+j*9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_DEPY: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,4,&zmin[0]); + List_Read(listt,4,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+4+j*9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_DEPZ: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,5,&zmin[0]); + List_Read(listt,5,&zmax[0]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+5+j*9,&ztmp[0]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_DEPAV: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,3,&ztmp[0]); + List_Read(listt,4,&ztmp[1]); + List_Read(listt,5,&ztmp[2]); + zmin[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; + List_Read(listt,3,&ztmp[0]); + List_Read(listt,4,&ztmp[1]); + List_Read(listt,5,&ztmp[2]); + zmax[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+3+j*9,&ztmp[0]); + List_Read(listt,i*it+4+j*9,&ztmp[1]); + List_Read(listt,i*it+5+j*9,&ztmp[2]); + ztmp[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3; + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; + case DRAW_POST_LMGC90_DEPNORM: + it = List_Nbr(listt)/View->NbTP; + List_Read(listt,3,&ztmp[0]); + List_Read(listt,4,&ztmp[1]); + List_Read(listt,5,&ztmp[2]); + zmin[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); + List_Read(listt,3,&ztmp[0]); + List_Read(listt,4,&ztmp[1]); + List_Read(listt,5,&ztmp[2]); + zmax[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); + for(int i = 0; i < View->NbTP; i++){ + for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){ + List_Read(listt,i*it+3+j*9,&ztmp[0]); + List_Read(listt,i*it+4+j*9,&ztmp[1]); + List_Read(listt,i*it+5+j*9,&ztmp[2]); + ztmp[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]); + if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];} + if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];} + } + } + break; } - - } + } + // matrice de changement de base, pour la rotation +// a11 = cos(ROT[0])*cos(ROT[1]); a12 = -sin(ROT[0])*cos(ROT[1]); a13 = -sin(ROT[1]); +// a21 = sin(ROT[0])*cos(ROT[2])-cos(ROT[0])*sin(ROT[1])*sin(ROT[2]); +// a22 = cos(ROT[0])*cos(ROT[2])+sin(ROT[0])*sin(ROT[1])*sin(ROT[2]); +// a23 = -cos(ROT[1])*sin(ROT[2]); +// a31 = sin(ROT[0])*sin(ROT[2])+cos(ROT[0])*sin(ROT[1])*cos(ROT[2]); +// a32 = cos(ROT[0])*sin(ROT[2])-sin(ROT[0])*sin(ROT[1])*cos(ROT[2]); +// a33 = cos(ROT[1])*cos(ROT[2]); + - + switch (View->TensorType) { + case DRAW_POST_LMGC90: + PaletteContinuous(View,zmin[0],zmax[0],1); + break; + case DRAW_POST_LMGC90_TYPE: + // it = List_Nbr(listt)/View->NbTP; + // List_Read(listt,V[6],&ztmp[0]); + // PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); + break; + case DRAW_POST_LMGC90_COORD: + // if(ts!=0){ + // PaletteContinuous(View,zmin[0],zmax[0],VAR[0]);} + // else{ + // it = List_Nbr(listt)/View->NbTP; + // List_Read(listt,V[6],&ztmp[0]); + // PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); + // } + break; + case DRAW_POST_LMGC90_PRES: + PaletteContinuous(View,zmin[0],zmax[0],VAR[1]); + break; + case DRAW_POST_LMGC90_SN: + PaletteContinuous(View,zmin[0],zmax[0],VAR[2]); + break; + case DRAW_POST_LMGC90_DEPX: + PaletteContinuous(View,zmin[0],zmax[0],DEP[0]); + break; + case DRAW_POST_LMGC90_DEPY: + PaletteContinuous(View,zmin[0],zmax[0],DEP[1]); + break; + case DRAW_POST_LMGC90_DEPZ: + PaletteContinuous(View,zmin[0],zmax[0],DEP[2]); + break; + case DRAW_POST_LMGC90_DEPAV: + PaletteContinuous(View,zmin[0],zmax[0],(DEP[0]+DEP[1]+DEP[2])/3); + break; + case DRAW_POST_LMGC90_DEPNORM: + PaletteContinuous(View,zmin[0],zmax[0],sqrt(DEP[0]*DEP[0]+DEP[1]*DEP[1]+DEP[2]*DEP[2])); + break; + } + + std::map<int,int> :: iterator iter = View->DisplayListsOfGrains->find ( (int)V[6] ); + + glEnable(GL_LIGHTING); + if (iter == View->DisplayListsOfGrains->end() ) + { + int listnum = glGenLists(1); + printf("new DL grain generated %d listnum %d \n",(int)V[6],listnum ); + glNewList(listnum, GL_COMPILE); + (* View->DisplayListsOfGrains )[(int)V[6]] = listnum; + for(int i = 0; i < List_Nbr(list) ; i = i+9){ + List_Read(list,i ,&X[0]); //X + List_Read(list,i+1,&Y[0]); //Y + List_Read(list,i+2,&Z[0]); //Z + List_Read(list,i+3,&X[1]); + List_Read(list,i+4,&Y[1]); + List_Read(list,i+5,&Z[1]); + List_Read(list,i+6,&X[2]); + List_Read(list,i+7,&Y[2]); + List_Read(list,i+8,&Z[2]); + double n[3]; + normal3points(X[0], Y[0], Z[0], X[1], Y[1], Z[1], X[2], Y[2], Z[2], n); + glBegin(GL_TRIANGLES); + glNormal3dv(n); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glEnd(); + } + glEndList(); + } + glPushMatrix(); + // glRotated (1,0,0, ROT[0] *180/M_PI); + // glRotated (0,1,0, ROT[1] *180/M_PI); + glTranslated(CDG[0] + DEP[0], CDG[1] + DEP[1], CDG[2] + DEP [2]); + glRotated ( ROT[0] *180/M_PI, 0,0,1); + glRotated ( ROT[1] *180/M_PI, 1,0,0); + glRotated ( ROT[2] *180/M_PI, 0,1,0); + glCallList((* View->DisplayListsOfGrains )[(int)V[6]]); + glPopMatrix(); + glDisable(GL_LIGHTING); + } + View->TimeStep = ts; } #define ARGS Post_View *View, int preproNormals, \