13void vec3_print(
const vec3 *v )
15 for (
int i = 0; i < 3; i++)
16 printf(
"%7.5g ", v->v[i] );
20void vec3_copy(
vec3 *o,
const vec3 *i )
22 for (
int j = 0; j < 3; j++)
35 for (
int i = 0; i < 3; i++)
36 out->v[i] = a->v[i] + b->v[i];
48 for (
int i = 0; i < 3; i++)
49 out->v[i] = a->v[i] - b->v[i];
61void vec3_wadd(
vec3 *out,
const vec3 *a,
const vec3 *b,
double wa,
double wb )
63 for (
int i = 0; i < 3; i++)
64 out->v[i] = wa * a->v[i] + wb * b->v[i];
76 for (
int i = 0; i < 3; i++)
77 out->v[i] =
MAX( a->v[i], b->v[i] );
89 for (
int i = 0; i < 3; i++)
90 out->v[i] =
MIN( a->v[i], b->v[i] );
100double vec3_dot(
const vec3 *a,
const vec3 *b )
102 return a->v[0] * b->v[0] + a->v[1] * b->v[1] + a->v[2] * b->v[2];
112void vec3_cross(
vec3 *out,
const vec3 *a,
const vec3 *b )
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];
124void vec3_normalize(
vec3 *a )
126 double n = vec3_length( a );
127 for (
int i = 0; i < 3; i++)
138double vec3_dist(
const vec3 *a,
const vec3 *b )
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] ) );
150double vec3_length(
const vec3 *a )
152 return sqrt( vec3_dot( a, a ) );
158void vec3_scale(
vec3 *v,
double s )
160 for (
int i = 0; i < 3; i++)
170double vec3_distPointTriangle(
const vec3 *point,
const vec3 tri[3] )
172 vec3 diff, edge0, edge1, res;
173 double a00, a01, a11, b0, b1, det, s, t;
175 vec3_sub( &diff, &tri[0], point );
176 vec3_sub( &edge0, &tri[1], &tri[0] );
177 vec3_sub( &edge1, &tri[2], &tri[0] );
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;
229 double tmp0, tmp1, numer, denom;
236 denom = a00 - 2. * a01 + a11;
237 if (numer >= denom) {
258 denom = a00 - 2. * a01 + a11;
259 if (numer >= denom) {
276 numer = a11 + b1 - a01 - b0;
281 denom = a00 - 2. * a01 + a11;
282 if (numer >= denom) {
293 vec3_wadd( &res, &edge0, &edge1, s, t );
294 vec3_add( &res, &res, &tri[0] );
295 return vec3_dist( point, &res );
Header file with generic functions and naev-specifics.