TORCS  1.3.9
The Open Racing Car Simulator
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 
32 class Vector : public Tuple3 {
33 public:
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 
57 Vector operator+(const Vector& v1, const Vector& v2);
58 Vector operator-(const Vector& v1, const Vector& v2);
59 Vector operator-(const Vector& v);
60 Vector operator*(const Vector& v, Scalar s);
61 Vector operator*(Scalar s, const Vector& v);
62 Vector operator/(const Vector& v, Scalar s);
63 
64 Scalar dot(const Vector& v1, const Vector& v2);
65 
66 Scalar length2(const Vector& v);
67 Scalar length(const Vector& v);
68 
69 bool approxZero(const Vector& v);
70 bool approxEqual(const Vector& v1, const Vector& v2);
71 
72 Scalar angle(const Vector& v1, const Vector& v2);
73 Vector cross(const Vector& v1, const Vector& v2);
74 Scalar triple(const Vector& v1, const Vector& v2, const Vector& v3);
75 
76 
77 
78 inline Vector& Vector::operator+=(const Vector& v) {
79  comp[X] += v[X]; comp[Y] += v[Y]; comp[Z] += v[Z];
80  return *this;
81 }
82 
83 inline 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 
98 inline 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 
102 inline 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 
106 inline Vector operator-(const Vector& v) {
107  return Vector(-v[X], -v[Y], -v[Z]);
108 }
109 
110 inline Vector operator*(const Vector& v, Scalar s) {
111  return Vector(v[X] * s, v[Y] * s, v[Z] * s);
112 }
113 
114 inline Vector operator*(Scalar s, const Vector& v) { return v * s; }
115 
116 inline Vector operator/(const Vector& v, Scalar s) {
117  assert(!eqz(s));
118  return v * (1 / s);
119 }
120 
121 inline Scalar dot(const Vector& v1, const Vector& v2) {
122  return v1[X] * v2[X] + v1[Y] * v2[Y] + v1[Z] * v2[Z];
123 }
124 
125 inline Scalar Vector::length2() const { return dot(*this, *this); }
126 inline Scalar Vector::length() const { return sqrt(length2()); }
127 
128 inline bool Vector::approxZero() const { return length2() < EPSILON2; }
129 
130 inline void Vector::normalize() { *this /= length(); }
131 inline Vector Vector::normalized() const { return *this / length(); }
132 
133 inline 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 
146 inline Scalar length2(const Vector& v) { return v.length2(); }
147 inline Scalar length(const Vector& v) { return v.length(); }
148 
149 inline bool approxZero(const Vector& v) { return v.approxZero(); }
150 inline bool approxEqual(const Vector& v1, const Vector& v2) {
151  return approxZero(v1 - v2);
152 }
153 
154 inline 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 
160 inline 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 
166 inline 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 
static Vector random()
Definition: Vector.h:139
Scalar length(const Vector &v)
Definition: Vector.h:147
Scalar dot(const Vector &v1, const Vector &v2)
Definition: Vector.h:121
Vector(const double v[3])
Definition: Vector.h:36
Scalar length2(const Vector &v)
Definition: Vector.h:146
Scalar triple(const Vector &v1, const Vector &v2, const Vector &v3)
Definition: Vector.h:166
Vector normalized() const
Definition: Vector.h:131
Scalar length() const
Definition: Vector.h:126
Vector(const float v[3])
Definition: Vector.h:35
Scalar rnd()
Definition: Basic.h:45
Vector & operator+=(const Vector &v)
Definition: Vector.h:78
Definition: Basic.h:58
bool approxZero() const
Definition: Vector.h:128
Vector operator*(const Vector &v, Scalar s)
Definition: Vector.h:110
Scalar angle(const Vector &v1, const Vector &v2)
Definition: Vector.h:154
Definition: Basic.h:58
Vector cross(const Vector &v1, const Vector &v2)
Definition: Vector.h:160
Definition: Tuple3.h:37
Vector & operator/=(Scalar s)
Definition: Vector.h:93
Vector operator+(const Vector &v1, const Vector &v2)
Definition: Vector.h:98
Vector()
Definition: Vector.h:34
Scalar length2() const
Definition: Vector.h:125
Vector operator-(const Vector &v1, const Vector &v2)
Definition: Vector.h:102
Definition: Basic.h:58
Scalar comp[3]
Definition: Tuple3.h:63
const Scalar EPSILON2
Definition: Basic.h:40
Vector operator/(const Vector &v, Scalar s)
Definition: Vector.h:116
bool approxZero(const Vector &v)
Definition: Vector.h:149
static Vector y[4]
Definition: Convex.cpp:56
const Scalar TWO_PI
Definition: Basic.h:38
#define Scalar
Definition: Basic.h:34
void normalize()
Definition: Vector.h:130
Vector & operator*=(Scalar s)
Definition: Vector.h:88
bool eqz(Scalar x)
Definition: Basic.h:47
Definition: Vector.h:32
bool approxEqual(const Vector &v1, const Vector &v2)
Definition: Vector.h:150
Vector(Scalar x, Scalar y, Scalar z)
Definition: Vector.h:37
int closestAxis() const
Definition: Vector.h:133
Vector & operator-=(const Vector &v)
Definition: Vector.h:83