krita

kis_vec.h

00001 /*
00002  *  kis_vec.h - part of KImageShop
00003  *
00004  *  Copyright (c) 1999 Matthias Elter <me@kde.org>
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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  * vector classes
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
KDE Home | KDE Accessibility Home | Description of Access Keys