Commit | Line | Data |
---|---|---|
e68f847b 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 | ||
ad9f1fb6 | 18 | #include "Vector2.h" |
9d6dea5f PG |
19 | #include "debug.h" |
20 | ||
ad9f1fb6 PG |
21 | #include "mathw.h" |
22 | ||
617dcc71 PG |
23 | /// ***** Constructors/Destructors ***** |
24 | ||
ad9f1fb6 | 25 | Vector2::Vector2() |
9d6dea5f | 26 | : m_fX(0), m_fY(0) |
ad9f1fb6 | 27 | { |
617dcc71 | 28 | |
ad9f1fb6 | 29 | } |
9d6dea5f PG |
30 | Vector2::Vector2(float fX, float fY) |
31 | : m_fX(fX), m_fY(fY) | |
617dcc71 PG |
32 | { |
33 | ||
ad9f1fb6 PG |
34 | } |
35 | ||
617dcc71 PG |
36 | /// ***** Public Class Methods ***** |
37 | ||
ad9f1fb6 PG |
38 | void Vector2::zero() |
39 | { | |
9d6dea5f PG |
40 | m_fX = 0; |
41 | m_fY = 0; | |
ad9f1fb6 PG |
42 | } |
43 | void Vector2::unit() | |
44 | { | |
9d6dea5f | 45 | float fLen = length(); |
ad9f1fb6 | 46 | |
9d6dea5f PG |
47 | m_fX /= fLen; |
48 | m_fY /= fLen; | |
ad9f1fb6 PG |
49 | } |
50 | ||
51 | float Vector2::angle() const | |
52 | { | |
617dcc71 | 53 | //TODO |
9d6dea5f PG |
54 | DASSERT(false); |
55 | //return atan2A(m_fY,m_fX); | |
617dcc71 | 56 | return 0; |
ad9f1fb6 PG |
57 | } |
58 | float Vector2::length() const | |
59 | { | |
54fe85c5 PG |
60 | return sqrt(sqrLength()); |
61 | } | |
62 | float Vector2::sqrLength() const | |
63 | { | |
9d6dea5f | 64 | return this->dot(*this); |
54fe85c5 PG |
65 | } |
66 | ||
9d6dea5f | 67 | float Vector2::dot(const Vector2& vec) const |
54fe85c5 | 68 | { |
9d6dea5f | 69 | return m_fX * vec.m_fX + m_fY * vec.m_fY; |
ad9f1fb6 PG |
70 | } |
71 | ||
72 | ||
73 | string Vector2::toString() const | |
74 | { | |
617dcc71 | 75 | // long just to be safe |
9d6dea5f | 76 | char rgchars[100]; |
ad9f1fb6 | 77 | |
9d6dea5f | 78 | sprintf(rgchars, "Vector2 X: %f, Y: %f", m_fX, m_fY); |
ad9f1fb6 | 79 | |
9d6dea5f | 80 | return rgchars; |
ad9f1fb6 PG |
81 | } |
82 | void Vector2::print() const | |
83 | { | |
9d6dea5f | 84 | printf("%s\n", toString().c_str()); |
ad9f1fb6 PG |
85 | } |
86 | ||
87 | ||
88 | Vector2 Vector2::add(const Vector2& vec) const | |
89 | { | |
9d6dea5f | 90 | return Vector2(m_fX + vec.m_fX, m_fY + vec.m_fY); |
ad9f1fb6 PG |
91 | } |
92 | Vector2 Vector2::subtract(const Vector2& vec) const | |
93 | { | |
9d6dea5f | 94 | return Vector2(m_fX - vec.m_fX, m_fY - vec.m_fY); |
ad9f1fb6 | 95 | } |
9d6dea5f | 96 | Vector2 Vector2::multiply(float f) const |
ad9f1fb6 | 97 | { |
9d6dea5f | 98 | return Vector2(m_fX * f, m_fY * f); |
ad9f1fb6 | 99 | } |
9d6dea5f | 100 | Vector2 Vector2::divide(float f) const |
ad9f1fb6 | 101 | { |
9d6dea5f | 102 | return Vector2(m_fX / f, m_fY / f); |
ad9f1fb6 PG |
103 | } |
104 | ||
617dcc71 | 105 | /// ***** Public Methods ***** |
ad9f1fb6 PG |
106 | |
107 | Vector2 operator+(const Vector2& vec1, const Vector2& vec2) | |
108 | { | |
617dcc71 | 109 | return vec1.add(vec2); |
ad9f1fb6 PG |
110 | } |
111 | Vector2 operator-(const Vector2& vec1, const Vector2& vec2) | |
112 | { | |
617dcc71 | 113 | return vec1.subtract(vec2); |
ad9f1fb6 | 114 | } |
9d6dea5f | 115 | Vector2 operator*(float f, const Vector2& vec) |
ad9f1fb6 | 116 | { |
9d6dea5f | 117 | return vec.multiply(f); |
ad9f1fb6 | 118 | } |
9d6dea5f | 119 | Vector2 operator*(const Vector2& vec, float f) |
ad9f1fb6 | 120 | { |
9d6dea5f | 121 | return vec.multiply(f); |
ad9f1fb6 | 122 | } |
9d6dea5f | 123 | Vector2 operator/(const Vector2& vec, float f) |
ad9f1fb6 | 124 | { |
9d6dea5f | 125 | return vec.divide(f); |
ad9f1fb6 PG |
126 | } |
127 | ||
128 | ||
129 | void operator+=(Vector2& vec1, const Vector2& vec2) | |
130 | { | |
9d6dea5f PG |
131 | vec1.m_fX += vec2.m_fX; |
132 | vec1.m_fY += vec2.m_fY; | |
ad9f1fb6 PG |
133 | } |
134 | void operator-=(Vector2& vec1, const Vector2& vec2) | |
135 | { | |
9d6dea5f PG |
136 | vec1.m_fX -= vec2.m_fX; |
137 | vec1.m_fY -= vec2.m_fY; | |
ad9f1fb6 | 138 | } |
9d6dea5f | 139 | void operator*=(Vector2& vec, float f) |
ad9f1fb6 | 140 | { |
9d6dea5f PG |
141 | vec.m_fX *= f; |
142 | vec.m_fY *= f; | |
ad9f1fb6 | 143 | } |
9d6dea5f | 144 | void operator/=(Vector2& vec, float f) |
ad9f1fb6 | 145 | { |
9d6dea5f PG |
146 | vec.m_fX /= f; |
147 | vec.m_fY /= f; | |
ad9f1fb6 | 148 | } |