diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 4914775dd8b4b36cbc797055e4c4ae0f1564349f..50ffe11dad6d8854ee0539493995130e96efbd85 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -77,6 +77,19 @@ void MElement::_getEdgeRep(MVertex *v0, MVertex *v1, } } +void MElement::_getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3, + double *x, double *y, double *z, SVector3 *n) +{ + x[0] = v0->x(); x[1] = v1->x(); x[2] = (x[0]+x[1]+v2->x()+v3->x())/4; + y[0] = v0->y(); y[1] = v1->y(); y[2] = (y[0]+y[1]+v2->y()+v3->y())/4; + z[0] = v0->z(); z[1] = v1->z(); z[2] = (z[0]+z[1]+v2->z()+v3->z())/4;; + SVector3 t1(x[1] - x[0], y[1] - y[0], z[1] - z[0]); + SVector3 t2(x[2] - x[0], y[2] - y[0], z[2] - z[0]); + SVector3 normal = crossprod(t1, t2); + normal.normalize(); + for(int i = 0; i < 3; i++) n[i] = normal; +} + void MElement::_getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2, double *x, double *y, double *z, SVector3 *n) { diff --git a/Geo/MElement.h b/Geo/MElement.h index cf86a181b4c360fc157a8623725ac20c5c056599..fc841446370c4d140368c37c4e70bfb0e30cafff 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -43,6 +43,8 @@ class MElement int faceIndex=-1); void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2, double *x, double *y, double *z, SVector3 *n); + void _getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3, + double *x, double *y, double *z, SVector3 *n); public : MElement(int num=0, int part=0); virtual ~MElement(){} diff --git a/Geo/MHexahedron.h b/Geo/MHexahedron.h index ba874743441510d1c514e54555af6fd464da08d6..1ed4c5b5f87105f068003d7702dab1ca47d3cd5d 100644 --- a/Geo/MHexahedron.h +++ b/Geo/MHexahedron.h @@ -87,18 +87,29 @@ class MHexahedron : public MElement { virtual double getInnerRadius(); virtual double angleShapeMeasure(); virtual void getFaceInfo(const MFace & face, int &ithFace, int &sign, int &rot) const; - virtual int getNumFacesRep(bool curved){ return 12; } + virtual int getNumFacesRep(bool curved){ return 24; } virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n) { - static const int f[12][3] = { - {0, 3, 2}, {0, 2, 1}, - {0, 1, 5}, {0, 5, 4}, - {0, 4, 7}, {0, 7, 3}, - {1, 2, 6}, {1, 6, 5}, - {2, 3, 7}, {2, 7, 6}, - {4, 5, 6}, {4, 6, 7} +// static const int f[12][3] = { +// {0, 3, 2}, {0, 2, 1}, +// {0, 1, 5}, {0, 5, 4}, +// {0, 4, 7}, {0, 7, 3}, +// {1, 2, 6}, {1, 6, 5}, +// {2, 3, 7}, {2, 7, 6}, +// {4, 5, 6}, {4, 6, 7} +// }; +// _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + static const int f[24][4] = { + {0, 3, 2, 1}, {3, 2, 1, 0}, {2, 1, 0, 3}, {1, 0, 3, 2}, + {0, 1, 5, 4}, {1, 5, 4, 0}, {5, 4, 0, 1}, {4, 0, 1, 5}, + {0, 4, 7, 3}, {4, 7, 3, 0}, {7, 3, 0, 4}, {3, 0, 4, 7}, + {1, 2, 6, 5}, {2, 6, 5, 1}, {6, 5, 1, 2}, {5, 1, 2, 6}, + {2, 3, 7, 6}, {3, 7, 6, 2}, {7, 6, 2, 3}, {6, 2, 3, 7}, + {4, 5, 6, 7}, {5, 6, 7, 4}, {6, 7, 4, 5}, {7, 4, 5, 6} }; - _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]), + getVertex(f[num][2]), getVertex(f[num][3]), + x, y, z, n); } virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const { diff --git a/Geo/MPrism.h b/Geo/MPrism.h index bfbde23d5f91855236ff49859fce46ff2cf96a9c..428a438b2f7a66130f25ea590453f95f8eb5c3d0 100644 --- a/Geo/MPrism.h +++ b/Geo/MPrism.h @@ -92,17 +92,31 @@ class MPrism : public MElement { _v[faces_prism(num, 2)], _v[faces_prism(num, 3)]); } - virtual int getNumFacesRep(bool curved){ return 8; } + virtual int getNumFacesRep(bool curved){ return 14; } virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n) { - static const int f[8][3] = { - {0, 2, 1}, - {3, 4, 5}, - {0, 1, 4}, {0, 4, 3}, - {0, 3, 5}, {0, 5, 2}, - {1, 2, 5}, {1, 5, 4} +// static const int f[8][3] = { +// {0, 2, 1}, +// {3, 4, 5}, +// {0, 1, 4}, {0, 4, 3}, +// {0, 3, 5}, {0, 5, 2}, +// {1, 2, 5}, {1, 5, 4} +// }; +// _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + static const int f[14][4] = { + {0, 2, 1, -1}, + {3, 4, 5, -1}, + {0, 1, 4, 3}, {1, 4, 3, 0}, {4, 3, 0, 1}, {3, 0, 1, 4}, + {1, 2, 5, 4}, {2, 5, 4, 1}, {5, 4, 1, 2}, {4, 1, 2, 5}, + {2, 0, 3, 5}, {0, 3, 5, 2}, {3, 5, 2, 0}, {5, 2, 0, 3} }; - _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + if (num < 2) + _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), + x, y, z, n); + else + _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]), + getVertex(f[num][2]), getVertex(f[num][3]), + x, y, z, n); } virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const { diff --git a/Geo/MPyramid.h b/Geo/MPyramid.h index 3bfe80a329da5966e1172e7cc5ea4de2663a76f0..9bf4c6ac6605f8c3c28291d4b04c379a61ab654b 100644 --- a/Geo/MPyramid.h +++ b/Geo/MPyramid.h @@ -97,7 +97,7 @@ class MPyramid : public MElement { else return MFace(_v[0], _v[3], _v[2], _v[1]); } - virtual int getNumFacesRep(bool curved){ return 6; } + virtual int getNumFacesRep(bool curved){ return 8; } virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n) { @@ -110,6 +110,20 @@ class MPyramid : public MElement { }; _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), x, y, z, n); +// static const int f[8][4] = { +// {0, 1, 4, -1}, +// {1, 2, 4, -1}, +// {2, 3, 4, -1}, +// {3, 0, 4, -1}, +// {0, 3, 2, 1}, {3, 2, 1, 0}, {2, 1, 0, 3}, {1, 0, 3, 2} +// }; +// if (num < 4) +// _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), +// x, y, z, n); +// else +// _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]), +// getVertex(f[num][2]), getVertex(f[num][3]), +// x, y, z, n); } virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const { diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h index 15cb09446efdc2fdf675c7d849e84a9403fadfc1..da5f351de0b325d1970196f826fce93ef9b812e9 100644 --- a/Geo/MQuadrangle.h +++ b/Geo/MQuadrangle.h @@ -91,13 +91,20 @@ class MQuadrangle : public MElement { } virtual int getNumFaces(){ return 1; } virtual MFace getFace(int num){ return MFace(_v[0], _v[1], _v[2], _v[3]); } - virtual int getNumFacesRep(bool curved){ return 2; } + virtual int getNumFacesRep(bool curved){ return 4; } virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n) { - static const int f[2][3] = { - {0, 1, 2}, {0, 2, 3} +// static const int f[2][3] = { +// {0, 1, 2}, {0, 2, 3} +// }; +// _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + + static const int f[4][4] = { + {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2} }; - _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n); + _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]), + getVertex(f[num][2]), getVertex(f[num][3]), + x, y, z, n); } virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const {