TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
Vector.h
Go to the documentation of this file.
1/*
2 3D - C++ Class Library for 3D Transformations
3 Copyright (C) 1996-1998 Gino van den Bergen
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 Please send remarks, questions and bug reports to gino@win.tue.nl,
20 or write to:
21 Gino van den Bergen
22 Department of Mathematics and Computing Science
23 Eindhoven University of Technology
24 P.O. Box 513, 5600 MB Eindhoven, The Netherlands
25*/
26
27#ifndef _VECTOR_H_
28#define _VECTOR_H_
29
30#include "Tuple3.h"
31
32class Vector : public Tuple3 {
33public:
34 Vector() {}
35 Vector(const float v[3]) : Tuple3(v) {}
36 Vector(const double v[3]) : Tuple3(v) {}
37 Vector(Scalar x, Scalar y, Scalar z) : Tuple3(x, y, z) {}
38
39 Vector& operator+=(const Vector& v);
40 Vector& operator-=(const Vector& v);
43
44 Scalar length2() const;
45 Scalar length() const;
46
47 bool approxZero() const;
48
49 void normalize();
50 Vector normalized() const;
51
52 int closestAxis() const;
53
54 static Vector random();
55};
56
57Vector operator+(const Vector& v1, const Vector& v2);
58Vector operator-(const Vector& v1, const Vector& v2);
59Vector operator-(const Vector& v);
60Vector operator*(const Vector& v, Scalar s);
61Vector operator*(Scalar s, const Vector& v);
62Vector operator/(const Vector& v, Scalar s);
63
64Scalar dot(const Vector& v1, const Vector& v2);
65
66Scalar length2(const Vector& v);
67Scalar length(const Vector& v);
68
69bool approxZero(const Vector& v);
70bool approxEqual(const Vector& v1, const Vector& v2);
71
72Scalar angle(const Vector& v1, const Vector& v2);
73Vector cross(const Vector& v1, const Vector& v2);
74Scalar triple(const Vector& v1, const Vector& v2, const Vector& v3);
75
76
77
78inline Vector& Vector::operator+=(const Vector& v) {
79 comp[X] += v[X]; comp[Y] += v[Y]; comp[Z] += v[Z];
80 return *this;
81}
82
83inline Vector& Vector::operator-=(const Vector& v) {
84 comp[X] -= v[X]; comp[Y] -= v[Y]; comp[Z] -= v[Z];
85 return *this;
86}
87
89 comp[X] *= s; comp[Y] *= s; comp[Z] *= s;
90 return *this;
91}
92
94 assert(!eqz(s));
95 return *this *= 1 / s;
96}
97
98inline Vector operator+(const Vector& v1, const Vector& v2) {
99 return Vector(v1[X] + v2[X], v1[Y] + v2[Y], v1[Z] + v2[Z]);
100}
101
102inline Vector operator-(const Vector& v1, const Vector& v2) {
103 return Vector(v1[X] - v2[X], v1[Y] - v2[Y], v1[Z] - v2[Z]);
104}
105
106inline Vector operator-(const Vector& v) {
107 return Vector(-v[X], -v[Y], -v[Z]);
108}
109
110inline Vector operator*(const Vector& v, Scalar s) {
111 return Vector(v[X] * s, v[Y] * s, v[Z] * s);
112}
113
114inline Vector operator*(Scalar s, const Vector& v) { return v * s; }
115
116inline Vector operator/(const Vector& v, Scalar s) {
117 assert(!eqz(s));
118 return v * (1 / s);
119}
120
121inline Scalar dot(const Vector& v1, const Vector& v2) {
122 return v1[X] * v2[X] + v1[Y] * v2[Y] + v1[Z] * v2[Z];
123}
124
125inline Scalar Vector::length2() const { return dot(*this, *this); }
126inline Scalar Vector::length() const { return sqrt(length2()); }
127
128inline bool Vector::approxZero() const { return length2() < EPSILON2; }
129
130inline void Vector::normalize() { *this /= length(); }
131inline Vector Vector::normalized() const { return *this / length(); }
132
133inline int Vector::closestAxis() const {
134 Scalar a[2];
135 int axis = (a[X] = fabs(comp[X])) < (a[Y] = fabs(comp[Y])) ? Y : X;
136 return a[axis] < fabs(comp[Z]) ? Z : axis;
137}
138
140 Scalar z = 2 * rnd() - 1;
141 Scalar r = sqrt(1 - z * z);
142 Scalar t = TWO_PI * rnd();
143 return Vector(r * cos(t), r * sin(t), z);
144}
145
146inline Scalar length2(const Vector& v) { return v.length2(); }
147inline Scalar length(const Vector& v) { return v.length(); }
148
149inline bool approxZero(const Vector& v) { return v.approxZero(); }
150inline bool approxEqual(const Vector& v1, const Vector& v2) {
151 return approxZero(v1 - v2);
152}
153
154inline Scalar angle(const Vector& v1, const Vector& v2) {
155 Scalar s = sqrt(v1.length2() * v2.length2());
156 assert(!eqz(s));
157 return acos(dot(v1, v2) / s);
158}
159
160inline Vector cross(const Vector& v1, const Vector& v2) {
161 return Vector(v1[Y] * v2[Z] - v1[Z] * v2[Y],
162 v1[Z] * v2[X] - v1[X] * v2[Z],
163 v1[X] * v2[Y] - v1[Y] * v2[X]);
164}
165
166inline Scalar triple(const Vector& v1, const Vector& v2, const Vector& v3) {
167 return v1[X] * (v2[Y] * v3[Z] - v2[Z] * v3[Y]) +
168 v1[Y] * (v2[Z] * v3[X] - v2[X] * v3[Z]) +
169 v1[Z] * (v2[X] * v3[Y] - v2[Y] * v3[X]);
170}
171
172#endif
173
Scalar rnd()
Definition Basic.h:45
const Scalar EPSILON2
Definition Basic.h:40
@ Y
Definition Basic.h:58
@ X
Definition Basic.h:58
@ Z
Definition Basic.h:58
const Scalar TWO_PI
Definition Basic.h:38
bool eqz(Scalar x)
Definition Basic.h:47
#define Scalar
Definition Basic.h:34
static Vector y[4]
Definition Convex.cpp:56
Vector operator+(const Vector &v1, const Vector &v2)
Definition Vector.h:98
bool approxEqual(const Vector &v1, const Vector &v2)
Definition Vector.h:150
Vector operator*(const Vector &v, Scalar s)
Definition Vector.h:110
Scalar length2(const Vector &v)
Definition Vector.h:146
Scalar dot(const Vector &v1, const Vector &v2)
Definition Vector.h:121
Scalar length(const Vector &v)
Definition Vector.h:147
Scalar triple(const Vector &v1, const Vector &v2, const Vector &v3)
Definition Vector.h:166
Vector operator-(const Vector &v1, const Vector &v2)
Definition Vector.h:102
Scalar angle(const Vector &v1, const Vector &v2)
Definition Vector.h:154
Vector cross(const Vector &v1, const Vector &v2)
Definition Vector.h:160
bool approxZero(const Vector &v)
Definition Vector.h:149
Vector operator/(const Vector &v, Scalar s)
Definition Vector.h:116
Scalar comp[3]
Definition Tuple3.h:63
Tuple3()
Definition Tuple3.h:39
Scalar length() const
Definition Vector.h:126
Vector & operator/=(Scalar s)
Definition Vector.h:93
bool approxZero() const
Definition Vector.h:128
Vector & operator*=(Scalar s)
Definition Vector.h:88
Vector()
Definition Vector.h:34
Vector(const double v[3])
Definition Vector.h:36
void normalize()
Definition Vector.h:130
static Vector random()
Definition Vector.h:139
Vector(const float v[3])
Definition Vector.h:35
Vector & operator-=(const Vector &v)
Definition Vector.h:83
Vector normalized() const
Definition Vector.h:131
Vector & operator+=(const Vector &v)
Definition Vector.h:78
Scalar length2() const
Definition Vector.h:125
Vector(Scalar x, Scalar y, Scalar z)
Definition Vector.h:37
int closestAxis() const
Definition Vector.h:133