00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef QUADRANGLE_HPP
00023 #define QUADRANGLE_HPP
00024
00025 #include <cmath>
00026 #include <SurfElem.hpp>
00027
00028 #include <TinyVector.hpp>
00029 #include <Edge.hpp>
00030
00039 class Quadrangle
00040 : public SurfElem
00041 {
00042 private:
00043
00044 void __computeVolume()
00045 {
00046 const TinyVector<3>& v0 = *(__vertices[0]);
00047 const TinyVector<3>& v1 = *(__vertices[1]);
00048 const TinyVector<3>& v2 = *(__vertices[2]);
00049 const TinyVector<3>& v3 = *(__vertices[3]);
00050
00051 const TinyVector<3> A(v1-v0);
00052 const TinyVector<3> B(v3-v0);
00053
00054 const TinyVector<3> C(v1-v2);
00055 const TinyVector<3> D(v3-v2);
00056
00057 __volume = 0.5*(Norm(A^B)+Norm(C^D));
00058 }
00059
00060 public:
00061 enum {
00062 NumberOfVertices = 4,
00063 NumberOfFaces = 4,
00064 NumberOfEdges = 4
00065 };
00066
00067 typedef Edge FaceType;
00068
00069 static const size_t faces[NumberOfEdges][FaceType::NumberOfVertices];
00070 static const size_t edges[NumberOfEdges][Edge::NumberOfVertices];
00071
00077 const TinyVector<3, real_t> normal() const
00078 {
00079
00080
00081
00082 const TinyVector<3>& v0 = *(__vertices[0]);
00083 const TinyVector<3>& v1 = *(__vertices[1]);
00084 const TinyVector<3>& v2 = *(__vertices[2]);
00085 const TinyVector<3>& v3 = *(__vertices[3]);
00086
00087 const TinyVector<3> A(v2-v0);
00088 const TinyVector<3> B(v3-v1);
00089 TinyVector<3> N(A^B);
00090 const real_t n = Norm(N);
00091 N/=n;
00092 return N;
00093 }
00094
00101 size_t numberOfVertices() const
00102 {
00103 return NumberOfVertices;
00104 }
00105
00111 virtual Cell::Type type() const
00112 {
00113 return Cell::quadrangle3d;
00114 }
00115
00121 Quadrangle()
00122 : SurfElem(NumberOfVertices)
00123 {
00124 __volume = 0.;
00125 }
00126
00137 Quadrangle(const Vertex& V0,
00138 const Vertex& V1,
00139 const Vertex& V2,
00140 const Vertex& V3,
00141 const size_t reference=0)
00142 : SurfElem(NumberOfVertices, reference)
00143 {
00144 __vertices[0] = (Vertex*)&V0;
00145 __vertices[1] = (Vertex*)&V1;
00146 __vertices[2] = (Vertex*)&V2;
00147 __vertices[3] = (Vertex*)&V3;
00148
00149 this->__computeVolume();
00150 }
00151
00159 Quadrangle(const TinyVector<NumberOfVertices, Vertex*>& vertices,
00160 const size_t reference=0)
00161 : SurfElem(NumberOfVertices, reference)
00162 {
00163 for (size_t i=0; i<NumberOfVertices; ++i) {
00164 __vertices[i] = vertices[i];
00165 }
00166
00167 this->__computeVolume();
00168 }
00169
00170
00177 Quadrangle(const Quadrangle& q)
00178 : SurfElem(q)
00179 {
00180 ;
00181 }
00182
00187 ~Quadrangle()
00188 {
00189 ;
00190 }
00191 };
00192
00193 #endif // QUADRANGLE_HPP
00194