diff --git a/Plugin/Warp.cpp b/Plugin/Warp.cpp index b8c241298a9d198fc33314fa149f75d802592c85..3e75bfff04c5ea7ea1dacf40ba9ab2bba0a85347 100644 --- a/Plugin/Warp.cpp +++ b/Plugin/Warp.cpp @@ -1,4 +1,4 @@ -// $Id: Warp.cpp,v 1.9 2007-09-11 14:01:55 geuzaine Exp $ +// $Id: Warp.cpp,v 1.10 2008-01-09 12:32:22 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -26,6 +26,7 @@ StringXNumber WarpOptions_Number[] = { {GMSH_FULLRC, "Factor", NULL, 1.}, {GMSH_FULLRC, "TimeStep", NULL, 0.}, {GMSH_FULLRC, "SmoothingAngle", NULL, 180.}, + {GMSH_FULLRC, "Explode", NULL, 1.}, {GMSH_FULLRC, "dView", NULL, -1.}, {GMSH_FULLRC, "iView", NULL, -1.} }; @@ -103,7 +104,7 @@ static void addNormals(List_T *listElm, int nbElm, int nbNod, static void warpList(List_T *iList, int iNbElm, List_T *dList, int dNbElm, int nbNod, double factor, int TimeStep, - int nbComp, smooth_normals *normals) + int nbComp, smooth_normals *normals, double explode) { if(!iNbElm) return; @@ -158,15 +159,31 @@ static void warpList(List_T *iList, int iNbElm, z[k] += factor * val[3 * nbNod * TimeStep + 3 * k + 2]; } } + + if(explode != 1.){ + double cg[3] = {0., 0., 0.}; + for(int k = 0; k < nbNod; k++) { + cg[0] += x[k]; + cg[1] += y[k]; + cg[2] += z[k]; + } + for(int k = 0; k < 3; k++) cg[k] /= (double)nbNod; + for(int k = 0; k < nbNod; k++) { + x[k] = cg[0] + explode * (x[k] - cg[0]); + y[k] = cg[1] + explode * (y[k] - cg[1]); + z[k] = cg[2] + explode * (z[k] - cg[2]); + } + } + } } static void warp(PViewDataList *data1, PViewDataList *data2, double factor, - int ts, double tol) + int ts, double tol, double e) { smooth_normals *nn = 0; - if(WarpOptions_Number[3].def < 0){ + if(WarpOptions_Number[4].def < 0){ nn = new smooth_normals(tol); addNormals(data1->ST, data1->NbST, 3, nn); addNormals(data1->VT, data1->NbVT, 3, nn); @@ -176,32 +193,32 @@ static void warp(PViewDataList *data1, PViewDataList *data2, double factor, addNormals(data1->TQ, data1->NbTQ, 4, nn); } - warpList(data1->SP, data1->NbSP, data2->VP, data2->NbVP, 1, factor, ts, 1, nn); - warpList(data1->SL, data1->NbSL, data2->VL, data2->NbVL, 2, factor, ts, 1, nn); - warpList(data1->ST, data1->NbST, data2->VT, data2->NbVT, 3, factor, ts, 1, nn); - warpList(data1->SQ, data1->NbSQ, data2->VQ, data2->NbVQ, 4, factor, ts, 1, nn); - warpList(data1->SS, data1->NbSS, data2->VS, data2->NbVS, 4, factor, ts, 1, nn); - warpList(data1->SH, data1->NbSH, data2->VH, data2->NbVH, 8, factor, ts, 1, nn); - warpList(data1->SI, data1->NbSI, data2->VI, data2->NbVI, 6, factor, ts, 1, nn); - warpList(data1->SY, data1->NbSY, data2->VY, data2->NbVY, 5, factor, ts, 1, nn); + warpList(data1->SP, data1->NbSP, data2->VP, data2->NbVP, 1, factor, ts, 1, nn, e); + warpList(data1->SL, data1->NbSL, data2->VL, data2->NbVL, 2, factor, ts, 1, nn, e); + warpList(data1->ST, data1->NbST, data2->VT, data2->NbVT, 3, factor, ts, 1, nn, e); + warpList(data1->SQ, data1->NbSQ, data2->VQ, data2->NbVQ, 4, factor, ts, 1, nn, e); + warpList(data1->SS, data1->NbSS, data2->VS, data2->NbVS, 4, factor, ts, 1, nn, e); + warpList(data1->SH, data1->NbSH, data2->VH, data2->NbVH, 8, factor, ts, 1, nn, e); + warpList(data1->SI, data1->NbSI, data2->VI, data2->NbVI, 6, factor, ts, 1, nn, e); + warpList(data1->SY, data1->NbSY, data2->VY, data2->NbVY, 5, factor, ts, 1, nn, e); - warpList(data1->VP, data1->NbVP, data2->VP, data2->NbVP, 1, factor, ts, 3, nn); - warpList(data1->VL, data1->NbVL, data2->VL, data2->NbVL, 2, factor, ts, 3, nn); - warpList(data1->VT, data1->NbVT, data2->VT, data2->NbVT, 3, factor, ts, 3, nn); - warpList(data1->VQ, data1->NbVQ, data2->VQ, data2->NbVQ, 4, factor, ts, 3, nn); - warpList(data1->VS, data1->NbVS, data2->VS, data2->NbVS, 4, factor, ts, 3, nn); - warpList(data1->VH, data1->NbVH, data2->VH, data2->NbVH, 8, factor, ts, 3, nn); - warpList(data1->VI, data1->NbVI, data2->VI, data2->NbVI, 6, factor, ts, 3, nn); - warpList(data1->VY, data1->NbVY, data2->VY, data2->NbVY, 5, factor, ts, 3, nn); + warpList(data1->VP, data1->NbVP, data2->VP, data2->NbVP, 1, factor, ts, 3, nn, e); + warpList(data1->VL, data1->NbVL, data2->VL, data2->NbVL, 2, factor, ts, 3, nn, e); + warpList(data1->VT, data1->NbVT, data2->VT, data2->NbVT, 3, factor, ts, 3, nn, e); + warpList(data1->VQ, data1->NbVQ, data2->VQ, data2->NbVQ, 4, factor, ts, 3, nn, e); + warpList(data1->VS, data1->NbVS, data2->VS, data2->NbVS, 4, factor, ts, 3, nn, e); + warpList(data1->VH, data1->NbVH, data2->VH, data2->NbVH, 8, factor, ts, 3, nn, e); + warpList(data1->VI, data1->NbVI, data2->VI, data2->NbVI, 6, factor, ts, 3, nn, e); + warpList(data1->VY, data1->NbVY, data2->VY, data2->NbVY, 5, factor, ts, 3, nn, e); - warpList(data1->TP, data1->NbTP, data2->VP, data2->NbVP, 1, factor, ts, 9, nn); - warpList(data1->TL, data1->NbTL, data2->VL, data2->NbVL, 2, factor, ts, 9, nn); - warpList(data1->TT, data1->NbTT, data2->VT, data2->NbVT, 3, factor, ts, 9, nn); - warpList(data1->TQ, data1->NbTQ, data2->VQ, data2->NbVQ, 4, factor, ts, 9, nn); - warpList(data1->TS, data1->NbTS, data2->VS, data2->NbVS, 4, factor, ts, 9, nn); - warpList(data1->TH, data1->NbTH, data2->VH, data2->NbVH, 8, factor, ts, 9, nn); - warpList(data1->TI, data1->NbTI, data2->VI, data2->NbVI, 6, factor, ts, 9, nn); - warpList(data1->TY, data1->NbTY, data2->VY, data2->NbVY, 5, factor, ts, 9, nn); + warpList(data1->TP, data1->NbTP, data2->VP, data2->NbVP, 1, factor, ts, 9, nn, e); + warpList(data1->TL, data1->NbTL, data2->VL, data2->NbVL, 2, factor, ts, 9, nn, e); + warpList(data1->TT, data1->NbTT, data2->VT, data2->NbVT, 3, factor, ts, 9, nn, e); + warpList(data1->TQ, data1->NbTQ, data2->VQ, data2->NbVQ, 4, factor, ts, 9, nn, e); + warpList(data1->TS, data1->NbTS, data2->VS, data2->NbVS, 4, factor, ts, 9, nn, e); + warpList(data1->TH, data1->NbTH, data2->VH, data2->NbVH, 8, factor, ts, 9, nn, e); + warpList(data1->TI, data1->NbTI, data2->VI, data2->NbVI, 6, factor, ts, 9, nn, e); + warpList(data1->TY, data1->NbTY, data2->VY, data2->NbVY, 5, factor, ts, 9, nn, e); if(nn) delete nn; } @@ -211,8 +228,9 @@ PView *GMSH_WarpPlugin::execute(PView *v) double factor = WarpOptions_Number[0].def; int TimeStep = (int)WarpOptions_Number[1].def; double AngleTol = WarpOptions_Number[2].def; - int dView = (int)WarpOptions_Number[3].def; - int iView = (int)WarpOptions_Number[4].def; + double Explode = WarpOptions_Number[3].def; + int dView = (int)WarpOptions_Number[4].def; + int iView = (int)WarpOptions_Number[5].def; PView *v1 = getView(iView, v); if(!v1) return v; @@ -234,7 +252,7 @@ PView *GMSH_WarpPlugin::execute(PView *v) return v; } - warp(data1, data2, factor, TimeStep, AngleTol); + warp(data1, data2, factor, TimeStep, AngleTol, Explode); data1->finalize(); v1->setChanged(true);