Skip to content
Snippets Groups Projects
Commit 14dcca58 authored by Amaury Johnen's avatar Amaury Johnen
Browse files

quad faces split into 4 triangles instead of 2 for visualization

parent dfe6a90d
No related branches found
No related tags found
No related merge requests found
...@@ -77,6 +77,19 @@ void MElement::_getEdgeRep(MVertex *v0, MVertex *v1, ...@@ -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, void MElement::_getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
double *x, double *y, double *z, SVector3 *n) double *x, double *y, double *z, SVector3 *n)
{ {
......
...@@ -43,6 +43,8 @@ class MElement ...@@ -43,6 +43,8 @@ class MElement
int faceIndex=-1); int faceIndex=-1);
void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2, void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
double *x, double *y, double *z, SVector3 *n); 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 : public :
MElement(int num=0, int part=0); MElement(int num=0, int part=0);
virtual ~MElement(){} virtual ~MElement(){}
......
...@@ -87,18 +87,29 @@ class MHexahedron : public MElement { ...@@ -87,18 +87,29 @@ class MHexahedron : public MElement {
virtual double getInnerRadius(); virtual double getInnerRadius();
virtual double angleShapeMeasure(); virtual double angleShapeMeasure();
virtual void getFaceInfo(const MFace & face, int &ithFace, int &sign, int &rot) const; 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) virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
{ {
static const int f[12][3] = { // static const int f[12][3] = {
{0, 3, 2}, {0, 2, 1}, // {0, 3, 2}, {0, 2, 1},
{0, 1, 5}, {0, 5, 4}, // {0, 1, 5}, {0, 5, 4},
{0, 4, 7}, {0, 7, 3}, // {0, 4, 7}, {0, 7, 3},
{1, 2, 6}, {1, 6, 5}, // {1, 2, 6}, {1, 6, 5},
{2, 3, 7}, {2, 7, 6}, // {2, 3, 7}, {2, 7, 6},
{4, 5, 6}, {4, 6, 7} // {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 virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
{ {
......
...@@ -92,17 +92,31 @@ class MPrism : public MElement { ...@@ -92,17 +92,31 @@ class MPrism : public MElement {
_v[faces_prism(num, 2)], _v[faces_prism(num, 2)],
_v[faces_prism(num, 3)]); _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) virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
{ {
static const int f[8][3] = { // static const int f[8][3] = {
{0, 2, 1}, // {0, 2, 1},
{3, 4, 5}, // {3, 4, 5},
{0, 1, 4}, {0, 4, 3}, // {0, 1, 4}, {0, 4, 3},
{0, 3, 5}, {0, 5, 2}, // {0, 3, 5}, {0, 5, 2},
{1, 2, 5}, {1, 5, 4} // {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 virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
{ {
......
...@@ -97,7 +97,7 @@ class MPyramid : public MElement { ...@@ -97,7 +97,7 @@ class MPyramid : public MElement {
else else
return MFace(_v[0], _v[3], _v[2], _v[1]); 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, virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z,
SVector3 *n) SVector3 *n)
{ {
...@@ -110,6 +110,20 @@ class MPyramid : public MElement { ...@@ -110,6 +110,20 @@ class MPyramid : public MElement {
}; };
_getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]), _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]),
x, y, z, n); 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 virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
{ {
......
...@@ -91,13 +91,20 @@ class MQuadrangle : public MElement { ...@@ -91,13 +91,20 @@ class MQuadrangle : public MElement {
} }
virtual int getNumFaces(){ return 1; } virtual int getNumFaces(){ return 1; }
virtual MFace getFace(int num){ return MFace(_v[0], _v[1], _v[2], _v[3]); } 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) virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
{ {
static const int f[2][3] = { // static const int f[2][3] = {
{0, 1, 2}, {0, 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 virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment