00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SGTriangle_H
00019 #define SGTrianlge_H
00020
00021 template<typename T>
00022 class SGTriangle {
00023 public:
00024 SGTriangle()
00025 { }
00026 SGTriangle(const SGVec3<T>& v0, const SGVec3<T>& v1, const SGVec3<T>& v2)
00027 { set(v0, v1, v2); }
00028 SGTriangle(const SGVec3<T> v[3])
00029 { set(v); }
00030
00031 void set(const SGVec3<T>& v0, const SGVec3<T>& v1, const SGVec3<T>& v2)
00032 {
00033 _v0 = v0;
00034 _d[0] = v1 - v0;
00035 _d[1] = v2 - v0;
00036 }
00037 void set(const SGVec3<T> v[3])
00038 {
00039 _v0 = v[0];
00040 _d[0] = v[1] - v[0];
00041 _d[1] = v[2] - v[0];
00042 }
00043
00044 SGVec3<T> getCenter() const
00045 { return _v0 + T(1)/T(3)*(_d[0] + _d[1]); }
00046
00047
00048 SGVec3<T> getVertex(unsigned i) const
00049 {
00050 if (0 < i)
00051 return _v0 + _d[i-1];
00052 return _v0;
00053 }
00055 SGVec3<T> getNormal() const
00056 { return normalize(cross(_d[0], _d[1])); }
00057
00058 const SGVec3<T>& getBaseVertex() const
00059 { return _v0; }
00060 void setBaseVertex(const SGVec3<T>& v)
00061 { _v0 = v; }
00062 const SGVec3<T>& getEdge(unsigned i) const
00063 { return _d[i]; }
00064 void setEdge(unsigned i, const SGVec3<T>& d)
00065 { _d[i] = d; }
00066
00067
00068 void flip()
00069 {
00070 SGVec3<T> tmp = _d[0];
00071 _d[0] = _d[1];
00072 _d[1] = tmp;
00073 }
00074
00075 SGTriangle<T> transform(const SGMatrix<T>& matrix) const
00076 {
00077 SGTriangle<T> triangle;
00078 triangle._v0 = matrix.xformPt(_v0);
00079 triangle._d[0] = matrix.xformVec(_d[0]);
00080 triangle._d[1] = matrix.xformVec(_d[1]);
00081 return triangle;
00082 }
00083
00084 private:
00089 SGVec3<T> _v0;
00090 SGVec3<T> _d[2];
00091 };
00092
00094 template<typename char_type, typename traits_type, typename T>
00095 inline
00096 std::basic_ostream<char_type, traits_type>&
00097 operator<<(std::basic_ostream<char_type, traits_type>& s,
00098 const SGTriangle<T>& triangle)
00099 {
00100 return s << "triangle: v0 = " << triangle.getVertex(0)
00101 << ", v1 = " << triangle.getVertex(1)
00102 << ", v2 = " << triangle.getVertex(2);
00103 }
00104
00105 #endif