00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TRIANGLE_HPP
00022 #define TRIANGLE_HPP
00023
00024 #include <TinyVector.hpp>
00025 #include <TinyMatrix.hpp>
00026
00027 #include <SurfElem.hpp>
00028
00029 #include <Edge.hpp>
00030
00039 class Triangle
00040 : public SurfElem
00041 {
00042 private:
00043
00044 void __computeVolume()
00045 {
00046 const TinyVector<3>& X0 = *(__vertices[0]);
00047 const TinyVector<3>& X1 = *(__vertices[1]);
00048 const TinyVector<3>& X2 = *(__vertices[2]);
00049
00050 const TinyVector<3> A(X1-X0);
00051 const TinyVector<3> B(X2-X0);
00052
00053 __volume = 0.5*Norm(A^B);
00054 }
00055
00056 public:
00057 enum {
00058 NumberOfVertices = 3,
00059 NumberOfFaces = 3,
00060 NumberOfEdges = 3
00061 };
00062
00063 typedef Edge FaceType;
00064
00065 static const size_t faces[NumberOfEdges][FaceType::NumberOfVertices];
00066 static const size_t edges[NumberOfEdges][Edge::NumberOfVertices];
00067
00078 inline void getBarycentricCoordinates(const TinyVector<2, real_t>& X,
00079 TinyVector<3, real_t>& lambda) const
00080 {
00081 TinyVector<3, real_t> X2;
00082 X2[0] = X[0];
00083 X2[1] = X[1];
00084 X2[2] = 1;
00085
00086 TinyMatrix<3, 3, real_t> M = 0;
00087 for (size_t i=0; i<3; ++i) {
00088 const Vertex& V = (*this)(i);
00089 for (size_t j=0; j<2; ++j) {
00090 M(j, i) = V[j];
00091 }
00092 }
00093
00094 for (size_t i=0; i<3; ++i) {
00095 M(2,i) = 1;
00096 }
00097
00098 lambda = X2/M;
00099 }
00100
00106 size_t numberOfVertices() const
00107 {
00108 return NumberOfVertices;
00109 }
00110
00116 Cell::Type type() const
00117 {
00118 return Cell::triangle3d;
00119 }
00120
00127 const TinyVector<3,real_t> normal() const
00128 {
00129 const TinyVector<3>& v0 = *(__vertices[0]);
00130 const TinyVector<3>& v1 = *(__vertices[1]);
00131 const TinyVector<3>& v2 = *(__vertices[2]);
00132
00133 const TinyVector<3> A(v1-v0);
00134 const TinyVector<3> B(v2-v0);
00135 TinyVector<3> N(A^B);
00136 const real_t n = Norm(N);
00137 N/=n;
00138 return N;
00139 }
00140
00148 Edge edge(size_t i) const
00149 {
00150 ASSERT(i<NumberOfVertices);
00151 return Edge(*__vertices[(i+1)%3], *__vertices[(i+2)%3]);
00152 }
00153
00159 Triangle()
00160 : SurfElem(NumberOfVertices)
00161 {
00162 ;
00163 }
00164
00172 Triangle(const TinyVector<NumberOfVertices, Vertex*>& vertices,
00173 const size_t& reference=0)
00174 : SurfElem(NumberOfVertices, reference)
00175 {
00176 for (size_t i=0; i<NumberOfVertices; ++i) {
00177 __vertices[i] = vertices[i];
00178 }
00179
00181 this->__computeVolume();
00182 }
00183
00193 Triangle(const Vertex& v0,
00194 const Vertex& v1,
00195 const Vertex& v2,
00196 const size_t& reference=0)
00197 : SurfElem(NumberOfVertices, reference)
00198 {
00199 __vertices[0] = (Vertex*)&v0;
00200 __vertices[1] = (Vertex*)&v1;
00201 __vertices[2] = (Vertex*)&v2;
00202
00204 this->__computeVolume();
00205 }
00206
00213 Triangle(const Triangle& st)
00214 : SurfElem(st)
00215 {
00216 ;
00217 }
00218
00224 ~Triangle()
00225 {
00226 ;
00227 }
00228
00229 };
00230
00231 #endif // TRIANGLE_HPP
00232