2 #ifndef HACD_VECTOR_INL
\r
3 #define HACD_VECTOR_INL
\r
6 template <typename T>
\r
7 inline Vec3<T> operator*(T lhs, const Vec3<T> & rhs)
\r
9 return Vec3<T>(lhs * rhs.X(), lhs * rhs.Y(), lhs * rhs.Z());
\r
11 template <typename T>
\r
12 inline T & Vec3<T>::X()
\r
16 template <typename T>
\r
17 inline T & Vec3<T>::Y()
\r
21 template <typename T>
\r
22 inline T & Vec3<T>::Z()
\r
26 template <typename T>
\r
27 inline const T & Vec3<T>::X() const
\r
31 template <typename T>
\r
32 inline const T & Vec3<T>::Y() const
\r
36 template <typename T>
\r
37 inline const T & Vec3<T>::Z() const
\r
41 template <typename T>
\r
42 inline void Vec3<T>::Normalize()
\r
44 T n = sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]);
\r
45 if (n != 0.0) (*this) /= n;
\r
47 template <typename T>
\r
48 inline T Vec3<T>::GetNorm() const
\r
50 return sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]);
\r
52 template <typename T>
\r
53 inline void Vec3<T>::operator= (const Vec3 & rhs)
\r
55 this->m_data[0] = rhs.m_data[0];
\r
56 this->m_data[1] = rhs.m_data[1];
\r
57 this->m_data[2] = rhs.m_data[2];
\r
59 template <typename T>
\r
60 inline void Vec3<T>::operator+=(const Vec3 & rhs)
\r
62 this->m_data[0] += rhs.m_data[0];
\r
63 this->m_data[1] += rhs.m_data[1];
\r
64 this->m_data[2] += rhs.m_data[2];
\r
66 template <typename T>
\r
67 inline void Vec3<T>::operator-=(const Vec3 & rhs)
\r
69 this->m_data[0] -= rhs.m_data[0];
\r
70 this->m_data[1] -= rhs.m_data[1];
\r
71 this->m_data[2] -= rhs.m_data[2];
\r
73 template <typename T>
\r
74 inline void Vec3<T>::operator-=(T a)
\r
76 this->m_data[0] -= a;
\r
77 this->m_data[1] -= a;
\r
78 this->m_data[2] -= a;
\r
80 template <typename T>
\r
81 inline void Vec3<T>::operator+=(T a)
\r
83 this->m_data[0] += a;
\r
84 this->m_data[1] += a;
\r
85 this->m_data[2] += a;
\r
87 template <typename T>
\r
88 inline void Vec3<T>::operator/=(T a)
\r
90 this->m_data[0] /= a;
\r
91 this->m_data[1] /= a;
\r
92 this->m_data[2] /= a;
\r
94 template <typename T>
\r
95 inline void Vec3<T>::operator*=(T a)
\r
97 this->m_data[0] *= a;
\r
98 this->m_data[1] *= a;
\r
99 this->m_data[2] *= a;
\r
101 template <typename T>
\r
102 inline Vec3<T> Vec3<T>::operator^ (const Vec3<T> & rhs) const
\r
104 return Vec3<T>(m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1],
\r
105 m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2],
\r
106 m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0]);
\r
108 template <typename T>
\r
109 inline T Vec3<T>::operator*(const Vec3<T> & rhs) const
\r
111 return (m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2]);
\r
113 template <typename T>
\r
114 inline Vec3<T> Vec3<T>::operator+(const Vec3<T> & rhs) const
\r
116 return Vec3<T>(m_data[0] + rhs.m_data[0],m_data[1] + rhs.m_data[1],m_data[2] + rhs.m_data[2]);
\r
118 template <typename T>
\r
119 inline Vec3<T> Vec3<T>::operator-(const Vec3<T> & rhs) const
\r
121 return Vec3<T>(m_data[0] - rhs.m_data[0],m_data[1] - rhs.m_data[1],m_data[2] - rhs.m_data[2]) ;
\r
123 template <typename T>
\r
124 inline Vec3<T> Vec3<T>::operator-() const
\r
126 return Vec3<T>(-m_data[0],-m_data[1],-m_data[2]) ;
\r
129 template <typename T>
\r
130 inline Vec3<T> Vec3<T>::operator*(T rhs) const
\r
132 return Vec3<T>(rhs * this->m_data[0], rhs * this->m_data[1], rhs * this->m_data[2]);
\r
134 template <typename T>
\r
135 inline Vec3<T> Vec3<T>::operator/ (T rhs) const
\r
137 return Vec3<T>(m_data[0] / rhs, m_data[1] / rhs, m_data[2] / rhs);
\r
139 template <typename T>
\r
140 inline Vec3<T>::Vec3(T a)
\r
142 m_data[0] = m_data[1] = m_data[2] = a;
\r
144 template <typename T>
\r
145 inline Vec3<T>::Vec3(T x, T y, T z)
\r
151 template <typename T>
\r
152 inline Vec3<T>::Vec3(const Vec3 & rhs)
\r
154 m_data[0] = rhs.m_data[0];
\r
155 m_data[1] = rhs.m_data[1];
\r
156 m_data[2] = rhs.m_data[2];
\r
158 template <typename T>
\r
159 inline Vec3<T>::~Vec3(void){};
\r
161 template <typename T>
\r
162 inline Vec3<T>::Vec3() {}
\r
164 template<typename T>
\r
165 inline const bool Colinear(const Vec3<T> & a, const Vec3<T> & b, const Vec3<T> & c)
\r
167 return ((c.Z() - a.Z()) * (b.Y() - a.Y()) - (b.Z() - a.Z()) * (c.Y() - a.Y()) == 0.0 /*EPS*/) &&
\r
168 ((b.Z() - a.Z()) * (c.X() - a.X()) - (b.X() - a.X()) * (c.Z() - a.Z()) == 0.0 /*EPS*/) &&
\r
169 ((b.X() - a.X()) * (c.Y() - a.Y()) - (b.Y() - a.Y()) * (c.X() - a.X()) == 0.0 /*EPS*/);
\r
172 template<typename T>
\r
173 inline const T Volume(const Vec3<T> & a, const Vec3<T> & b, const Vec3<T> & c, const Vec3<T> & d)
\r
175 return (a-d) * ((b-d) ^ (c-d));
\r
178 #endif //HACD_VECTOR_INL