naev 0.12.6
vec3.c
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
5#include "naev.h"
7
8#include <math.h>
9#include <stdio.h>
10
11#include "vec3.h"
12
13void vec3_print( const vec3 *v )
14{
15 for (int i = 0; i < 3; i++)
16 printf( "%7.5g ", v->v[i] );
17 printf( "\n" );
18}
19
20void vec3_copy( vec3 *o, const vec3 *i )
21{
22 for (int j = 0; j < 3; j++)
23 o->v[j] = i->v[j];
24}
25
33void vec3_add( vec3 *out, const vec3 *a, const vec3 *b )
34{
35 for (int i = 0; i < 3; i++)
36 out->v[i] = a->v[i] + b->v[i];
37}
38
46void vec3_sub( vec3 *out, const vec3 *a, const vec3 *b )
47{
48 for (int i = 0; i < 3; i++)
49 out->v[i] = a->v[i] - b->v[i];
50}
51
61void vec3_wadd( vec3 *out, const vec3 *a, const vec3 *b, double wa, double wb )
62{
63 for (int i = 0; i < 3; i++)
64 out->v[i] = wa * a->v[i] + wb * b->v[i];
65}
66
74void vec3_max( vec3 *out, const vec3 *a, const vec3 *b )
75{
76 for (int i = 0; i < 3; i++)
77 out->v[i] = MAX( a->v[i], b->v[i] );
78}
79
87void vec3_min( vec3 *out, const vec3 *a, const vec3 *b )
88{
89 for (int i = 0; i < 3; i++)
90 out->v[i] = MIN( a->v[i], b->v[i] );
91}
92
100double vec3_dot( const vec3 *a, const vec3 *b )
101{
102 return a->v[0] * b->v[0] + a->v[1] * b->v[1] + a->v[2] * b->v[2];
103}
104
112void vec3_cross( vec3 *out, const vec3 *a, const vec3 *b )
113{
114 out->v[0] = a->v[1] * b->v[2] - a->v[2] * b->v[1];
115 out->v[1] = -a->v[0] * b->v[2] + a->v[2] * b->v[0];
116 out->v[2] = a->v[0] * b->v[1] - a->v[1] * b->v[0];
117}
118
124void vec3_normalize( vec3 *a )
125{
126 double n = vec3_length( a );
127 for (int i = 0; i < 3; i++)
128 a->v[i] /= n;
129}
130
138double vec3_dist( const vec3 *a, const vec3 *b )
139{
140 return sqrt( pow2( a->v[0] - b->v[0] ) + pow2( a->v[1] - b->v[1] ) +
141 pow2( a->v[2] - b->v[2] ) );
142}
143
150double vec3_length( const vec3 *a )
151{
152 return sqrt( vec3_dot( a, a ) );
153}
154
158void vec3_scale( vec3 *v, double s )
159{
160 for (int i = 0; i < 3; i++)
161 v->v[i] *= s;
162}
163
170double vec3_distPointTriangle( const vec3 *point, const vec3 tri[3] )
171{
172 vec3 diff, edge0, edge1, res;
173 double a00, a01, a11, b0, b1, det, s, t;
174
175 vec3_sub( &diff, &tri[0], point );
176 vec3_sub( &edge0, &tri[1], &tri[0] );
177 vec3_sub( &edge1, &tri[2], &tri[0] );
178
179 a00 = vec3_dot( &edge0, &edge0 );
180 a01 = vec3_dot( &edge0, &edge1 );
181 a11 = vec3_dot( &edge1, &edge1 );
182 b0 = vec3_dot( &diff, &edge0 );
183 b1 = vec3_dot( &diff, &edge1 );
184 det = MAX( a00 * a11 - a01 * a01, 0. );
185 s = a01 * b1 - a11 * b0;
186 t = a01 * b0 - a00 * b1;
187
188 if (s + t <= det) {
189 if (s < 0.) {
190 if (t < 0.) { // region 4
191 if (b0 < 0.) {
192 t = 0.;
193 if (-b0 >= a00)
194 s = 1.;
195 else
196 s = -b0 / a00;
197 } else {
198 s = 0.;
199 if (b1 >= 0.)
200 t = 0.;
201 else if (-b1 >= a11)
202 t = 1.;
203 else
204 t = -b1 / a11;
205 }
206 } else { // region 3
207 s = 0.;
208 if (b1 >= 0.)
209 t = 0.;
210 else if (-b1 >= a11)
211 t = 1.;
212 else
213 t = -b1 / a11;
214 }
215 } else if (t < 0.) { // region 5
216 t = 0.;
217 if (b0 >= 0.)
218 s = 0.;
219 else if (-b0 >= a00)
220 s = 1.;
221 else
222 s = -b0 / a00;
223 } else { // region 0
224 // minimum at interior point
225 s /= det;
226 t /= det;
227 }
228 } else {
229 double tmp0, tmp1, numer, denom;
230
231 if (s < 0.) { // region 2
232 tmp0 = a01 + b0;
233 tmp1 = a11 + b1;
234 if (tmp1 > tmp0) {
235 numer = tmp1 - tmp0;
236 denom = a00 - 2. * a01 + a11;
237 if (numer >= denom) {
238 s = 1.;
239 t = 0.;
240 } else {
241 s = numer / denom;
242 t = 1. - s;
243 }
244 } else {
245 s = 0.;
246 if (tmp1 <= 0.)
247 t = 1.;
248 else if (b1 >= 0.)
249 t = 0.;
250 else
251 t = -b1 / a11;
252 }
253 } else if (t < 0.) { // region 6
254 tmp0 = a01 + b1;
255 tmp1 = a00 + b0;
256 if (tmp1 > tmp0) {
257 numer = tmp1 - tmp0;
258 denom = a00 - 2. * a01 + a11;
259 if (numer >= denom) {
260 t = 1.;
261 s = 0.;
262 } else {
263 t = numer / denom;
264 s = 1. - t;
265 }
266 } else {
267 t = 0.;
268 if (tmp1 <= 0.)
269 s = 1.;
270 else if (b0 >= 0.)
271 s = 0.;
272 else
273 s = -b0 / a00;
274 }
275 } else { // region 1
276 numer = a11 + b1 - a01 - b0;
277 if (numer <= 0.) {
278 s = 0.;
279 t = 1.;
280 } else {
281 denom = a00 - 2. * a01 + a11;
282 if (numer >= denom) {
283 s = 1.;
284 t = 0.;
285 } else {
286 s = numer / denom;
287 t = 1. - s;
288 }
289 }
290 }
291 }
292
293 vec3_wadd( &res, &edge0, &edge1, s, t );
294 vec3_add( &res, &res, &tri[0] );
295 return vec3_dist( point, &res );
296 /*
297 result.closest[0] = point;
298 result.closest[1] = triangle.v[0] + s * edge0 + t * edge1;
299 diff = result.closest[0] - result.closest[1];
300 result.sqrDistance = Dot(diff, diff);
301 result.distance = std::sqrt(result.sqrDistance);
302 result.barycentric[0] = one - s - t;
303 result.barycentric[1] = s;
304 result.barycentric[2] = t;
305 return result;
306 */
307}
Header file with generic functions and naev-specifics.
#define MIN(x, y)
Definition naev.h:39
#define pow2(x)
Definition naev.h:53
#define MAX(x, y)
Definition naev.h:37
Definition vec3.h:6