diff --git a/contrib/FourierModel/FM_Edge.h b/contrib/FourierModel/FM_Edge.h index 203756644da322a357550f44812bbb41f8c56b39..5b411e2e5f21bb00eda1689ecbf6c287f539c4d2 100644 --- a/contrib/FourierModel/FM_Edge.h +++ b/contrib/FourierModel/FM_Edge.h @@ -30,6 +30,12 @@ class FM_Edge { inline void SetEndPoint(double x, double y, double z) { _EP = new FM_Vertex(x,y,z); } + inline bool IsPhysical() { + if (_curve) + return true; + else + false; + } void F(double t, double &x, double &y, double &z); bool Inverse(double x,double y,double z,double &t); diff --git a/contrib/FourierModel/FM_Face.cpp b/contrib/FourierModel/FM_Face.cpp index e38e4b3760f749b2c8f88cdb80cf5ac1dc735658..036756168fb5dc4d9e86b45acee69b21e61addb6 100644 --- a/contrib/FourierModel/FM_Face.cpp +++ b/contrib/FourierModel/FM_Face.cpp @@ -2,7 +2,7 @@ #include "Message.h" void FM_Face::F(double u, double v, double &x, double &y, double &z) { - if (_edge.size() == 0) { + if (_edge.size() == 4) { _patch->F(u,v,x,y,z); } else if (_edge.size() == 1) { @@ -15,17 +15,23 @@ void FM_Face::F(double u, double v, double &x, double &y, double &z) { _patch->F(u*R,v,x,y,z); } else if (_edge.size() == 4) { - double xD, yD, zD, uD, vD; - double xU, yU, zU, uU, vU; - _edge[0]->F(v,xD,yD,zD); - _patch->Inverse(xD,yD,zD,uD,vD); - _edge[2]->F(1.-v,xU,yU,zU); - _patch->Inverse(xU,yU,zU,uU,vU); - - double U = uD + u * (uU - uD); - double V = vD; - - _patch->F(U,V,x,y,z); + bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) && + (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical()); + if (isPhysical) + _patch->F(u,v,x,y,z); + else { + double xD, yD, zD, uD, vD; + double xU, yU, zU, uU, vU; + _edge[0]->F(v,xD,yD,zD); + _patch->Inverse(xD,yD,zD,uD,vD); + _edge[2]->F(1.-v,xU,yU,zU); + _patch->Inverse(xU,yU,zU,uU,vU); + + double U = uD + u * (uU - uD); + double V = vD; + + _patch->F(U,V,x,y,z); + } } else { Msg::Info("Such a face not implemented yet"); @@ -35,10 +41,7 @@ void FM_Face::F(double u, double v, double &x, double &y, double &z) { bool FM_Face::Inverse(double x,double y,double z,double &u, double &v) { - if (_edge.size() == 0) { - _patch->Inverse(x,y,z,u,v); - } - else if (_edge.size() == 1) { + if (_edge.size() == 1) { double n[3], t[3], s[3], c[3], r[3]; _patch->F(0.,0.,c[0],c[1],c[2]); for (int i=0;i<3;i++) { @@ -70,22 +73,28 @@ bool FM_Face::Inverse(double x,double y,double z,double &u, double &v) u = norm / R; } else if (_edge.size() == 4) { - double U, V; - _patch->Inverse(x,y,z,U,V); - double u0,v0,u1,v1; - double xD, yD, zD, uD, vD; - double xU, yU, zU, uU, vU; - _edge[0]->F(0,xD,yD,zD); - _patch->Inverse(xD,yD,zD,u0,v0); - _edge[0]->F(1,xD,yD,zD); - _patch->Inverse(xD,yD,zD,u1,v1); - v = (V-v0)/(v1-v0); - _edge[0]->F(v,xD,yD,zD); - _patch->Inverse(xD,yD,zD,uD,vD); - _edge[2]->F(1.-v,xU,yU,zU); - _patch->Inverse(xU,yU,zU,uU,vU); - - u = (U - uD) / (uU - uD); + bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) && + (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical()); + if (isPhysical) + _patch->Inverse(x,y,z,u,v); + else { + double U, V; + _patch->Inverse(x,y,z,U,V); + double u0,v0,u1,v1; + double xD, yD, zD, uD, vD; + double xU, yU, zU, uU, vU; + _edge[0]->F(0,xD,yD,zD); + _patch->Inverse(xD,yD,zD,u0,v0); + _edge[0]->F(1,xD,yD,zD); + _patch->Inverse(xD,yD,zD,u1,v1); + v = (V-v0)/(v1-v0); + _edge[0]->F(v,xD,yD,zD); + _patch->Inverse(xD,yD,zD,uD,vD); + _edge[2]->F(1.-v,xU,yU,zU); + _patch->Inverse(xU,yU,zU,uU,vU); + + u = (U - uD) / (uU - uD); + } } else { Msg::Info("Such a face not implemented yet");