13 #define POINT_REAL Real
20 void set(
const S u,
const S v,
const S w)
26 void operator= (
const S v)
32 void operator= (
const S* v)
34 x = v[0], y = v[1], z = v[2];
38 void operator= (S * v)
40 x = v[0], y = v[1], z = v[2];
44 void operator= (
const vec3<S> & v)
46 x = v.x, y = v.y, z = v.z;
50 void operator+= (
const S* v)
52 x += v[0], y += v[1], z += v[2];
55 void operator+= (
const vec3<V> & v)
61 void operator-= (
const vec3<V> & v)
67 void operator*= (
const V s)
74 void operator/= (
const V s)
82 typedef vec3<POINT_REAL>
Point;
85 inline V
det3(
const vec3<V> & a,
const vec3<V> & b,
const vec3<V> & c)
87 return (a.x*b.y*c.z + a.y*b.z*c.x + a.z*b.x*c.y - a.x*b.z*c.y - a.y*b.x*c.z - a.z*b.y*c.x);
91 inline V
dist_2(
const vec3<V> & p1,
const vec3<V> & p2)
94 (p1.x - p2.x)*(p1.x-p2.x) +
95 (p1.y - p2.y)*(p1.y-p2.y) +
96 (p1.z - p2.z)*(p1.z-p2.z);
97 if (d<0 || d!= d)
return 0. ;
102 inline V
angle(
const vec3<V> & v1,
const vec3<V> & v2) {
103 return fabs(
dot(v1, v2)) / (
mag(v1)*
mag(v2));
107 inline V
dist(
const vec3<V> & p1,
const vec3<V> & p2)
109 return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y - p2.y)*(p1.y-p2.y) + (p1.z - p2.z)*(p1.z-p2.z));
113 inline V
dot(
const vec3<V> & p1,
const vec3<V> & p2)
115 return p1.x*p2.x + p1.y*p2.y + p1.z*p2.z;
119 inline V
mag(
const vec3<V> & vect)
121 return sqrt(vect.x*vect.x + vect.y*vect.y + vect.z*vect.z);
126 inline V
mag2(
const vec3<V> & vect)
128 return vect.x*vect.x + vect.y*vect.y + vect.z*vect.z;
132 inline vec3<V>
cross(
const vec3<V> & a,
const vec3<V> & b)
134 return {a.y*b.z - b.y*a.z, b.x*a.z - a.x*b.z, a.x*b.y - a.y*b.x};
138 inline vec3<V> triple_cross(
const vec3<V> & a,
const vec3<V> & b,
const vec3<V> & c)
140 const V s0 =
dot(c, b);
141 const V s1 =
dot(c, a);
142 return {-s0*a.x+s1*b.x, -s0*a.y+s1*b.y, -s0*a.z+s1*b.z};
145 template<
typename V,
typename S>
146 inline vec3<V>
scal_X(
const vec3<V> & a, S k)
148 return {a.x * k, a.y * k, a.z * k};
152 inline vec3<V>
operator* (
const vec3<V> & a, V k)
154 return {a.x * k, a.y * k, a.z * k};
158 inline vec3<V>
scale3(
const vec3<V> & a,
const vec3<V> & k)
169 inline vec3<V>
operator- (
const vec3<V> & a,
const vec3<V> & b)
178 inline vec3<V>
operator+ (
const vec3<V> & a,
const vec3<V> & b)
199 inline double *
v_scale(
int n,
double *a,
double k,
double *b)
210 inline float *
v_scale_f(
int n,
float *a,
double k,
double *b)
221 inline vec3<V>
mid_point(vec3<V> a, vec3<V> b)
223 return {(a.x + b.x)/2.0, (a.y + b.y)/2.0, (a.z + b.z)/2.0};
228 inline vec3<V>
rotate_z(vec3<V> p,
double theta)
230 double cost = cos(theta);
231 double sint = sin(theta);
232 return {cost*p.x+sint*p.y, -sint*p.x+cost*p.y, p.z};
237 inline vec3<V>
rotate_y(vec3<V> p,
double theta)
239 double cost = cos(theta);
240 double sint = sin(theta);
241 return {cost*p.x-sint*p.z, p.y, sint*p.x+cost*p.z};
246 inline vec3<V>
rotate_x(vec3<V> p,
double theta)
248 double cost = cos(theta);
249 double sint = sin(theta);
250 return { p.x, cost*p.y+sint*p.z, -sint*p.y+cost*p.z};
262 fprintf(out,
"%s = {\n",
outfile);
263 for (i=0 ; i<n; i++) {
265 for (j=0 ; j<n; j++) {
266 if (a[i][j] < 0.0 + eps && a[i][j] > 0.0 - eps)
267 fprintf(out,
"%.12f 10^%.0f", 0.0, 0.0);
269 fprintf(out,
"%.12f 10^%.0f",
270 a[i][j]/pow(10.0, floor(log10(fabs(a[i][j])))),
271 floor(log10(fabs(a[i][j]))));
273 fprintf(out,
", \n");
286 inline vec3<V>
p_project(vec3<V> A, vec3<V> B)
302 inline double triple_prod(vec3<V> a, vec3<V> b, vec3<V> c)
309 inline bool isNaN(vec3<V> a)
311 return ((a.x != a.x) || (a.y != a.y) || (a.z != a.z));
316 inline double infnorm(
const vec3<V> & a)
318 double max = std::abs(a.x);
void dot(data_t *x, data_t *y, int n, int nc, FILE *out, bool pt)
perform dot product
void normalize(IGBheader *h, FILE *out, T *min, T *max)
normalize pixels over all time
void magnitude(data_t *x, int n, int nc, FILE *out)
determine magnitude at each point
constexpr T max(T a, T b)
vec3< V > scale3(const vec3< V > &a, const vec3< V > &k)
V det3(const vec3< V > &a, const vec3< V > &b, const vec3< V > &c)
double triple_prod(vec3< V > a, vec3< V > b, vec3< V > c)
vec3< V > scal_X(const vec3< V > &a, S k)
void matrix_mathematica(int n, double **a, char *outfile)
vec3< V > operator+(const vec3< V > &a, const vec3< V > &b)
vec3< V > operator*(const vec3< V > &a, V k)
double * v_scale(int n, double *a, double k, double *b)
vec3< V > rotate_x(vec3< V > p, double theta)
vec3< V > p_project(vec3< V > A, vec3< V > B)
vec3< V > cross(const vec3< V > &a, const vec3< V > &b)
V dist(const vec3< V > &p1, const vec3< V > &p2)
vec3< V > p_transverse(vec3< V > A, vec3< V > B)
vec3< V > mid_point(vec3< V > a, vec3< V > b)
V mag(const vec3< V > &vect)
V dist_2(const vec3< V > &p1, const vec3< V > &p2)
vec3< V > operator-(const vec3< V > &a, const vec3< V > &b)
float * v_scale_f(int n, float *a, double k, double *b)
vec3< V > rotate_z(vec3< V > p, double theta)
double infnorm(const vec3< V > &a)
vec3< V > rotate_y(vec3< V > p, double theta)
V angle(const vec3< V > &v1, const vec3< V > &v2)
V mag2(const vec3< V > &vect)