24 for (
int i=0; i<3; i++)
25 out->v[i] = a->v[i] + b->v[i];
37 for (
int i=0; i<3; i++)
38 out->v[i] = a->v[i] - b->v[i];
50void vec3_wadd(
vec3 *out,
const vec3 *a,
const vec3 *b,
double wa,
double wb )
52 for (
int i=0; i<3; i++)
53 out->v[i] = wa*a->v[i] + wb*b->v[i];
65 for (
int i=0; i<3; i++)
66 out->v[i] =
MAX( a->v[i], b->v[i] );
78 for (
int i=0; i<3; i++)
79 out->v[i] =
MIN( a->v[i], b->v[i] );
89double vec3_dot(
const vec3 *a,
const vec3 *b )
91 return a->v[0]*b->v[0] + a->v[1]*b->v[1] + a->v[2]*b->v[2];
101void vec3_cross(
vec3 *out,
const vec3 *a,
const vec3 *b )
103 out->v[0] = a->v[1]*b->v[2] - a->v[2]*b->v[1];
104 out->v[1] = -a->v[0]*b->v[2] + a->v[2]*b->v[0];
105 out->v[2] = a->v[0]*b->v[1] - a->v[1]*b->v[0];
113void vec3_normalize(
vec3 *a )
115 double n = vec3_length(a);
116 for (
int i=0; i<3; i++)
127double vec3_dist(
const vec3 *a,
const vec3 *b )
129 return sqrt(
pow2(a->v[0]-b->v[0]) +
pow2(a->v[1]-b->v[1]) +
pow2(a->v[2]-b->v[2]) );
138double vec3_length(
const vec3 *a )
140 return sqrt( vec3_dot( a, a ) );
148double vec3_distPointTriangle(
const vec3 *point,
const vec3 tri[3] )
150 vec3 diff, edge0, edge1, res;
151 double a00, a01, a11, b0, b1, det, s, t;
153 vec3_sub( &diff, &tri[0], point );
154 vec3_sub( &edge0, &tri[1], &tri[0] );
155 vec3_sub( &edge1, &tri[2], &tri[0] );
157 a00 = vec3_dot( &edge0, &edge0 );
158 a01 = vec3_dot( &edge0, &edge1 );
159 a11 = vec3_dot( &edge1, &edge1 );
160 b0 = vec3_dot( &diff, &edge0 );
161 b1 = vec3_dot( &diff, &edge1 );
162 det =
MAX( a00*a11 - a01*a01, 0. );
163 s = a01 * b1 - a11 * b0;
164 t = a01 * b0 - a00 * b1;
212 double tmp0, tmp1, numer, denom;
219 denom = a00 - 2. * a01 + a11;
220 if (numer >= denom) {
244 denom = a00 - 2. * a01 + a11;
245 if (numer >= denom) {
265 numer = a11 + b1 - a01 - b0;
271 denom = a00 - 2. * a01 + a11;
272 if (numer >= denom) {
284 vec3_wadd( &res, &edge0, &edge1, s, t );
285 vec3_add( &res, &res, &tri[0] );
286 return vec3_dist( point, &res );
Header file with generic functions and naev-specifics.