05ca0d3376
- aggiunto FIST 6.8 ( già modificato per integrazione nelle nostre librerie).
311 lines
8.0 KiB
C
311 lines
8.0 KiB
C
/*****************************************************************************/
|
|
/* */
|
|
/* F I S T : Fast, Industrial-Strength Triangulation */
|
|
/* */
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* (C) Martin Held */
|
|
/* (C) Universitaet Salzburg, Salzburg, Austria */
|
|
/* */
|
|
/* This code is not in the public domain. All rights reserved! Please make */
|
|
/* sure to read the full copyright statement contained in api_functions.cpp. */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
#ifndef _BASIC_H_
|
|
#define _BASIC_H_
|
|
|
|
#ifndef RAND
|
|
#define RND_MAX 2147483647
|
|
|
|
#define UniformRandom(x) \
|
|
{\
|
|
x = ((machine_double) random()) / RND_MAX; }
|
|
|
|
#define RandomInteger(var, N) \
|
|
(\
|
|
assert(N > 0), \
|
|
var = random(), \
|
|
var - (var / (N)) * (N))
|
|
|
|
#define InitRandom(seed) \
|
|
{\
|
|
srandom(seed); }
|
|
|
|
#else
|
|
|
|
#ifdef RAND_MAX
|
|
#define RND_MAX RAND_MAX
|
|
#else
|
|
#define RND_MAX 32767
|
|
#endif
|
|
|
|
#define UniformRandom(x) \
|
|
{\
|
|
x = ((machine_double) rand()) / RND_MAX; }
|
|
|
|
#define RandomInteger(var, N) \
|
|
(\
|
|
assert(N > 0), \
|
|
var = rand(), \
|
|
var - (var / (N)) * (N))
|
|
|
|
#define InitRandom(seed) \
|
|
{\
|
|
srand(seed); }
|
|
|
|
#endif
|
|
|
|
|
|
#define RandomVertex(a) \
|
|
{\
|
|
UniformRandom((a).x); \
|
|
UniformRandom((a).y); \
|
|
UniformRandom((a).z); }
|
|
|
|
|
|
|
|
#define DetExp(u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z) \
|
|
((u_x) * ((v_y) * (w_z) - (v_z) * (w_y)) - \
|
|
(u_y) * ((v_x) * (w_z) - (v_z) * (w_x)) + \
|
|
(u_z) * ((v_x) * (w_y) - (v_y) * (w_x)))
|
|
|
|
|
|
#define Det3D(u, v, w) \
|
|
((u).x * ((v).y * (w).z - (v).z * (w).y) - \
|
|
(u).y * ((v).x * (w).z - (v).z * (w).x) + \
|
|
(u).z * ((v).x * (w).y - (v).y * (w).x))
|
|
|
|
|
|
#define Det2D(u, v, w) \
|
|
(((u).x - (v).x) * ((v).y - (w).y) + ((v).y - (u).y) * ((v).x - (w).x))
|
|
|
|
|
|
#define Length2D(u) \
|
|
(((u).x * (u).x) + ((u).y * (u).y))
|
|
|
|
|
|
#define Length2(u) \
|
|
(((u).x * (u).x) + ((u).y * (u).y) + ((u).z * (u).z))
|
|
|
|
|
|
#define Length_l1(u) \
|
|
(Abs((u).x) + Abs((u).y) + Abs((u).z))
|
|
|
|
|
|
#define Length_l2(u) \
|
|
sqrt(((u).x * (u).x) + ((u).y * (u).y) + ((u).z * (u).z))
|
|
|
|
|
|
#define DotProduct(u, v) \
|
|
(((u).x * (v).x) + ((u).y * (v).y) + ((u).z * (v).z))
|
|
|
|
|
|
#define DotProduct2D(u, v) \
|
|
(((u).x * (v).x) + ((u).y * (v).y))
|
|
|
|
#define DotProduct2DTMD(u, v) \
|
|
((TO_MDOUBLE((u).x) * TO_MDOUBLE((v).x)) + (TO_MDOUBLE((u).y) * TO_MDOUBLE((v).y)))
|
|
|
|
#define VectorProduct(p, q, r) \
|
|
{(r).x = (p).y * (q).z - (q).y * (p).z; \
|
|
(r).y = (q).x * (p).z - (p).x * (q).z; \
|
|
(r).z = (p).x * (q).y - (q).x * (p).y; }
|
|
|
|
|
|
#define VectorAdd(p, q, r) \
|
|
{(r).x = (p).x + (q).x; \
|
|
(r).y = (p).y + (q).y; \
|
|
(r).z = (p).z + (q).z; }
|
|
|
|
#define LinearComb(p, q, r, t) \
|
|
{(r).x = (p).x + (t) * ((q).x - (p).x); \
|
|
(r).y = (p).y + (t) * ((q).y - (p).y); \
|
|
(r).z = (p).z + (t) * ((q).z - (p).z); }
|
|
|
|
#define VectorSub(p, q, r) \
|
|
{(r).x = (p).x - (q).x; \
|
|
(r).y = (p).y - (q).y; \
|
|
(r).z = (p).z - (q).z; }
|
|
|
|
|
|
#define VectorAdd2D(p, q, r) \
|
|
{(r).x = (p).x + (q).x; \
|
|
(r).y = (p).y + (q).y; }
|
|
|
|
|
|
#define VectorSub2D(p, q, r) \
|
|
{(r).x = (p).x - (q).x; \
|
|
(r).y = (p).y - (q).y; }
|
|
|
|
|
|
#define LinearComb2D(p, q, r, t) \
|
|
{(r).x = (p).x + (t) * ((q).x - (p).x); \
|
|
(r).y = (p).y + (t) * ((q).y - (p).y); }
|
|
|
|
#define InvertVector(p) \
|
|
{(p).x = -(p).x; \
|
|
(p).y = -(p).y; \
|
|
(p).z = -(p).z; }
|
|
|
|
|
|
#define MultScalar(scalar, u) \
|
|
{(u).x *= scalar; \
|
|
(u).y *= scalar; \
|
|
(u).z *= scalar; }
|
|
|
|
|
|
#define DivScalar(scalar, u) \
|
|
{(u).x /= scalar; \
|
|
(u).y /= scalar; \
|
|
(u).z /= scalar; }
|
|
|
|
|
|
#define InvertVector2D(p) \
|
|
{(p).x = -(p).x; \
|
|
(p).y = -(p).y; }
|
|
|
|
|
|
#define MultScalar2D(scalar, u) \
|
|
{(u).x *= scalar; \
|
|
(u).y *= scalar; }
|
|
|
|
|
|
#define DivScalar2D(scalar, u) \
|
|
{(u).x /= scalar; \
|
|
(u).y /= scalar; }
|
|
|
|
|
|
#define SignEps(var, x, eps) \
|
|
(var = (x), \
|
|
((var <= eps) ? ((var < -eps) ? -1 : 0) : 1))
|
|
|
|
|
|
#define MinMax3(a, b, c, min, max) {\
|
|
if ((a) < (b)) {\
|
|
if ((a) < (c)) {\
|
|
min = (a); \
|
|
if ((b) < (c)) max = (c); \
|
|
else max = (b); \
|
|
}\
|
|
else { \
|
|
min = (c); \
|
|
max = (b); \
|
|
}\
|
|
}\
|
|
else { \
|
|
if ((a) < (c)) {\
|
|
min = (b); \
|
|
max = (c); \
|
|
} \
|
|
else { \
|
|
max = (a); \
|
|
if ((b) < (c)) min = (b); \
|
|
else min = (c); \
|
|
} \
|
|
}\
|
|
}
|
|
|
|
|
|
#define MinMax4(a, b, c, d, min, max) {\
|
|
if ((a) < (b)) {\
|
|
if ((a) < (c)) {\
|
|
min = (a); \
|
|
if ((b) < (c)) max = (c); \
|
|
else max = (b); \
|
|
} \
|
|
else { \
|
|
min = (c); \
|
|
max = (b); \
|
|
} \
|
|
}\
|
|
else { \
|
|
if ((a) < (c)) { \
|
|
min = (b); \
|
|
max = (c); \
|
|
} \
|
|
else { \
|
|
max = (a); \
|
|
if ((b) < (c)) min = (b); \
|
|
else min = (c); \
|
|
}\
|
|
} \
|
|
if ((d) < min) min = (d); \
|
|
else if ((d) > max) max = (d); \
|
|
}
|
|
|
|
|
|
|
|
#define ScaleX(data,xc) ((xc - data->shift.x) * data->scale_factor)
|
|
|
|
#define ScaleY(data,yc) ((yc - data->shift.y) * data->scale_factor)
|
|
|
|
#define UnscaleX(data,xc) (data->shift.x + xc / data->scale_factor)
|
|
|
|
#define UnscaleY(data,yc) (data->shift.y + yc / data->scale_factor)
|
|
|
|
|
|
|
|
#define SortTwoNumbers(a, b, c) {\
|
|
if (a > b) { \
|
|
c = a; \
|
|
a = b; \
|
|
b = c; \
|
|
} \
|
|
}
|
|
|
|
|
|
|
|
#define SortThreeNumbers(a, b, c, d) {\
|
|
if (a < b) {\
|
|
if (a < c) {\
|
|
if (b > c) {\
|
|
d = b; \
|
|
b = c; \
|
|
c = d; \
|
|
}\
|
|
}\
|
|
else { \
|
|
d = a; \
|
|
a = c; \
|
|
c = b; \
|
|
b = d; \
|
|
}\
|
|
}\
|
|
else { \
|
|
if (a < c) { \
|
|
d = a; \
|
|
a = b; \
|
|
b = d; \
|
|
} \
|
|
else { \
|
|
if (b < c) {\
|
|
d = a; \
|
|
a = b; \
|
|
b = c; \
|
|
c = d; \
|
|
}\
|
|
else { \
|
|
d = a; \
|
|
a = c; \
|
|
c = d; \
|
|
}\
|
|
}\
|
|
}\
|
|
}
|
|
|
|
|
|
#define MinMax(a, b, min, max) {\
|
|
if ((b) < (a)) {\
|
|
min = (b); \
|
|
max = (a); \
|
|
} \
|
|
else { \
|
|
min = (a); \
|
|
max = (b); \
|
|
} \
|
|
}
|
|
|
|
#endif
|
|
|