KrisLibrary  1.0.0
vecinline.h
1 #ifndef MATH3D_VECTOR_INLINES_H
2 #define MATH3D_VECTOR_INLINES_H
3 
4 #include "inlinetypes.h"
5 
6 namespace Math3D {
7 
8 /*****************************vec2 operations*******************************/
9 
10 //x = 0
11 inline void vec2_zero(vec2_t x)
12 {
13  x[0]=x[1]=Zero;
14 }
15 
16 //x = (a,b)
17 inline void vec2_make(vec2_t x, Real a, Real b)
18 {
19  x[0] = a;
20  x[1] = b;
21 }
22 
23 //x = a
24 inline void vec2_equal(vec2_t x, const vec2_t a)
25 {
26  x[0]=a[0];
27  x[1]=a[1];
28 }
29 
30 //x = a+b
31 inline void vec2_add(vec2_t x, const vec2_t a, const vec2_t b)
32 {
33  x[0] = a[0]+b[0];
34  x[1] = a[1]+b[1];
35 }
36 
37 //x = a-b
38 inline void vec2_sub(vec2_t x, const vec2_t a, const vec2_t b)
39 {
40  x[0] = a[0]-b[0];
41  x[1] = a[1]-b[1];
42 }
43 
44 //x = a*c
45 inline void vec2_multiply(vec2_t x, const vec2_t a, Real c)
46 {
47  x[0] = a[0]*c;
48  x[1] = a[1]*c;
49 }
50 
51 //x += a*c
52 inline void vec2_madd(vec2_t x, const vec2_t a, Real c)
53 {
54  x[0] += a[0]*c;
55  x[1] += a[1]*c;
56 }
57 
58 //x = -a
59 inline void vec2_negate(vec2_t x, const vec2_t a)
60 {
61  x[0] = -a[0];
62  x[1] = -a[1];
63 }
64 
65 //returns dot(a,b)
66 inline Real vec2_dot(const vec2_t a, const vec2_t b)
67 {
68  return a[0]*b[0] + a[1]*b[1];
69 }
70 
71 //returns a cross b
72 inline float vec2_cross(const vec2_t a, const vec2_t b)
73 {
74  return a[0]*b[1] - a[1]*b[0];
75 }
76 
77 //returns |x|
78 inline Real vec2_length(const vec2_t x)
79 {
80  return Sqrt(vec2_dot(x,x));
81 }
82 
83 //normalizes x
84 inline void vec2_normalize(vec2_t x)
85 {
86  Real l = Sqrt(vec2_dot(x,x));
87  if(FuzzyZero(l)) return;
88  vec2_multiply(x, x, Inv(l));
89 }
90 
91 //x = orthogonal projection of a onto b = <a,b>/<b,b>*b
92 inline void vec2_project(vec2_t x, const vec2_t a, const vec2_t b)
93 {
94  vec2_multiply(x, b, vec2_dot(a,b)/vec2_dot(b,b));
95 }
96 
97 
98 /*****************************vec3 operations*******************************/
99 
100 //x = 0
101 inline void vec3_zero(vec3_t x)
102 {
103  x[0]=x[1]=x[2]=Zero;
104 }
105 
106 //x = (a,b,c)
107 inline void vec3_make(vec3_t x, Real a, Real b, Real c)
108 {
109  x[0] = a;
110  x[1] = b;
111  x[2] = c;
112 }
113 
114 //x = a
115 inline void vec3_equal(vec3_t x, const vec3_t a)
116 {
117  x[0]=a[0];
118  x[1]=a[1];
119  x[2]=a[2];
120 }
121 
122 //x = a+b
123 inline void vec3_add(vec3_t x, const vec3_t a, const vec3_t b)
124 {
125  x[0] = a[0]+b[0];
126  x[1] = a[1]+b[1];
127  x[2] = a[2]+b[2];
128 }
129 
130 //x = a-b
131 inline void vec3_sub(vec3_t x, const vec3_t a, const vec3_t b)
132 {
133  x[0] = a[0]-b[0];
134  x[1] = a[1]-b[1];
135  x[2] = a[2]-b[2];
136 }
137 
138 //x = a*c
139 inline void vec3_multiply(vec3_t x, const vec3_t a, Real c)
140 {
141  x[0] = a[0]*c;
142  x[1] = a[1]*c;
143  x[2] = a[2]*c;
144 }
145 
146 //x += a*c
147 inline void vec3_madd(vec3_t x, const vec3_t a, Real c)
148 {
149  x[0] += a[0]*c;
150  x[1] += a[1]*c;
151  x[2] += a[2]*c;
152 }
153 
154 //x = -a
155 inline void vec3_negate(vec3_t x, const vec3_t a)
156 {
157  x[0] = -a[0];
158  x[1] = -a[1];
159  x[2] = -a[2];
160 }
161 
162 //returns dot(a,b)
163 inline Real vec3_dot(const vec3_t a, const vec3_t b)
164 {
165  return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
166 }
167 
168 //x = a cross b
169 inline void vec3_cross(vec3_t x, const vec3_t a, const vec3_t b)
170 {
171  x[0] = a[1]*b[2] - a[2]*b[1];
172  x[1] = a[2]*b[0] - a[0]*b[2];
173  x[2] = a[0]*b[1] - a[1]*b[0];
174 }
175 
176 //returns |x|
177 inline Real vec3_length(const vec3_t x)
178 {
179  return Sqrt(vec3_dot(x,x));
180 }
181 
182 //normalizes x
183 inline void vec3_normalize(vec3_t x)
184 {
185  Real l = Sqrt(vec3_dot(x,x));
186  if(FuzzyZero(l)) return;
187  vec3_multiply(x, x, Inv(l));
188 }
189 
190 //x = orthogonal projection of a onto b = <a,b>/<b,b>*b
191 inline void vec3_project(vec3_t x, const vec3_t a, const vec3_t b)
192 {
193  vec3_multiply(x, b, vec3_dot(a,b)/vec3_dot(b,b));
194 }
195 
196 
197 /*****************************vec4 operations*******************************/
198 
199 
200 //x = 0
201 inline void vec4_zero(vec4_t x)
202 {
203  x[0]=x[1]=x[2]=x[3]=Zero;
204 }
205 
206 //x = (a,b,c,d)
207 inline void vec4_make(vec4_t x, Real a, Real b, Real c, Real d)
208 {
209  x[0]=a;
210  x[1]=b;
211  x[2]=c;
212  x[3]=d;
213 }
214 
215 //x = a
216 inline void vec4_equal(vec4_t x, const vec4_t a)
217 {
218  x[0]=a[0];
219  x[1]=a[1];
220  x[2]=a[2];
221  x[3]=a[3];
222 }
223 
224 //x = a+b
225 inline void vec4_add(vec4_t x, const vec4_t a, const vec4_t b)
226 {
227  x[0] = a[0]+b[0];
228  x[1] = a[1]+b[1];
229  x[2] = a[2]+b[2];
230  x[3] = a[3]+b[3];
231 }
232 
233 //x = a-b
234 inline void vec4_sub(vec4_t x, const vec4_t a, const vec4_t b)
235 {
236  x[0] = a[0]-b[0];
237  x[1] = a[1]-b[1];
238  x[2] = a[2]-b[2];
239  x[3] = a[3]-b[3];
240 }
241 
242 //x = a*c
243 inline void vec4_multiply(vec4_t x, const vec4_t a, Real c)
244 {
245  x[0] = a[0]*c;
246  x[1] = a[1]*c;
247  x[2] = a[2]*c;
248  x[3] = a[3]*c;
249 }
250 
251 //x += a*c
252 inline void vec4_madd(vec4_t x, const vec4_t a, Real c)
253 {
254  x[0] += a[0]*c;
255  x[1] += a[1]*c;
256  x[2] += a[2]*c;
257  x[3] += a[3]*c;
258 }
259 
260 //x = -a
261 inline void vec4_negate(vec4_t x, const vec4_t a)
262 {
263  x[0] = -a[0];
264  x[1] = -a[1];
265  x[2] = -a[2];
266  x[3] = -a[3];
267 }
268 
269 //returns dot(a,b)
270 inline Real vec4_dot(const vec4_t a, const vec4_t b)
271 {
272  return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
273 }
274 
275 //normalizes x
276 inline void vec4_normalize(vec4_t x)
277 {
278  Real l = Sqrt(vec4_dot(x,x));
279  if(FuzzyZero(l)) return;
280  vec4_multiply(x, x, Inv(l));
281 }
282 
283 //x = homogeneous orthogonal projection of a onto plane b:(n,d) = a - <a,b>/<n,n>*n
284 inline void vec4_plane_project(vec4_t x, const vec4_t a, const vec4_t b)
285 {
286  vec4_t n;
287  vec3_equal(n, b);
288  n[3] = Zero;
289  vec4_multiply(x, n, vec4_dot(a,b)/vec3_dot(b,b));
290  vec4_sub(x, a, x);
291 }
292 
293 } //namespace Math3D
294 
295 
296 #endif
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:12
double Inv(double x)
1/x
Definition: math.h:205