chalk

kis_vec.h
1/*
2 * kis_vec.h - part of KImageShop
3 *
4 * Copyright (c) 1999 Matthias Elter <me@kde.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20
21#ifndef __kis_vec_h__
22#define __kis_vec_h__
23
24#include <math.h>
25#include <cfloat>
26#include <tqpoint.h>
27#include "kis_point.h"
28
29/*
30 * vector classes
31 */
32const double epsilon = DBL_EPSILON;
33
34class KisVector2D
35{
36public:
37 KisVector2D();
38 KisVector2D(double x, double y);
39 KisVector2D(const TQPoint& p);
40 KisVector2D(const KisPoint& p);
41
42 bool isNull() const;
43
44 double length() const;
45
46 double x() const;
47 double y() const;
48 void setX(double);
49 void setY(double);
50
51 KisVector2D &normalize();
52 double dotProduct(const KisVector2D &) const;
53
54 KisVector2D &operator+=(const KisVector2D &);
55 KisVector2D &operator-=(const KisVector2D &);
56 KisVector2D &operator*=(int);
57 KisVector2D &operator*=(long);
58 KisVector2D &operator*=(double);
59 KisVector2D &operator/=(int);
60 KisVector2D &operator/=(long);
61 KisVector2D &operator/=(double);
62
63 friend inline bool operator==(const KisVector2D &, const KisVector2D &);
64 friend inline bool operator!=(const KisVector2D &, const KisVector2D &);
65 friend inline KisVector2D operator+(const KisVector2D &, const KisVector2D &);
66 friend inline KisVector2D operator-(const KisVector2D &, const KisVector2D &);
67 friend inline KisVector2D operator*(const KisVector2D &, int);
68 friend inline KisVector2D operator*(int, const KisVector2D &);
69 friend inline KisVector2D operator*(const KisVector2D &, long);
70 friend inline KisVector2D operator*(long, const KisVector2D &);
71 friend inline KisVector2D operator*(const KisVector2D &, double);
72 friend inline KisVector2D operator*(double, const KisVector2D &);
73 friend inline KisVector2D operator-(const KisVector2D &);
74 friend inline KisVector2D operator/(const KisVector2D &, int);
75 friend inline KisVector2D operator/(const KisVector2D &, long);
76 friend inline KisVector2D operator/(const KisVector2D &, double);
77
78 KisPoint toKisPoint() const;
79
80private:
81 double m_x;
82 double m_y;
83};
84
85inline KisVector2D::KisVector2D()
86{ m_x=0; m_y=0; }
87
88inline KisVector2D::KisVector2D(double x, double y)
89{ m_x=x; m_y=y; }
90
91inline KisVector2D::KisVector2D(const TQPoint& p)
92{
93 m_x=p.x(); m_y=p.y();
94}
95
96inline KisVector2D::KisVector2D(const KisPoint& p)
97{
98 m_x=p.x(); m_y=p.y();
99}
100
101inline bool KisVector2D::isNull() const
102{ return fabs(m_x) < epsilon && fabs(m_y) < epsilon; }
103
104inline double KisVector2D::length() const
105{ return (sqrt(m_x*m_x + m_y*m_y)); }
106
107inline double KisVector2D::dotProduct(const KisVector2D &v) const
108{ return m_x*v.m_x + m_y*v.m_y; }
109
110inline double KisVector2D::x() const
111{ return m_x; }
112
113inline double KisVector2D::y() const
114{ return m_y; }
115
116inline void KisVector2D::setX(double x)
117{ m_x=x; }
118
119inline void KisVector2D::setY(double y)
120{ m_y=y; }
121
122inline KisVector2D &KisVector2D::operator+=(const KisVector2D &v)
123{ m_x+=v.m_x; m_y+=v.m_y; return *this; }
124
125inline KisVector2D &KisVector2D::operator-=(const KisVector2D &v)
126{ m_x-=v.m_x; m_y-=v.m_y; return *this; }
127
128inline KisVector2D &KisVector2D::operator*=(int c)
129{ m_x*=c; m_y*=c; return *this; }
130
131inline KisVector2D &KisVector2D::operator*=(long c)
132{ m_x*=c; m_y*=c; return *this; }
133
134inline KisVector2D &KisVector2D::operator*=(double c)
135{ m_x*=c; m_y*=c; return *this; }
136
137inline bool operator==(const KisVector2D &v1, const KisVector2D &v2)
138{ return fabs(v1.m_x - v2.m_x) < epsilon && fabs(v1.m_y - v2.m_y) < epsilon; }
139
140inline bool operator!=(const KisVector2D &v1, const KisVector2D &v2)
141{ return !(v1 == v2); }
142
143inline KisVector2D operator+(const KisVector2D &v1, const KisVector2D &v2)
144{ return KisVector2D(v1.m_x+v2.m_x, v1.m_y+v2.m_y); }
145
146inline KisVector2D operator-(const KisVector2D &v1, const KisVector2D &v2)
147{ return KisVector2D(v1.m_x-v2.m_x, v1.m_y-v2.m_y); }
148
149inline KisVector2D operator*(const KisVector2D &v, int c)
150{ return KisVector2D((v.m_x*c), (v.m_y*c)); }
151
152inline KisVector2D operator*(int c, const KisVector2D &v)
153{ return KisVector2D((v.m_x*c), (v.m_y*c)); }
154
155inline KisVector2D operator*(const KisVector2D &v, long c)
156{ return KisVector2D((v.m_x*c), (v.m_y*c)); }
157
158inline KisVector2D operator*(long c, const KisVector2D &v)
159{ return KisVector2D((v.m_x*c), (v.m_y*c)); }
160
161inline KisVector2D operator*(const KisVector2D &v, double c)
162{ return KisVector2D(v.m_x*c, v.m_y*c); }
163
164inline KisVector2D operator*(double c, const KisVector2D &v)
165{ return KisVector2D(v.m_x*c, v.m_y*c); }
166
167inline KisVector2D operator-(const KisVector2D &v)
168{ return KisVector2D(-v.m_x, -v.m_y); }
169
170inline KisVector2D operator/(const KisVector2D &v, int c)
171{
172 if (c != 0) {
173 return KisVector2D(v.x() / c, v.y() / c);
174 } else {
175 return v;
176 }
177}
178
179inline KisVector2D operator/(const KisVector2D &v, long c)
180{
181 if (c != 0) {
182 return KisVector2D(v.x() / c, v.y() / c);
183 } else {
184 return v;
185 }
186}
187
188inline KisVector2D operator/(const KisVector2D &v, double c)
189{
190 if (c > DBL_EPSILON || c < -DBL_EPSILON) {
191 return KisVector2D(v.x() / c, v.y() / c);
192 } else {
193 return v;
194 }
195}
196
197inline KisVector2D &KisVector2D::operator/=(int c)
198{
199 if (!c == 0)
200 {
201 m_x/=c;
202 m_y/=c;
203 }
204 return *this;
205}
206
207inline KisVector2D &KisVector2D::operator/=(long c)
208{
209 if (!c == 0)
210 {
211 m_x/=c;
212 m_y/=c;
213 }
214 return *this;
215}
216
217inline KisVector2D &KisVector2D::operator/=(double c)
218{
219 if (!c == 0)
220 {
221 m_x/=c;
222 m_y/=c;
223 }
224 return *this;
225}
226
227inline KisPoint KisVector2D::toKisPoint() const
228{
229 return KisPoint(m_x, m_y);
230}
231
232class KisVector3D
233{
234public:
235 KisVector3D();
236 KisVector3D(double x, double y, double z = 0);
237 KisVector3D(int x, int y, int z = 0);
238 KisVector3D(long x, long y, long z = 0);
239
240 bool isNull() const;
241
242 double length() const;
243
244 double x() const;
245 double y() const;
246 double z() const;
247 void setX(double);
248 void setY(double);
249 void setZ(double);
250
251 KisVector3D &normalize();
252 KisVector3D &crossProduct(const KisVector3D &);
253 double dotProduct(const KisVector3D &) const;
254
255 KisVector3D &operator+=(const KisVector3D &);
256 KisVector3D &operator-=(const KisVector3D &);
257 KisVector3D &operator*=(int);
258 KisVector3D &operator*=(long);
259 KisVector3D &operator*=(double);
260 KisVector3D &operator/=(int);
261 KisVector3D &operator/=(long);
262 KisVector3D &operator/=(double);
263
264 friend inline bool operator==(const KisVector3D &, const KisVector3D &);
265 friend inline bool operator!=(const KisVector3D &, const KisVector3D &);
266 friend inline KisVector3D operator+(const KisVector3D &, const KisVector3D &);
267 friend inline KisVector3D operator-(const KisVector3D &, const KisVector3D &);
268 friend inline KisVector3D operator*(const KisVector3D &, int);
269 friend inline KisVector3D operator*(int, const KisVector3D &);
270 friend inline KisVector3D operator*(const KisVector3D &, long);
271 friend inline KisVector3D operator*(long, const KisVector3D &);
272 friend inline KisVector3D operator*(const KisVector3D &, double);
273 friend inline KisVector3D operator*(double, const KisVector3D &);
274 friend inline KisVector3D operator-(const KisVector3D &);
275 friend inline KisVector3D operator/(const KisVector3D &, int);
276 friend inline KisVector3D operator/(const KisVector3D &, long);
277 friend inline KisVector3D operator/(const KisVector3D &, double);
278
279private:
280 double m_x;
281 double m_y;
282 double m_z;
283};
284
285inline KisVector3D::KisVector3D()
286{ m_x=0; m_y=0; m_z=0; }
287
288inline KisVector3D::KisVector3D(double x, double y, double z)
289{ m_x=x; m_y=y; m_z=z; }
290
291inline KisVector3D::KisVector3D(int x, int y, int z)
292{ m_x=static_cast<double>(x); m_y=static_cast<double>(y); m_z=static_cast<double>(z); }
293
294inline KisVector3D::KisVector3D(long x, long y, long z)
295{ m_x=static_cast<double>(x); m_y=static_cast<double>(y); m_z=static_cast<double>(z); }
296
297inline bool KisVector3D::isNull() const
298{ return fabs(m_x) < epsilon && fabs(m_y) < epsilon && fabs(m_z) < epsilon; }
299
300inline double KisVector3D::length() const
301{ return (sqrt(m_x*m_x + m_y*m_y + m_z*m_z)); }
302
303inline double KisVector3D::dotProduct(const KisVector3D &v) const
304{ return m_x*v.m_x + m_y*v.m_y + m_z*v.m_z; }
305
306inline double KisVector3D::x() const
307{ return m_x; }
308
309inline double KisVector3D::y() const
310{ return m_y; }
311
312inline double KisVector3D::z() const
313{ return m_z; }
314
315inline void KisVector3D::setX(double x)
316{ m_x=x; }
317
318inline void KisVector3D::setY(double y)
319{ m_y=y; }
320
321inline void KisVector3D::setZ(double z)
322{ m_z=z; }
323
324inline KisVector3D &KisVector3D::operator+=(const KisVector3D &v)
325{ m_x+=v.m_x; m_y+=v.m_y; m_z+=v.m_z; return *this; }
326
327inline KisVector3D &KisVector3D::operator-=(const KisVector3D &v)
328{ m_x-=v.m_x; m_y-=v.m_y; m_z-=v.m_z; return *this; }
329
330inline KisVector3D &KisVector3D::operator*=(int c)
331{ m_x*=c; m_y*=c; m_z*=c; return *this; }
332
333inline KisVector3D &KisVector3D::operator*=(long c)
334{ m_x*=c; m_y*=c; m_z*=c; return *this; }
335
336inline KisVector3D &KisVector3D::operator*=(double c)
337{ m_x*=c; m_y*=c; m_z*=c; return *this; }
338
339inline bool operator==(const KisVector3D &v1, const KisVector3D &v2)
340{ 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; }
341
342inline bool operator!=(const KisVector3D &v1, const KisVector3D &v2)
343{ return !(v1 == v2); }
344
345inline KisVector3D operator+(const KisVector3D &v1, const KisVector3D &v2)
346{ return KisVector3D(v1.m_x+v2.m_x, v1.m_y+v2.m_y, v1.m_z+v2.m_z); }
347
348inline KisVector3D operator-(const KisVector3D &v1, const KisVector3D &v2)
349{ return KisVector3D(v1.m_x-v2.m_x, v1.m_y-v2.m_y, v1.m_z-v2.m_z); }
350
351inline KisVector3D operator*(const KisVector3D &v, int c)
352{ return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
353
354inline KisVector3D operator*(int c, const KisVector3D &v)
355{ return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
356
357inline KisVector3D operator*(const KisVector3D &v, long c)
358{ return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
359
360inline KisVector3D operator*(long c, const KisVector3D &v)
361{ return KisVector3D((v.m_x*c), (v.m_y*c), (v.m_z*c)); }
362
363inline KisVector3D operator*(const KisVector3D &v, double c)
364{ return KisVector3D(v.m_x*c, v.m_y*c, v.m_z*c); }
365
366inline KisVector3D operator*(double c, const KisVector3D &v)
367{ return KisVector3D(v.m_x*c, v.m_y*c, v.m_z*c); }
368
369inline KisVector3D operator-(const KisVector3D &v)
370{ return KisVector3D(-v.m_x, -v.m_y, -v.m_z); }
371
372inline KisVector3D &KisVector3D::operator/=(int c)
373{
374 if (!c == 0)
375 {
376 m_x/=c;
377 m_y/=c;
378 m_z/=c;
379 }
380 return *this;
381}
382
383inline KisVector3D &KisVector3D::operator/=(long c)
384{
385 if (!c == 0)
386 {
387 m_x/=c;
388 m_y/=c;
389 m_z/=c;
390 }
391 return *this;
392}
393
394inline KisVector3D &KisVector3D::operator/=(double c)
395{
396 if (!c == 0)
397 {
398 m_x/=c;
399 m_y/=c;
400 m_z/=c;
401 }
402 return *this;
403}
404
405#endif
A double-based point class that can return it's coordinates approximated to integers.
Definition kis_point.h:28