35 #define POINT_REAL double 46 {x = ix, y = iy, z = iz;}
49 vec3(S ix, S iy, S iz) : x(ix), y(iy), z(iz)
53 x = v.x; y = v.y; z = v.z;
58 x = v[0], y = v[1], z = v[2];
63 x = v.
x, y = v.
y, z = v.
z;
98 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);
105 (p1.
x-p2.
x)*(p1.
x-p2.
x) +
106 (p1.
y-p2.
y)*(p1.
y-p2.
y) +
107 (p1.
z-p2.
z)*(p1.
z-p2.
z);
109 if (d<0 || d!= d)
return 0. ;
116 return sqrt(
dist_2(p1, p2));
121 return fabs(
dot(v1, v2)) / (
mag(v1)*
mag(v2));
127 return p1.
x*p2.
x + p1.
y*p2.
y + p1.
z*p2.
z;
133 return sqrt(vect.
x*vect.
x + vect.
y*vect.
y + vect.
z*vect.
z);
140 return vect.
x*vect.
x + vect.
y*vect.
y + vect.
z*vect.
z;
146 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};
149 template<
typename V,
typename S>
152 return {a.
x * k, a.
y * k, a.
z * k};
158 return {a.
x * k, a.
y * k, a.
z * k};
164 return {a.
x / k, a.
y / k, a.
z / k};
209 inline double *
v_scale(
int n,
double *a,
double k,
double *b)
220 inline float *
v_scale_f(
int n,
float *a,
double k,
double *b)
233 return {(a.
x + b.
x)/2.0, (a.
y + b.
y)/2.0, (a.
z + b.
z)/2.0};
240 double cost = cos(theta);
241 double sint = sin(theta);
242 return {cost*p.
x+sint*p.
y, -sint*p.
x+cost*p.
y, p.
z};
249 double cost = cos(theta);
250 double sint = sin(theta);
251 return {cost*p.
x-sint*p.
z, p.
y, sint*p.
x+cost*p.
z};
258 double cost = cos(theta);
259 double sint = sin(theta);
260 return { p.
x, cost*p.
y+sint*p.
z, -sint*p.
y+cost*p.
z};
270 out = fopen(outfile,
"w");
271 fprintf(out,
"%s = {\n", outfile);
272 for (i=0 ; i<n; i++) {
274 for (j=0 ; j<n; j++) {
275 fprintf(out,
"%.12f 10^%.0f", a[i][j] != 0.0 ?
276 a[i][j]/pow(10.0, floor(log10(fabs(a[i][j])))) : 0.0,
277 a[i][j] != 0.0 ?floor(log10(fabs(a[i][j]))) : 0.0) ;
279 fprintf(out,
", \n");
317 return ((a.
x != a.
x) || (a.
y != a.
y) || (a.
z != a.
z));
324 double max = std::abs(a.
x);
double * v_scale(int n, double *a, double k, double *b)
vec3< V > rotate_x(vec3< V > p, double theta)
void magnitude(data_t *x, int n, int nc, FILE *out)
determine magnitude at each point
vec3< V > mid_point(vec3< V > a, vec3< V > b)
vec3< V > operator*(const vec3< V > &a, V k)
constexpr T max(T a, T b)
vec3< V > rotate_z(vec3< V > p, double theta)
double triple_prod(vec3< V > a, vec3< V > b, vec3< V > c)
void operator/=(const V s)
vec3< V > operator-(const vec3< V > &a, const vec3< V > &b)
vec3< V > rotate_y(vec3< V > p, double theta)
vec3< V > p_transverse(vec3< V > A, vec3< V > B)
V det3(const vec3< V > &a, const vec3< V > &b, const vec3< V > &c)
vec3< V > normalize(vec3< V > a)
double infnorm(const vec3< V > &a)
vec3< V > operator/(const vec3< V > &a, V k)
V angle(const vec3< V > &v1, const vec3< V > &v2)
vec3< V > cross(const vec3< V > &a, const vec3< V > &b)
V mag2(const vec3< V > &vect)
void operator+=(const vec3< V > &v)
void matrix_mathematica(int n, double **a, char *outfile)
V mag(const vec3< V > &vect)
void operator*=(const V s)
float * v_scale_f(int n, float *a, double k, double *b)
void assign(S ix, S iy, S iz)
void operator-=(const vec3< V > &v)
V dot(const vec3< V > &p1, const vec3< V > &p2)
vec3< V > operator+(const vec3< V > &a, const vec3< V > &b)
vec3< V > scal_X(const vec3< V > &a, S k)
vec3< V > p_project(vec3< V > A, vec3< V > B)
V dist(const vec3< V > &p1, const vec3< V > &p2)
V dist_2(const vec3< V > &p1, const vec3< V > &p2)
vec3< V > scale3(const vec3< V > &a, const vec3< V > &k)
void operator=(const S *v)