1 #include <iostream>
2
3 class Vector3
4 {
5 public:
6 float x ;
7 float y ;
8 float z ;
9
10 Vector3()
11 {
12 }
13
14 Vector3(const Vector3 & a): x(a.x), y(a.y), z(a.z)
15 {
16 }
17
18 Vector3(float x, float y, float z): x(x), y(y), z(z)
19 {
20 }
21
22 Vector3 & operator= (const Vector3& a)
23 {
24 x= a.x ;
25 y = a.y ;
26 z = a.z ;
27
28 return *this ;
29 }
30
31 bool operator == (const Vector3 & a) const
32 {
33 return x == a.x && y == a.y && z == a.z ;
34 }
35
36 bool operator != (const Vector3 & a) const
37 {
38 return x != a.x || y != a.y || z != a.z ;
39 }
40
41 void Zero()
42 {
43 x = 0 ;
44 y = 0 ;
45 z = 0 ;
46 }
47
48 Vector3 operator - () const
49 {
50 return Vector3(-x, -y, -z) ;
51 }
52
53 Vector3 operator + (const Vector3 & a) const
54 {
55 return Vector3(x + a.x, y + a.y, z + a.z) ;
56 }
57
58
59 Vector3 operator - (const Vector3 & a) const
60 {
61 return Vector3(x - a.x, y - a.y, z - a.z) ;
62 }
63
64 Vector3 operator * (float a) const
65 {
66 return Vector3(x * a, y * a, z * a) ;
67 }
68
69 Vector3 operator / (const float a) const
70 {
71 float oneOverA = 1 / a ;
72 return Vector3(x * oneOverA, y * oneOverA, z * oneOverA) ;
73 }
74
75 Vector3 operator += (const Vector3 & a)
76 {
77 x += a.x ;
78 y += a.y ;
79 z+= a.z ;
80
81 return *this ;
82 }
83
84 Vector3 operator -= (const Vector3 & a)
85 {
86 x -= a.x ;
87 y -= a.y ;
88 z -= a.z ;
89
90 return *this ;
91 }
92
93 Vector3 operator *= (float a)
94 {
95 x *= a ;
96 y *= a ;
97 z *= a ;
98
99 return *this ;
100 }
101
102 Vector3 operator /= (float a)
103 {
104 float oneOverA = 1 / a ;
105 x *= oneOverA ;
106 y *= oneOverA ;
107 z *= oneOverA ;
108
109 return *this ;
110 }
111
112 void Normalize()
113 {
114 float magSq = x * x + y * y + z * z ;
115 if (magSq > 0)
116 {
117 float oneOverMsg = 1 / sqrt(magSq) ;
118 x *= oneOverMsg ;
119 y *= oneOverMsg ;
120 z *= oneOverMsg ;
121 }
122 }
123
124 float operator * (const Vector3 & a) const
125 {
126 return x * a.x + y * a.y + z * a.z ;
127 }
128
129 inline float VectorMag(const Vector3 & a)
130 {
131 return sqrt(a.x * a.x + a.y * a.y + a.z * a.z) ;
132 }
133 } ;
134
135 inline Vector3 CrossProduct(const Vector3 & a, const Vector3 & b)
136 {
137 return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x) ;
138 }
139
140 inline Vector3 operator * (float k, const Vector3 & v)
141 {
142 return Vector3(k * v.x, k * v.y, k * v.z) ;
143 }
144
145 inline float Distance(const Vector3 & a, const Vector3 & b)
146 {
147 float dx = a.x - b.x ;
148 float dy = a.y - b.y ;
149 float dz = a.z - b.z ;
150
151 return sqrt(dx * dx + dy * dy + dz * dz) ;
152 }
153
154 extern const Vector3 & ZeroVector ;