00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __kis_vec_h__
00022 #define __kis_vec_h__
00023
00024 #include <math.h>
00025 #include <cfloat>
00026 #include <qpoint.h>
00027 #include "kis_point.h"
00028
00029
00030
00031
00032 const double epsilon = DBL_EPSILON;
00033
00034 class KisVector2D
00035 {
00036 public:
00037 KisVector2D();
00038 KisVector2D(double x, double y);
00039 KisVector2D(const QPoint& p);
00040 KisVector2D(const KisPoint& p);
00041
00042 bool isNull() const;
00043
00044 double length() const;
00045
00046 double x() const;
00047 double y() const;
00048 void setX(double);
00049 void setY(double);
00050
00051 KisVector2D &normalize();
00052 double dotProduct(const KisVector2D &) const;
00053
00054 KisVector2D &operator+=(const KisVector2D &);
00055 KisVector2D &operator-=(const KisVector2D &);
00056 KisVector2D &operator*=(int);
00057 KisVector2D &operator*=(long);
00058 KisVector2D &operator*=(double);
00059 KisVector2D &operator/=(int);
00060 KisVector2D &operator/=(long);
00061 KisVector2D &operator/=(double);
00062
00063 friend inline bool operator==(const KisVector2D &, const KisVector2D &);
00064 friend inline bool operator!=(const KisVector2D &, const KisVector2D &);
00065 friend inline KisVector2D operator+(const KisVector2D &, const KisVector2D &);
00066 friend inline KisVector2D operator-(const KisVector2D &, const KisVector2D &);
00067 friend inline KisVector2D operator*(const KisVector2D &, int);
00068 friend inline KisVector2D operator*(int, const KisVector2D &);
00069 friend inline KisVector2D operator*(const KisVector2D &, long);
00070 friend inline KisVector2D operator*(long, const KisVector2D &);
00071 friend inline KisVector2D operator*(const KisVector2D &, double);
00072 friend inline KisVector2D operator*(double, const KisVector2D &);
00073 friend inline KisVector2D operator-(const KisVector2D &);
00074 friend inline KisVector2D operator/(const KisVector2D &, int);
00075 friend inline KisVector2D operator/(const KisVector2D &, long);
00076 friend inline KisVector2D operator/(const KisVector2D &, double);
00077
00078 KisPoint toKisPoint() const;
00079
00080 private:
00081 double m_x;
00082 double m_y;
00083 };
00084
00085 inline KisVector2D::KisVector2D()
00086 { m_x=0; m_y=0; }
00087
00088 inline KisVector2D::KisVector2D(double x, double y)
00089 { m_x=x; m_y=y; }
00090
00091 inline KisVector2D::KisVector2D(const QPoint& p)
00092 {
00093 m_x=p.x(); m_y=p.y();
00094 }
00095
00096 inline KisVector2D::KisVector2D(const KisPoint& p)
00097 {
00098 m_x=p.x(); m_y=p.y();
00099 }
00100
00101 inline bool KisVector2D::isNull() const
00102 { return fabs(m_x) < epsilon && fabs(m_y) < epsilon; }
00103
00104 inline double KisVector2D::length() const
00105 { return (sqrt(m_x*m_x + m_y*m_y)); }
00106
00107 inline double KisVector2D::dotProduct(const KisVector2D &v) const
00108 { return m_x*v.m_x + m_y*v.m_y; }
00109
00110 inline double KisVector2D::x() const
00111 { return m_x; }
00112
00113 inline double KisVector2D::y() const
00114 { return m_y; }
00115
00116 inline void KisVector2D::setX(double x)
00117 { m_x=x; }
00118
00119 inline void KisVector2D::setY(double y)
00120 { m_y=y; }
00121
00122 inline KisVector2D &KisVector2D::operator+=(const KisVector2D &v)
00123 { m_x+=v.m_x; m_y+=v.m_y; return *this; }
00124
00125 inline KisVector2D &KisVector2D::operator-=(const KisVector2D &v)
00126 { m_x-=v.m_x; m_y-=v.m_y; return *this; }
00127
00128 inline KisVector2D &KisVector2D::operator*=(int c)
00129 { m_x*=c; m_y*=c; return *this; }
00130
00131 inline KisVector2D &KisVector2D::operator*=(long c)
00132 { m_x*=c; m_y*=c; return *this; }
00133
00134 inline KisVector2D &KisVector2D::operator*=(double c)
00135 { m_x*=c; m_y*=c; return *this; }
00136
00137 inline bool operator==(const KisVector2D &v1, const KisVector2D &v2)
00138 { return fabs(v1.m_x - v2.m_x) < epsilon && fabs(v1.m_y - v2.m_y) < epsilon; }
00139
00140 inline bool operator!=(const KisVector2D &v1, const KisVector2D &v2)
00141 { return !(v1 == v2); }
00142
00143 inline KisVector2D operator+(const KisVector2D &v1, const KisVector2D &v2)
00144 { return KisVector2D(v1.m_x+v2.m_x, v1.m_y+v2.m_y); }
00145
00146 inline KisVector2D operator-(const KisVector2D &v1, const KisVector2D &v2)
00147 { return KisVector2D(v1.m_x-v2.m_x, v1.m_y-v2.m_y); }
00148
00149 inline KisVector2D operator*(const KisVector2D &v, int c)
00150 { return KisVector2D((v.m_x*c), (v.m_y*c)); }
00151
00152 inline KisVector2D operator*(int c, const KisVector2D &v)
00153 { return KisVector2D((v.m_x*c), (v.m_y*c)); }
00154
00155 inline KisVector2D operator*(const KisVector2D &v, long c)
00156 { return KisVector2D((v.m_x*c), (v.m_y*c)); }
00157
00158 inline KisVector2D operator*(long c, const KisVector2D &v)
00159 { return KisVector2D((v.m_x*c), (v.m_y*c)); }
00160
00161 inline KisVector2D operator*(const KisVector2D &v, double c)
00162 { return KisVector2D(v.m_x*c, v.m_y*c); }
00163
00164 inline KisVector2D operator*(double c, const KisVector2D &v)
00165 { return KisVector2D(v.m_x*c, v.m_y*c); }
00166
00167 inline KisVector2D operator-(const KisVector2D &v)
00168 { return KisVector2D(-v.m_x, -v.m_y); }
00169
00170 inline KisVector2D operator/(const KisVector2D &v, int c)
00171 {
00172 if (c != 0) {
00173 return KisVector2D(v.x() / c, v.y() / c);
00174 } else {
00175 return v;
00176 }
00177 }
00178
00179 inline KisVector2D operator/(const KisVector2D &v, long c)
00180 {
00181 if (c != 0) {
00182 return KisVector2D(v.x() / c, v.y() / c);
00183 } else {
00184 return v;
00185 }
00186 }
00187
00188 inline KisVector2D operator/(const KisVector2D &v, double c)
00189 {
00190 if (c > DBL_EPSILON || c < -DBL_EPSILON) {
00191 return KisVector2D(v.x() / c, v.y() / c);
00192 } else {
00193 return v;
00194 }
00195 }
00196
00197 inline KisVector2D &KisVector2D::operator/=(int c)
00198 {
00199 if (!c == 0)
00200 {
00201 m_x/=c;
00202 m_y/=c;
00203 }
00204 return *this;
00205 }
00206
00207 inline KisVector2D &KisVector2D::operator/=(long c)
00208 {
00209 if (!c == 0)
00210 {
00211 m_x/=c;
00212 m_y/=c;
00213 }
00214 return *this;
00215 }
00216
00217 inline KisVector2D &KisVector2D::operator/=(double c)
00218 {
00219 if (!c == 0)
00220 {
00221 m_x/=c;
00222 m_y/=c;
00223 }
00224 return *this;
00225 }
00226
00227 inline KisPoint KisVector2D::toKisPoint() const
00228 {
00229 return KisPoint(m_x, m_y);
00230 }
00231
00232 class KisVector3D
00233 {
00234 public:
00235 KisVector3D();
00236 KisVector3D(double x, double y, double z = 0);
00237 KisVector3D(int x, int y, int z = 0);
00238 KisVector3D(long x, long y, long z = 0);
00239
00240 bool isNull() const;
00241
00242 double length() const;
00243
00244 double x() const;
00245 double y() const;
00246 double z() const;
00247 void setX(double);
00248 void setY(double);
00249 void setZ(double);
00250
00251 KisVector3D &normalize();
00252 KisVector3D &crossProduct(const KisVector3D &);
00253 double dotProduct(const KisVector3D &) const;
00254
00255 KisVector3D &operator+=(const KisVector3D &);
00256 KisVector3D &operator-=(const KisVector3D &);
00257 KisVector3D &operator*=(int);
00258 KisVector3D &operator*=(long);
00259 KisVector3D &operator*=(double);
00260 KisVector3D &operator/=(int);
00261 KisVector3D &operator/=(long);
00262 KisVector3D &operator/=(double);
00263
00264 friend inline bool operator==(const KisVector3D &, const KisVector3D &);
00265 friend inline bool operator!=(const KisVector3D &, const KisVector3D &);
00266 friend inline KisVector3D operator+(const KisVector3D &, const KisVector3D &);
00267 friend inline KisVector3D operator-(const KisVector3D &, const KisVector3D &);
00268 friend inline KisVector3D operator*(const KisVector3D &, int);
00269 friend inline KisVector3D operator*(int, const KisVector3D &);
00270 friend inline KisVector3D operator*(const KisVector3D &, long);
00271 friend inline KisVector3D operator*(long, const KisVector3D &);
00272 friend inline KisVector3D operator*(const KisVector3D &, double);
00273 friend inline KisVector3D operator*(double, const KisVector3D &);
00274 friend inline KisVector3D operator-(const KisVector3D &);
00275 friend inline KisVector3D operator/(const KisVector3D &, int);
00276 friend inline KisVector3D operator/(const KisVector3D &, long);
00277 friend inline KisVector3D operator/(const KisVector3D &, double);
00278
00279 private:
00280 double m_x;
00281 double m_y;
00282 double m_z;
00283 };
00284
00285 inline KisVector3D::KisVector3D()
00286 { m_x=0; m_y=0; m_z=0; }
00287
00288 inline KisVector3D::KisVector3D(double x, double y, double z)
00289 { m_x=x; m_y=y; m_z=z; }
00290
00291 inline KisVector3D::KisVector3D(int x, int y, int z)
00292 { m_x=static_cast<double>(x); m_y=static_cast<double>(y); m_z=static_cast<double>(z); }
00293
00294 inline KisVector3D::KisVector3D(long x, long y, long z)
00295 { m_x=static_cast<double>(x); m_y=static_cast<double>(y); m_z=static_cast<double>(z); }
00296
00297 inline bool KisVector3D::isNull() const
00298 { return fabs(m_x) < epsilon && fabs(m_y) < epsilon && fabs(m_z) < epsilon; }
00299
00300 inline double KisVector3D::length() const
00301 { return (sqrt(m_x*m_x + m_y*m_y + m_z*m_z)); }
00302
00303 inline double KisVector3D::dotProduct(const KisVector3D &v) const
00304 { return m_x*v.m_x + m_y*v.m_y + m_z*v.m_z; }
00305
00306 inline double KisVector3D::x() const
00307 { return m_x; }
00308
00309 inline double KisVector3D::y() const
00310 { return m_y; }
00311
00312 inline double KisVector3D::z() const
00313 { return m_z; }
00314
00315 inline void KisVector3D::setX(double x)
00316 { m_x=x; }
00317
00318 inline void KisVector3D::setY(double y)
00319 { m_y=y; }
00320
00321 inline void KisVector3D::setZ(double z)
00322 { m_z=z; }
00323
00324 inline KisVector3D &KisVector3D::operator+=(const KisVector3D &v)
00325 { m_x+=v.m_x; m_y+=v.m_y; m_z+=v.m_z; return *this; }
00326
00327 inline KisVector3D &KisVector3D::operator-=(const KisVector3D &v)
00328 { m_x-=v.m_x; m_y-=v.m_y; m_z-=v.m_z; return *this; }
00329
00330 inline KisVector3D &KisVector3D::operator*=(int c)
00331 { m_x*=c; m_y*=c; m_z*=c; return *this; }
00332
00333 inline KisVector3D &KisVector3D::operator*=(long c)
00334 { m_x*=c; m_y*=c; m_z*=c; return *this; }
00335
00336 inline KisVector3D &KisVector3D::operator*=(double c)
00337 { m_x*=c; m_y*=c; m_z*=c; return *this; }
00338
00339 inline bool operator==(const KisVector3D &v1, const KisVector3D &v2)
00340 { return fabs(v1.m_x - v2.m_x) < epsilon && fabs(v1.m_y - v2.m_y) < epsilon && fabs(v1.m_z - v2.m_z) < epsilon; }
00341
00342 inline bool operator!=(const KisVector3D &v1, const KisVector3D &v2)
00343 { return !(v1 == v2); }
00344
00345 inline KisVector3D operator+(const KisVector3D &v1, const KisVector3D &v2)
00346 { return KisVector3D(v1.m_x+v2.m_x, v1.m_y+v2.m_y, v1.m_z+v2.m_z); }
00347
00348 inline KisVector3D operator-(const KisVector3D &v1, const KisVector3D &v2)
00349 { return KisVector3D(v1.m_x-v2.m_x, v1.m_y-v2.m_y, v1.m_z-v2.m_z); }
00350
00351 inline KisVector3D operator*(const KisVector3D &v, int c)
00352 { return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
00353
00354 inline KisVector3D operator*(int c, const KisVector3D &v)
00355 { return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
00356
00357 inline KisVector3D operator*(const KisVector3D &v, long c)
00358 { return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
00359
00360 inline KisVector3D operator*(long c, const KisVector3D &v)
00361 { return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
00362
00363 inline KisVector3D operator*(const KisVector3D &v, double c)
00364 { return KisVector3D(v.m_x*c, v.m_y*c, v.m_z*c); }
00365
00366 inline KisVector3D operator*(double c, const KisVector3D &v)
00367 { return KisVector3D(v.m_x*c, v.m_y*c, v.m_z*c); }
00368
00369 inline KisVector3D operator-(const KisVector3D &v)
00370 { return KisVector3D(-v.m_x, -v.m_y, -v.m_z); }
00371
00372 inline KisVector3D &KisVector3D::operator/=(int c)
00373 {
00374 if (!c == 0)
00375 {
00376 m_x/=c;
00377 m_y/=c;
00378 m_z/=c;
00379 }
00380 return *this;
00381 }
00382
00383 inline KisVector3D &KisVector3D::operator/=(long c)
00384 {
00385 if (!c == 0)
00386 {
00387 m_x/=c;
00388 m_y/=c;
00389 m_z/=c;
00390 }
00391 return *this;
00392 }
00393
00394 inline KisVector3D &KisVector3D::operator/=(double c)
00395 {
00396 if (!c == 0)
00397 {
00398 m_x/=c;
00399 m_y/=c;
00400 m_z/=c;
00401 }
00402 return *this;
00403 }
00404
00405 #endif