Commit | Line | Data |
---|---|---|
292223f3 PG |
1 | /* |
2 | * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com. | |
3 | * | |
4 | * This program is free software: you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation, either version 3 of the License, or | |
7 | * (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #include "mathw.h" | |
48ce2fad PG |
19 | #include "debug.h" |
20 | ||
21 | #include <math.h> | |
22 | ||
23 | #include "Vector2.h" | |
292223f3 | 24 | |
7936c2c5 | 25 | using namespace bear; |
31456994 | 26 | |
292223f3 PG |
27 | |
28 | /// ***** Public Methods ***** | |
29 | ||
69b1022f | 30 | unsigned int bear::mod(unsigned int x, unsigned int y) |
292223f3 | 31 | { |
69b1022f | 32 | return x % y; |
292223f3 PG |
33 | } |
34 | ||
69b1022f | 35 | |
292223f3 PG |
36 | // Vector2 Math |
37 | ||
7936c2c5 | 38 | Vector2 bear::vectorToLine |
292223f3 PG |
39 | ( |
40 | const Vector2& vec, | |
41 | float x1, | |
42 | float y1, | |
43 | float x2, | |
44 | float y2 | |
45 | ) | |
46 | { | |
c08ba753 PG |
47 | double lineSize = sqrt((x1 - x2) * (x1 - x2) |
48 | + (y1 - y2) * (y1 - y2)); | |
49 | double sqrLineSize = lineSize * lineSize; | |
50 | ||
51 | // TODO: What should I do here for near 0? | |
52 | if (-0.00000000001 <= sqrLineSize && sqrLineSize <= 0.00000000001) | |
53 | { | |
292223f3 | 54 | return Vector2(x1 - vec.m_fX, y1 - vec.m_fY); |
c08ba753 | 55 | } |
292223f3 PG |
56 | |
57 | float u = ((vec.m_fX - x1) * (x2 - x1) | |
c08ba753 | 58 | + (vec.m_fY - y1) * (y2 - y1)) / sqrLineSize; |
292223f3 PG |
59 | |
60 | if (u < 0) | |
c08ba753 | 61 | { |
292223f3 | 62 | return Vector2(x1 - vec.m_fX, y1 - vec.m_fY); |
c08ba753 | 63 | } |
292223f3 | 64 | else if (u > 1) |
c08ba753 | 65 | { |
292223f3 | 66 | return Vector2(x2 - vec.m_fX, y2 - vec.m_fY); |
c08ba753 | 67 | } |
292223f3 PG |
68 | else |
69 | { | |
70 | float ix = x1 + u * (x2 - x1); | |
71 | float iy = y1 + u * (y2 - y1); | |
72 | return Vector2(ix - vec.m_fX, iy - vec.m_fY); | |
73 | } | |
74 | } | |
75 | ||
7936c2c5 | 76 | Vector2 bear::perp(const Vector2& vec) |
292223f3 PG |
77 | { |
78 | return Vector2(-vec.m_fY, vec.m_fX); | |
79 | } | |
80 | ||
7936c2c5 | 81 | float bear::dot(const Vector2& vec1, const Vector2& vec2) |
292223f3 PG |
82 | { |
83 | return vec1.m_fX * vec2.m_fX + vec1.m_fY * vec2.m_fY; | |
84 | } | |
85 | ||
86 | //TODO float Vector2::projectionCoeff(const Vector2* vec) const; | |
87 | //TODO Vector2* Vector2::projection(const Vector2* vec) const; | |
88 |