naev 0.11.5
vec3.c
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
5#include <stdio.h>
6#include <stdlib.h>
7
8#include "naev.h"
11#include <math.h>
12
13#include "vec3.h"
14
22void vec3_add( vec3 *out, const vec3 *a, const vec3 *b )
23{
24 for (int i=0; i<3; i++)
25 out->v[i] = a->v[i] + b->v[i];
26}
27
35void vec3_sub( vec3 *out, const vec3 *a, const vec3 *b )
36{
37 for (int i=0; i<3; i++)
38 out->v[i] = a->v[i] - b->v[i];
39}
40
50void vec3_wadd( vec3 *out, const vec3 *a, const vec3 *b, double wa, double wb )
51{
52 for (int i=0; i<3; i++)
53 out->v[i] = wa*a->v[i] + wb*b->v[i];
54}
55
63void vec3_max( vec3 *out, const vec3 *a, const vec3 *b )
64{
65 for (int i=0; i<3; i++)
66 out->v[i] = MAX( a->v[i], b->v[i] );
67}
68
76void vec3_min( vec3 *out, const vec3 *a, const vec3 *b )
77{
78 for (int i=0; i<3; i++)
79 out->v[i] = MIN( a->v[i], b->v[i] );
80}
81
89double vec3_dot( const vec3 *a, const vec3 *b )
90{
91 return a->v[0]*b->v[0] + a->v[1]*b->v[1] + a->v[2]*b->v[2];
92}
93
101void vec3_cross( vec3 *out, const vec3 *a, const vec3 *b )
102{
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];
106}
107
113void vec3_normalize( vec3 *a )
114{
115 double n = vec3_length(a);
116 for (int i=0; i<3; i++)
117 a->v[i] /= n;
118}
119
127double vec3_dist( const vec3 *a, const vec3 *b )
128{
129 return sqrt( pow2(a->v[0]-b->v[0]) + pow2(a->v[1]-b->v[1]) + pow2(a->v[2]-b->v[2]) );
130}
131
138double vec3_length( const vec3 *a )
139{
140 return sqrt( vec3_dot( a, a ) );
141}
142
148double vec3_distPointTriangle( const vec3 *point, const vec3 tri[3] )
149{
150 vec3 diff, edge0, edge1, res;
151 double a00, a01, a11, b0, b1, det, s, t;
152
153 vec3_sub( &diff, &tri[0], point );
154 vec3_sub( &edge0, &tri[1], &tri[0] );
155 vec3_sub( &edge1, &tri[2], &tri[0] );
156
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;
165
166 if (s + t <= det) {
167 if (s < 0.) {
168 if (t < 0.) { // region 4
169 if (b0 < 0.) {
170 t = 0.;
171 if (-b0 >= a00)
172 s = 1.;
173 else
174 s = -b0 / a00;
175 }
176 else {
177 s = 0.;
178 if (b1 >= 0.)
179 t = 0.;
180 else if (-b1 >= a11)
181 t = 1.;
182 else
183 t = -b1 / a11;
184 }
185 }
186 else { // region 3
187 s = 0.;
188 if (b1 >= 0.)
189 t = 0.;
190 else if (-b1 >= a11)
191 t = 1.;
192 else
193 t = -b1 / a11;
194 }
195 }
196 else if (t < 0.) { // region 5
197 t = 0.;
198 if (b0 >= 0.)
199 s = 0.;
200 else if (-b0 >= a00)
201 s = 1.;
202 else
203 s = -b0 / a00;
204 }
205 else { // region 0
206 // minimum at interior point
207 s /= det;
208 t /= det;
209 }
210 }
211 else {
212 double tmp0, tmp1, numer, denom;
213
214 if (s < 0.) { // region 2
215 tmp0 = a01 + b0;
216 tmp1 = a11 + b1;
217 if (tmp1 > tmp0) {
218 numer = tmp1 - tmp0;
219 denom = a00 - 2. * a01 + a11;
220 if (numer >= denom) {
221 s = 1.;
222 t = 0.;
223 }
224 else {
225 s = numer / denom;
226 t = 1. - s;
227 }
228 }
229 else {
230 s = 0.;
231 if (tmp1 <= 0.)
232 t = 1.;
233 else if (b1 >= 0.)
234 t = 0.;
235 else
236 t = -b1 / a11;
237 }
238 }
239 else if (t < 0.) { // region 6
240 tmp0 = a01 + b1;
241 tmp1 = a00 + b0;
242 if (tmp1 > tmp0) {
243 numer = tmp1 - tmp0;
244 denom = a00 - 2. * a01 + a11;
245 if (numer >= denom) {
246 t = 1.;
247 s = 0.;
248 }
249 else {
250 t = numer / denom;
251 s = 1. - t;
252 }
253 }
254 else {
255 t = 0.;
256 if (tmp1 <= 0.)
257 s = 1.;
258 else if (b0 >= 0.)
259 s = 0.;
260 else
261 s = -b0 / a00;
262 }
263 }
264 else { // region 1
265 numer = a11 + b1 - a01 - b0;
266 if (numer <= 0.) {
267 s = 0.;
268 t = 1.;
269 }
270 else {
271 denom = a00 - 2. * a01 + a11;
272 if (numer >= denom) {
273 s = 1.;
274 t = 0.;
275 }
276 else {
277 s = numer / denom;
278 t = 1. - s;
279 }
280 }
281 }
282 }
283
284 vec3_wadd( &res, &edge0, &edge1, s, t );
285 vec3_add( &res, &res, &tri[0] );
286 return vec3_dist( point, &res );
287 /*
288 result.closest[0] = point;
289 result.closest[1] = triangle.v[0] + s * edge0 + t * edge1;
290 diff = result.closest[0] - result.closest[1];
291 result.sqrDistance = Dot(diff, diff);
292 result.distance = std::sqrt(result.sqrDistance);
293 result.barycentric[0] = one - s - t;
294 result.barycentric[1] = s;
295 result.barycentric[2] = t;
296 return result;
297 */
298}
Header file with generic functions and naev-specifics.
#define MIN(x, y)
Definition naev.h:40
#define pow2(x)
Definition naev.h:46
#define MAX(x, y)
Definition naev.h:39
Definition vec3.h:6