31 if ((x == 0) && (y == 0)) result = 0;
32 else result = atan2 (y, x);
43 for (
int j = 0; j<3; ++j) v[j] = c.v[j];
49 v[0]=x; v[1]=y; v[2]=z;
54 return (index < 3) ? * (v + index) : *v;
59 for (
int j = 0; j<3; ++j) v[j] = c.v[j];
65 for (
int j = 0; j<3; ++j) v[j] = v[j] + c.v[j];
71 for (
int j = 0; j<3; ++j) v[j] = v[j] - c.v[j];
78 result.v[0] = v[1] * c.v[2] - v[2] * c.v[1];
79 result.v[1] = v[2] * c.v[0] - v[0] * c.v[2];
80 result.v[2] = v[0] * c.v[1] - v[1] * c.v[0];
81 for (
int j = 0; j<3; ++j) v[j] = result.v[j];
87 for (
int j = 0; j<3; ++j) v[j] = r * v[j];
95 if (r < 1E-100) q = 0.0;
97 for (
int j = 0; j<3; ++j) v[j] = q * v[j];
105 for (
int j=0; j<3; ++j) result += c.v[j]*c.v[j];
113 for (
int j = 0; j<3; ++j) result += c1.v[j]*c2.v[j];
121 for (
int j = 0; j<3; ++j) result.v[j] = c1.v[j] + c2.v[j];
129 for (
int j = 0; j<3; ++j) result.v[j] = c1.v[j] - c2.v[j];
138 for (
int j = 0; j<3; ++j) result.v[j] = r * c1.v[j];
146 for (
int j = 0; j<3; ++j) result.v[j] = c1.v[j] * r;
154 result.v[0] = c1.v[1] * c2.v[2] - c1.v[2] * c2.v[1];
155 result.v[1] = c1.v[2] * c2.v[0] - c1.v[0] * c2.v[2];
156 result.v[2] = c1.v[0] * c2.v[1] - c1.v[1] * c2.v[0];
165 if (r < 1E-100) q = 0.0;
167 for (
int j = 0; j<3; ++j) result.v[j] = q * c1.v[j];
177 for (j=0; j<3; ++j) q += c.v[j]*c.v[j];
179 if (q < 1E-100) q = 0.0;
181 for (j=0; j<3; ++j) result.v[j] = c.v[j]*q;
199 result.v[0] = sqrt (r + z*z);
200 result.v[1] =
atan20 (y, x);
201 if (result.v[1] < 0) result.v[1] += 2.0*
M_PI;
203 result.v[2] =
atan20 (z, r);
218 r = c.v[0] * cos(c.v[2]);
219 result.v[0] = r * cos(c.v[1]);
220 result.v[1] = r * sin(c.v[1]);
221 result.v[2] = c.v[0] * sin(c.v[2]);
228 os <<
"[" << c.v[0] <<
"," << c.v[1] <<
"," << c.v[2] <<
"]";
239 for (j=0; j<3; ++j) m[i][j] = x;
247 for (j=0; j<3; ++j) m[i][j] = c.
m[i][j];
251 double x21,
double x22,
double x23,
252 double x31,
double x32,
double x33)
270 for (j=0; j<3; ++j) m[i][j] = x[i][j];
275 if ((i>0) && (i<4) && (j>0) && (j<4)) m[i-1][j-1] = x;
282 if ((i>0) && (i<4) && (j>0) && (j<4)) result = m[i-1][j-1];
293 for (j=0; j<3; ++j) m[i][j] = c.
m[i][j];
303 for (j=0; j<3; ++j) m[i][j] = m[i][j] + c.
m[i][j];
312 for (j=0; j<3; ++j) m[i][j] = m[i][j] - c.
m[i][j];
326 for (k=0; k<3; ++k) r = r + c.
m[i][k] * m[k][j];
331 for (j=0; j<3; ++j) m[i][j] = b.
m[i][j];
341 for (j=0; j<3; ++j) m[i][j] = r*m[i][j];
350 if (r < 1E-100) q = 0.0;
354 for (j=0; j<3; ++j) m[i][j] = m[i][j] * q;
364 for (j=0; j<3; ++j) result.
m[i][j] = r;
375 for (i=0; i<3; ++i) result.
m[i][i] = 1.0;
386 for (j=0; j<3; ++j) result.
m[i][j] = m1.
m[j][i];
395 result = c.
m[0][0]*c.
m[1][1]*c.
m[2][2] + c.
m[0][1]*c.
m[1][2]*c.
m[2][0]
396 + c.
m[0][2]*c.
m[1][0]*c.
m[2][1] - c.
m[0][2]*c.
m[1][1]*c.
m[2][0]
397 - c.
m[0][0]*c.
m[1][2]*c.
m[2][1] - c.
m[0][1]*c.
m[1][0]*c.
m[2][2];
408 for (j=0; j<3; ++j) result.
m[i][j] = c1.
m[i][j] + c2.
m[i][j];
418 for (j=0; j<3; ++j) result.
m[i][j] = c1.
m[i][j] - c2.
m[i][j];
428 for (j=0; j<3; ++j) result.
m[i][j] = c1.
m[i][j] * r;
439 for (j=0; j<3; ++j) result.
m[i][j] = c1.
m[i][j] * r;
453 for (k=0; k<3; k++) r = r + c1.
m[i][k] * c2.
m[k][j];
466 if (r < 1E-100) q = 0.0;
470 for (j=0; j<3; ++j) result.
m[i][j] = c1.
m[i][j] * q;
483 for (j=0; j<3; ++j) r = r + m1.
m[i][j] * v1[j];
558 Mat3 pitch, yaw, roll, result;
563 result = yaw * pitch;
569 void gpyr (
const Mat3& m1,
double& p,
double& y,
double& r)
574 y = asin (m1.
m[0][1]);
575 r =
atan20 (-m1.
m[2][1], m1.
m[1][1]);
576 p =
atan20 (-m1.
m[0][2], m1.
m[0][0]);
585 y =
atan20 (v[1], sqrt (v[0]*v[0] + v[2]*v[2]));
594 p =
M_PI / 2.0 -
atan20 (v[0], sqrt (v[1]*v[1] + v[2]*v[2]));
602 double ri, rj, rk, q1, q2, q3, q4;
606 ri =
atan20 (m.
m[2][0], -m.
m[2][1]);
607 rj = 0.5 * acos (m.
m[2][2]);
612 q1 = q4 * cos (0.5 * (ri - rk));
613 q2 = q4 * sin (0.5 * (ri - rk));
615 q3 = q4 * sin (0.5 * (ri + rk));
616 q4 = q4 * cos (0.5 * (ri + rk));
625 q4 = 0.5 * sqrt (1.0 + m.
m[0][0] + m.
m[1][1] + m.
m[2][2]);
637 double q1, q2, q3, q4, q12, q22, q32, q42;
652 result.
assign ((q12 - q22 - q32 + q42), (2.0 * (q1*q2 + q3*q4)),
653 (2.0 * (q1*q3 - q2*q4)), (2.0 * (q1*q2 - q3*q4)),
654 (-q12 + q22 - q32 + q42),(2.0 * (q2*q3 + q1*q4)),
655 (2.0 * (q1*q3 + q2*q4)), (2.0 * (q2*q3 - q1*q4)),
656 (-q12 - q22 + q32 + q42));
664 os <<
"[" << c.
m[0][0] <<
"," << c.
m[0][1] <<
"," << c.
m[0][2] <<
"]" << endl
665 <<
"[" << c.
m[1][0] <<
"," << c.
m[1][1] <<
"," << c.
m[1][2] <<
"]" << endl
666 <<
"[" << c.
m[2][0] <<
"," << c.
m[2][1] <<
"," << c.
m[2][2] <<
"]" << endl;
double GetMij(int i, int j)
double & operator[](unsigned index)
Mat3 & operator-=(const Mat3 &c)
void vcpy(Vec3 &v, double &p, double &y)
double atan20(double y, double x)
Vec3 operator/(const Vec3 &c1, double r)
Vec3 operator-(const Vec3 &c1, const Vec3 &c2)
Mat3 & operator+=(const Mat3 &c)
void gpyr(const Mat3 &m1, double &p, double &y, double &r)
Vec3 carpol(const Vec3 &c)
Vec3 vnorm(const Vec3 &c)
Vec3 operator+(const Vec3 &c1, const Vec3 &c2)
void assign(double x11, double x12, double x13, double x21, double x22, double x23, double x31, double x32, double x33)
Mat3 & operator=(const Mat3 &c)
void vcrp(Vec3 &v, double &p, double &r)
double abs(const Vec3 &c)
Vec3 & operator*=(const Vec3 &c)
Mat3 & operator*=(const Mat3 &c)
Mat3 mxrox(double &a, Vec3 &v)
void mxevc(const Mat3 &m, double &a, Vec3 &v)
double mxdet(const Mat3 &c)
Mat3 mxtrn(const Mat3 &m1)
Mat3 csmx(double p, double y, double r)
ostream & operator<<(ostream &os, const Vec3 &c)
Vec3 & operator/=(double r)
Vec3 operator*(double r, const Vec3 &c1)
Mat3 & operator/=(double r)
Vec3 & operator-=(const Vec3 &c)
void assign(double x=0, double y=0, double z=0)
Vec3 & operator+=(const Vec3 &c)
Vec3 & operator=(const Vec3 &c)
double dot(const Vec3 &c1, const Vec3 &c2)
Vec3 polcar(const Vec3 &c)
Vec3 mxvct(const Mat3 &m1, Vec3 &v1)
Vec3(double x=0, double y=0, double z=0)
void PutMij(double x, int i, int j)