00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef __UT_Vector2_h__
00027 #define __UT_Vector2_h__
00028
00029 #include "UT_API.h"
00030 #include <iostream.h>
00031 #include <limits.h>
00032 #include "UT_Math.h"
00033 #include "UT_Assert.h"
00034
00035 class UT_IStream;
00036 class UT_Vector2;
00037 class UT_Vector3;
00038 class UT_Vector4;
00039 template <typename T> class UT_TMatrix2;
00040
00041
00042
00043
00044 inline UT_Vector2 operator+(const UT_Vector2 &v1, const UT_Vector2 &v2);
00045 inline UT_Vector2 operator-(const UT_Vector2 &v1, const UT_Vector2 &v2);
00046 inline bool operator<(const UT_Vector2 &v1, const UT_Vector2 &v2);
00047 inline bool operator<=(const UT_Vector2 &v1, const UT_Vector2 &v2);
00048 inline bool operator>(const UT_Vector2 &v1, const UT_Vector2 &v2);
00049 inline bool operator>=(const UT_Vector2 &v1, const UT_Vector2 &v2);
00050 inline UT_Vector2 operator+(const UT_Vector2 &v, fpreal scalar);
00051 inline UT_Vector2 operator-(const UT_Vector2 &v, fpreal scalar);
00052 inline UT_Vector2 operator*(const UT_Vector2 &v, fpreal scalar);
00053 inline UT_Vector2 operator/(const UT_Vector2 &v, fpreal scalar);
00054 inline UT_Vector2 operator+(fpreal scalar, const UT_Vector2 &v);
00055 inline UT_Vector2 operator-(fpreal scalar, const UT_Vector2 &v);
00056 inline UT_Vector2 operator*(fpreal scalar, const UT_Vector2 &v);
00057 inline UT_Vector2 operator/(fpreal scalar, const UT_Vector2 &v);
00058 inline UT_Vector2 operator*(const UT_Vector2 &v,
00059 const UT_TMatrix2<float> &mat);
00060
00061
00062 inline fpreal dot (const UT_Vector2 &v1, const UT_Vector2 &v2);
00063
00064 inline fpreal cross (const UT_Vector2 &v1, const UT_Vector2 &v2);
00065
00066
00067 inline UT_Vector2 project (const UT_Vector2 &u, const UT_Vector2 &v);
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 inline UT_Vector2 rowVecMult(const UT_Vector2 &v,
00086 const UT_TMatrix2<float> &m);
00087 inline UT_Vector2 colVecMult(const UT_TMatrix2<float> &m,
00088 const UT_Vector2 &v);
00089
00090
00091 inline fpreal distance2d(const UT_Vector2 &v1, const UT_Vector2 &v2);
00092
00093
00094 class UT_API UT_Vector2 {
00095 public:
00096
00097
00098 inline UT_Vector2(void)
00099 {
00100 UT_ASSERT_COMPILETIME(sizeof(UT_Vector2) ==
00101 2 * sizeof(float));
00102 }
00103 inline UT_Vector2(fpreal vx, fpreal vy)
00104 {
00105 vec[0] = vx; vec[1] = vy;
00106 }
00107 explicit UT_Vector2(const fpreal32 v[2])
00108 {
00109 vec[0] = v[0]; vec[1] = v[1];
00110 }
00111 explicit UT_Vector2(const fpreal64 v[2])
00112 {
00113 vec[0] = v[0]; vec[1] = v[1];
00114 }
00115 explicit UT_Vector2(const UT_Vector3 &v);
00116 explicit UT_Vector2(const UT_Vector4 &v);
00117
00118
00119 ~UT_Vector2(void) {}
00120
00121
00122
00123
00124
00125
00126
00127
00128 UT_Vector2 &operator=(const UT_Vector3 &v);
00129
00130 UT_Vector2 &operator=(const UT_Vector4 &v);
00131 UT_Vector2 operator-() const
00132 {
00133 return UT_Vector2(-vec[0], -vec[1]);
00134 }
00135 UT_Vector2 &operator+=(const UT_Vector2 &v)
00136 {
00137 vec[0] += v.vec[0];
00138 vec[1] += v.vec[1];
00139 return *this;
00140 }
00141 UT_Vector2 &operator-=(const UT_Vector2 &v)
00142 {
00143 vec[0] -= v.vec[0];
00144 vec[1] -= v.vec[1];
00145 return *this;
00146 }
00147 unsigned operator==(const UT_Vector2 &v) const
00148 {
00149 return (vec[0] == v.vec[0] && vec[1] == v.vec[1]);
00150 }
00151 unsigned operator!=(const UT_Vector2 &v) const { return !(*this == v); }
00152 int equalZero(fpreal tol = 0.00001f) const
00153 {
00154 return (vec[0] >= -tol && vec[0] <= tol) &&
00155 (vec[1] >= -tol && vec[1] <= tol);
00156 }
00157 int isEqual(const UT_Vector2 &v, fpreal tol = 0.00001f) const
00158 {
00159 return ((vec[0]>=v.vec[0]-tol) && (vec[0]<=v.vec[0]+tol) &&
00160 (vec[1]>=v.vec[1]-tol) && (vec[1]<=v.vec[1]+tol));
00161 }
00162
00163 void negate() { operator=(operator-()); }
00164
00165 void multiplyComponents(const UT_Vector2 &v)
00166 {
00167 vec[0] *= v.vec[0];
00168 vec[1] *= v.vec[1];
00169 }
00170
00171
00172
00173
00174
00175
00176
00177 fpreal whichSide(const UT_Vector2 &e1, const UT_Vector2 &e2) const
00178 {
00179 return (vec[0] - e1.vec[0]) * (e2.vec[1] - e1.vec[1]) -
00180 (vec[1] - e1.vec[1]) * (e2.vec[0] - e1.vec[0]);
00181 }
00182
00183 UT_Vector2 &operator=(fpreal scalar)
00184 {
00185 vec[0] = vec[1] = scalar;
00186 return *this;
00187 }
00188 UT_Vector2 &operator+=(fpreal scalar)
00189 {
00190 vec[0] += scalar;
00191 vec[1] += scalar;
00192 return *this;
00193 }
00194 UT_Vector2 &operator-=(fpreal scalar)
00195 {
00196 return operator+=(-scalar);
00197 }
00198 UT_Vector2 &operator*=(fpreal scalar)
00199 {
00200 vec[0] *= scalar;
00201 vec[1] *= scalar;
00202 return *this;
00203 }
00204 UT_Vector2 &operator*=(const UT_Vector2 &v)
00205 {
00206 vec[0] *= v.vec[0];
00207 vec[1] *= v.vec[1];
00208 return *this;
00209 }
00210 UT_Vector2 &operator/=(fpreal scalar)
00211 {
00212 return operator*=( 1.0f/scalar );
00213 }
00214 UT_Vector2 &operator/=(const UT_Vector2 &v)
00215 {
00216 vec[0] /= v.vec[0];
00217 vec[1] /= v.vec[1];
00218 return *this;
00219 }
00220
00221 UT_Vector2 &operator*=(const UT_TMatrix2<float> &mat)
00222 { return operator=(*this * mat); }
00223
00224 inline
00225 fpreal dot(const UT_Vector2 &v) const
00226 {
00227 return ::dot(*this, v);
00228 }
00229 fpreal normalize (void)
00230 {
00231 fpreal dn = vec[0]*vec[0] + vec[1]*vec[1];
00232 if (dn > FLT_MIN && dn != 1.0F)
00233 {
00234 dn = SYSsqrt(dn);
00235 (*this) /= dn;
00236 }
00237
00238 return dn;
00239 }
00240
00241
00242
00243 int findMinAbsAxis() const
00244 {
00245 if (SYSabs(x()) < SYSabs(y()))
00246 return 0;
00247 else
00248 return 1;
00249 }
00250 int findMaxAbsAxis() const
00251 {
00252 if (SYSabs(x()) >= SYSabs(y()))
00253 return 0;
00254 else
00255 return 1;
00256 }
00257
00258
00259
00260 inline fpreal length(void) const { return SYSsqrt(dot(*this)); }
00261
00262 inline fpreal length2(void) const { return dot(*this); }
00263
00264
00265 UT_Vector2 project(const UT_Vector2 &u);
00266
00267
00268
00269
00270
00271 UT_Vector2 projection(const UT_Vector2 &p, const UT_Vector2 &v) const;
00272
00273
00274
00275
00276 UT_Vector3 getBary(const UT_Vector2 &t0, const UT_Vector2 &t1,
00277 const UT_Vector2 &t2, bool *degen = NULL) const;
00278
00279
00280
00281
00282
00283 const float *data(void) const { return &vec[0]; }
00284 float &x(void) { return vec[0]; }
00285 float x(void) const { return vec[0]; }
00286 float &y(void) { return vec[1]; }
00287 float y(void) const { return vec[1]; }
00288 float &operator()(unsigned i)
00289 {
00290 UT_ASSERT_P(i < 2);
00291 return vec[i];
00292 }
00293 float operator()(unsigned i) const
00294 {
00295 UT_ASSERT_P(i < 2);
00296 return vec[i];
00297 }
00298 float &operator[](unsigned i)
00299 {
00300 UT_ASSERT_P(i < 2);
00301 return vec[i];
00302 }
00303 float operator[](unsigned i) const
00304 {
00305 UT_ASSERT_P(i < 2);
00306 return vec[i];
00307 }
00308
00309
00310
00311
00312
00313 void assign(fpreal xx = 0.0f, fpreal yy = 0.0f)
00314 {
00315 vec[0] = xx; vec[1] = yy;
00316 }
00317
00318 void assign(const float *v) {vec[0]=v[0]; vec[1]=v[1];}
00319
00320
00321
00322 void homogenize (void) { vec[0] *= vec[1]; }
00323 void dehomogenize(void) { vec[0] /= vec[1]; }
00324
00325
00326
00327
00328 void save(ostream &os, int binary = 0) const;
00329 bool load(UT_IStream &is);
00330
00331
00332
00333 float vec[2];
00334
00335 private:
00336
00337
00338 friend ostream &operator<<(ostream &os, const UT_Vector2 &v)
00339 {
00340 v.save(os);
00341 return os;
00342 }
00343
00344 };
00345
00346 #include "UT_Matrix2.h"
00347
00348
00349 inline UT_Vector2 operator+(const UT_Vector2 &v1, const UT_Vector2 &v2)
00350 {
00351 return UT_Vector2(v1.x()+v2.x(), v1.y()+v2.y());
00352 }
00353 inline UT_Vector2 operator-(const UT_Vector2 &v1, const UT_Vector2 &v2)
00354 {
00355 return UT_Vector2(v1.x()-v2.x(), v1.y()-v2.y());
00356 }
00357 inline UT_Vector2 operator*(const UT_Vector2 &v1, const UT_Vector2 &v2)
00358 {
00359 return UT_Vector2(v1.x()*v2.x(), v1.y()*v2.y());
00360 }
00361 inline UT_Vector2 operator/(const UT_Vector2 &v1, const UT_Vector2 &v2)
00362 {
00363 return UT_Vector2(v1.x()/v2.x(), v1.y()/v2.y());
00364 }
00365 inline bool operator<(const UT_Vector2 &v1, const UT_Vector2 &v2)
00366 {
00367 return ((v1.x() < v2.x()) || (v1.x() == v2.x() && v1.y() < v2.y()));
00368 }
00369 inline bool operator<=(const UT_Vector2 &v1, const UT_Vector2 &v2)
00370 {
00371 return (v1 < v2) || (v1 == v2);
00372 }
00373 inline bool operator>(const UT_Vector2 &v1, const UT_Vector2 &v2)
00374 {
00375 return v2 < v1;
00376 }
00377 inline bool operator>=(const UT_Vector2 &v1, const UT_Vector2 &v2)
00378 {
00379 return v2 <= v1;
00380 }
00381 inline UT_Vector2 operator+(const UT_Vector2 &v, fpreal scalar)
00382 {
00383 return UT_Vector2(v.x()+scalar, v.y()+scalar);
00384 }
00385 inline UT_Vector2 operator+(fpreal scalar, const UT_Vector2 &v)
00386 {
00387 return UT_Vector2(v.x()+scalar, v.y()+scalar);
00388 }
00389 inline UT_Vector2 operator-(const UT_Vector2 &v, fpreal scalar)
00390 {
00391 return UT_Vector2(v.x()-scalar, v.y()-scalar);
00392 }
00393 inline UT_Vector2 operator-(fpreal scalar, const UT_Vector2 &v)
00394 {
00395 return UT_Vector2(scalar-v.x(), scalar-v.y());
00396 }
00397 inline UT_Vector2 operator*(const UT_Vector2 &v, fpreal scalar)
00398 {
00399 return UT_Vector2(v.x()*scalar, v.y()*scalar);
00400 }
00401 inline UT_Vector2 operator*(fpreal scalar, const UT_Vector2 &v)
00402 {
00403 return UT_Vector2(v.x()*scalar, v.y()*scalar);
00404 }
00405 inline UT_Vector2 operator/(const UT_Vector2 &v, fpreal scalar)
00406 {
00407 return UT_Vector2(v.x()/scalar, v.y()/scalar);
00408 }
00409 inline UT_Vector2 operator/(fpreal scalar, const UT_Vector2 &v)
00410 {
00411 return UT_Vector2(scalar/v.x(), scalar/v.y());
00412 }
00413 inline fpreal dot(const UT_Vector2 &v1, const UT_Vector2 &v2)
00414 {
00415 return v1.x()*v2.x() + v1.y()*v2.y();
00416 }
00417 inline fpreal cross(const UT_Vector2 &v1, const UT_Vector2 &v2)
00418 {
00419 return v1.x() * v2.y() - v1.y() * v2.x();
00420 }
00421 inline UT_Vector2 project(const UT_Vector2 &u, const UT_Vector2 &v)
00422 {
00423 return dot(u, v) / v.length2() * v;
00424 }
00425 inline UT_Vector2 rowVecMult(const UT_Vector2 &v, const UT_Matrix2 &m)
00426 {
00427 return UT_Vector2(v.x()*m(0,0) + v.y()*m(1,0),
00428 v.x()*m(0,1) + v.y()*m(1,1));
00429 }
00430 inline UT_Vector2 colVecMult(const UT_Matrix2 &m, const UT_Vector2 &v)
00431 {
00432 return UT_Vector2(m(0,0)*v.x() + m(0,1)*v.y(),
00433 m(1,0)*v.x() + m(1,1)*v.y());
00434 }
00435 inline UT_Vector2 operator*(const UT_Vector2 &v, const UT_Matrix2 &m)
00436 {
00437 return rowVecMult(v, m);
00438 }
00439 inline fpreal distance2d(const UT_Vector2 &v1, const UT_Vector2 &v2)
00440 {
00441 return (v1 - v2).length();
00442 }
00443
00444 #endif