77 inline Vector2& operator=(
const T*);
78 inline void set(T, T);
80 inline bool operator==(
const Vector2<T>&)
const;
81 inline bool operator!=(
const Vector2<T>&)
const;
83 inline const T& operator[](
int x)
const;
84 inline T& operator[](
int);
85 inline operator const T*()
const;
90 inline void operator*=(T);
91 inline void operator/=(T);
96 inline Vector2 operator-()
const;
97 inline Vector2 operator+()
const;
99 inline Vector2 operator*(T)
const;
100 inline Vector2 operator/(T)
const;
105 inline T length()
const;
106 inline T lengthSquared()
const;
107 inline void normalize();
116 template<
class T>
class Vector3
126 inline Vector3& operator=(
const T*);
128 inline void set(T, T, T);
130 inline bool operator==(
const Vector3<T>&)
const;
131 inline bool operator!=(
const Vector3<T>&)
const;
133 inline T& operator[](
int);
134 inline const T& operator[](
int)
const;
135 inline operator const T*()
const;
136 inline operator T*();
137 inline const T* data()
const {
return v;}
138 inline T* data() {
return v;}
142 inline void operator*=(T);
143 inline void operator/=(T);
148 inline Vector3 operator-()
const;
149 inline Vector3 operator+()
const;
151 inline Vector3 operator*(T)
const;
152 inline Vector3 operator/(T)
const;
159 inline T latitude()
const;
161 inline T longitude()
const;
165 inline T angleNormalized(
const Vector3<T>&)
const;
167 inline T length()
const;
168 inline T lengthSquared()
const;
169 inline void normalize();
171 inline void transfo4d(
const Mat4d&);
172 inline void transfo4d(
const Mat4f&);
175 QString toString()
const {
return QString(
"[%1, %2, %3]").arg(v[0]).arg(v[1]).arg(v[2]);}
176 QString toStringLonLat()
const {
return QString(
"[") + QString::number(longitude()*180./M_PI,
'g', 12) +
"," + QString::number(latitude()*180./M_PI,
'g', 12)+
"]";}
183 template<
class T>
class Vector4
192 inline Vector4& operator=(
const T*);
193 inline void set(T, T, T, T);
195 inline bool operator==(
const Vector4<T>&)
const;
196 inline bool operator!=(
const Vector4<T>&)
const;
198 inline T& operator[](
int);
199 inline const T& operator[](
int)
const;
200 inline operator T*();
201 inline operator const T*()
const;
205 inline void operator*=(T);
206 inline void operator/=(T);
211 inline Vector4 operator-()
const;
212 inline Vector4 operator+()
const;
214 inline Vector4 operator*(T)
const;
215 inline Vector4 operator/(T)
const;
220 inline T length()
const;
221 inline T lengthSquared()
const;
222 inline void normalize();
224 inline void transfo4d(
const Mat4d&);
232 template<
class T>
class Matrix4
236 Matrix4(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
241 inline Matrix4& operator=(
const T*);
242 inline void set(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
244 inline T& operator[](
int);
245 inline operator T*();
246 inline operator const T*()
const;
272 inline Vector4<T> getRow(
const int row)
const;
273 inline Vector4<T> getColumn(
const int column)
const;
275 inline void print(
void)
const;
281 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector2<T>& v) {out << v[0] << v[1];
return out;}
282 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector3<T>& v) {out << v[0] << v[1] << v[2];
return out;}
283 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector4<T>& v) {out << v[0] << v[1] << v[2] << v[3];
return out;}
284 template<
class T> QDataStream& operator<<(QDataStream& out, const Matrix4<T>& m) {out << m[0] << m[1] << m[2] << m[3] << m[4] << m[5] << m[6] << m[7] << m[8] << m[9] << m[10] << m[11] << m[12] << m[13] << m[14] << m[15];
return out;}
286 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector2<T>& v) {in >> v[0] >> v[1];
return in;}
287 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector3<T>& v) {in >> v[0] >> v[1] >> v[2];
return in;}
288 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector4<T>& v) {in >> v[0] >> v[1] >> v[2] >> v[3];
return in;}
289 template<
class T> QDataStream&
operator>>(QDataStream& in,
Matrix4<T>& m) {in >> m[0] >> m[1] >> m[2] >> m[3] >> m[4] >> m[5] >> m[6] >> m[7] >> m[8] >> m[9] >> m[10] >> m[11] >> m[12] >> m[13] >> m[14] >> m[15];
return in;}
303 v[0]=a[0]; v[1]=a[1];
315 return (v[0] == a.v[0] && v[1] == a.v[1]);
320 return (v[0] != a.v[0] || v[1] != a.v[1]);
346 v[0] += a.v[0]; v[1] += a.v[1];
351 v[0] -= a.v[0]; v[1] -= a.v[1];
356 v[0] *= s; v[1] *= s;
361 v[0] /= s; v[1] /= s;
376 return Vector2<T>(v[0] + b.v[0], v[1] + b.v[1]);
381 return Vector2<T>(v[0] - b.v[0], v[1] - b.v[1]);
397 return v[0] * b.v[0] + v[1] * b.v[1];
403 return (T) std::sqrt(v[0] * v[0] + v[1] * v[1]);
408 return v[0] * v[0] + v[1] * v[1];
413 T s = (T) 1 / std::sqrt(v[0] * v[0] + v[1] * v[1]);
439 v[0]=x; v[1]=x; v[2]=x;
444 v[0]=x; v[1]=y; v[2]=z;
461 v[0]=a[0]; v[1]=a[1]; v[2]=a[2];
467 v[0]=x; v[1]=y; v[2]=z;
473 return (v[0] == a.v[0] && v[1] == a.v[1] && v[2] == a.v[2]);
478 return (v[0] != a.v[0] || v[1] != a.v[1] || v[2] != a.v[2]);
504 v[0] += a.v[0]; v[1] += a.v[1]; v[2] += a.v[2];
509 v[0] -= a.v[0]; v[1] -= a.v[1]; v[2] -= a.v[2];
514 v[0] *= s; v[1] *= s; v[2] *= s;
519 v[0] /= s; v[1] /= s; v[2] /= s;
534 return Vector3<T>(v[0] + b.v[0], v[1] + b.v[1], v[2] + b.v[2]);
539 return Vector3<T>(v[0] - b.v[0], v[1] - b.v[1], v[2] - b.v[2]);
544 return Vector3<T>(s * v[0], s * v[1], s * v[2]);
555 return v[0] * b.v[0] + v[1] * b.v[1] + v[2] * b.v[2];
562 return Vector3<T>(v[1] * b.v[2] - v[2] * b.v[1],
563 v[2] * b.v[0] - v[0] * b.v[2],
564 v[0] * b.v[1] - v[1] * b.v[0]);
570 const T cosAngle = dot(b)/sqrt(lengthSquared()*b.lengthSquared());
571 return cosAngle>=1 ? 0 : (cosAngle<=-1 ? M_PI : std::acos(cosAngle));
577 const T cosAngle = dot(b);
578 return cosAngle>=1 ? 0 : (cosAngle<=-1 ? M_PI : std::acos(cosAngle));
583 return (T) sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
588 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
593 T s = (T) (1. / std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
603 v[0]=m.r[0]*v0 + m.r[4]*v1 + m.r[8]*v[2] + m.r[12];
604 v[1]=m.r[1]*v0 + m.r[5]*v1 + m.r[9]*v[2] + m.r[13];
605 v[2]=m.r[2]*v0 + m.r[6]*v1 + m.r[10]*v[2] + m.r[14];
612 v[0]=m.r[0]*v0 + m.r[4]*v1 + m.r[8]*v[2] + m.r[12];
613 v[1]=m.r[1]*v0 + m.r[5]*v1 + m.r[9]*v[2] + m.r[13];
614 v[2]=m.r[2]*v0 + m.r[6]*v1 + m.r[10]*v[2] + m.r[14];
620 return std::asin(v[2]/length());
626 return std::atan2(v[1],v[0]);
636 v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2]; v[3]=1;
641 v[0]=x; v[1]=y; v[2]=z; v[3]=1;
646 v[0]=x; v[1]=y; v[2]=z; v[3]=a;
651 v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2]; v[3]=1;
657 v[0]=a[0]; v[1]=a[1]; v[2]=a[2]; v[3]=a[3];
663 v[0]=x; v[1]=y; v[2]=z; v[3]=a;
668 return (v[0] == a.v[0] && v[1] == a.v[1] && v[2] == a.v[2] && v[3] == a.v[3]);
673 return (v[0] != a.v[0] || v[1] != a.v[1] || v[2] != a.v[2] || v[3] != a.v[3]);
698 v[0] += a.v[0]; v[1] += a.v[1]; v[2] += a.v[2]; v[3] += a.v[3];
703 v[0] -= a.v[0]; v[1] -= a.v[1]; v[2] -= a.v[2]; v[3] -= a.v[3];
708 v[0] *= s; v[1] *= s; v[2] *= s; v[3] *= s;
713 v[0] /= s; v[1] /= s; v[2] /= s; v[3] /= s;
718 return Vector4<T>(-v[0], -v[1], -v[2], -v[3]);
728 return Vector4<T>(v[0] + b.v[0], v[1] + b.v[1], v[2] + b.v[2], v[3] + b.v[3]);
733 return Vector4<T>(v[0] - b.v[0], v[1] - b.v[1], v[2] - b.v[2], v[3] - b.v[3]);
738 return Vector4<T>(s * v[0], s * v[1], s * v[2], s * v[3]);
743 return Vector4<T>(v[0]/s, v[1]/s, v[2]/s, v[3]/s);
748 return v[0] * b.v[0] + v[1] * b.v[1] + v[2] * b.v[2] + v[3] * b.v[3];
753 return (T) sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
758 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
763 T s = (T) (1. / sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]));
787 memcpy(r,m,
sizeof(T)*16);
814 template<
class T>
Matrix4<T>::Matrix4(T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p)
816 r[0]=a; r[1]=b; r[2]=c; r[3]=d; r[4]=e; r[5]=f; r[6]=g; r[7]=h;
817 r[8]=i; r[9]=j; r[10]=k; r[11]=l; r[12]=m; r[13]=n; r[14]=o; r[15]=p;
820 template<
class T>
void Matrix4<T>::set(T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p)
822 r[0]=a; r[1]=b; r[2]=c; r[3]=d; r[4]=e; r[5]=f; r[6]=g; r[7]=h;
823 r[8]=i; r[9]=j; r[10]=k; r[11]=l; r[12]=m; r[13]=n; r[14]=o; r[15]=p;
855 a.v[0], a.v[1], a.v[2], 1);
863 const T c = (T) cos(angle);
864 const T s = (T) sin(angle);
866 return Matrix4<T>( a[0]*a[0]*d+c , a[1]*a[0]*d+a[2]*s, a[0]*a[2]*d-a[1]*s, 0,
867 a[0]*a[1]*d-a[2]*s, a[1]*a[1]*d+c , a[1]*a[2]*d+a[0]*s, 0,
868 a[0]*a[2]*d+a[1]*s, a[1]*a[2]*d-a[0]*s, a[2]*a[2]*d+c , 0,
874 T c = (T) cos(angle);
875 T s = (T) sin(angle);
886 T c = (T) cos(angle);
887 T s = (T) sin(angle);
898 T c = (T) cos(angle);
899 T s = (T) sin(angle);
919 return scaling(
Vector3<T>(scale, scale, scale));
925 return Vector3<T>( r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12],
926 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13],
927 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14] );
932 return Vector3<T>( r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2],
933 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2],
934 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] );
940 return Vector4<T>( r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12]*a.v[3],
941 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13]*a.v[3],
942 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14]*a.v[3] );
947 a.set( r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12],
948 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13],
949 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14]);
955 r[1], r[5], r[9], r[13],
956 r[2], r[6], r[10], r[14],
957 r[3], r[7], r[11], r[15]);
962 #define MATMUL(R, C) (r[R] * a.r[C] + r[R+4] * a.r[C+1] + r[R+8] * a.r[C+2] + r[R+12] * a.r[C+3])
963 return Matrix4<T>( MATMUL(0,0), MATMUL(1,0), MATMUL(2,0), MATMUL(3,0),
964 MATMUL(0,4), MATMUL(1,4), MATMUL(2,4), MATMUL(3,4),
965 MATMUL(0,8), MATMUL(1,8), MATMUL(2,8), MATMUL(3,8),
966 MATMUL(0,12), MATMUL(1,12), MATMUL(2,12), MATMUL(3,12) );
973 return Matrix4<T>( r[0]+a.r[0], r[1]+a.r[1], r[2]+a.r[2], r[3]+a.r[3],
974 r[4]+a.r[4], r[5]+a.r[5], r[6]+a.r[6], r[7]+a.r[7],
975 r[8]+a.r[8], r[9]+a.r[9], r[10]+a.r[10], r[11]+a.r[11],
976 r[12]+a.r[12], r[13]+a.r[13], r[14]+a.r[14], r[15]+a.r[15] );
981 return Matrix4<T>( r[0]-a.r[0], r[1]-a.r[1], r[2]-a.r[2], r[3]-a.r[3],
982 r[4]-a.r[4], r[5]-a.r[5], r[6]-a.r[6], r[7]-a.r[7],
983 r[8]-a.r[8], r[9]-a.r[9], r[10]-a.r[10], r[11]-a.r[11],
984 r[12]-a.r[12], r[13]-a.r[13], r[14]-a.r[14], r[15]-a.r[15] );
999 #define SWAP_ROWS(a, b) { T *_tmp = a; (a)=(b); (b)=_tmp; }
1000 #define MAT(m,r,c) (m)[(c)*4+(r)]
1003 T m0, m1, m2, m3, s;
1004 T *r0, *r1, *r2, *r3;
1006 r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
1008 r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1),
1009 r0[2] = MAT(m, 0, 2), r0[3] = MAT(m, 0, 3),
1010 r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
1011 r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1),
1012 r1[2] = MAT(m, 1, 2), r1[3] = MAT(m, 1, 3),
1013 r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
1014 r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1),
1015 r2[2] = MAT(m, 2, 2), r2[3] = MAT(m, 2, 3),
1016 r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
1017 r3[0] = MAT(m, 3, 0), r3[1] = MAT(m, 3, 1),
1018 r3[2] = MAT(m, 3, 2), r3[3] = MAT(m, 3, 3),
1019 r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
1022 if (fabs(r3[0]) > fabs(r2[0]))
1024 if (fabs(r2[0]) > fabs(r1[0]))
1026 if (fabs(r1[0]) > fabs(r0[0]))
1073 if (fabs(r3[1]) > fabs(r2[1]))
1075 if (fabs(r2[1]) > fabs(r1[1]))
1083 r2[2] -= m2 * r1[2];
1084 r3[2] -= m3 * r1[2];
1085 r2[3] -= m2 * r1[3];
1086 r3[3] -= m3 * r1[3];
1109 if (fabs(r3[2]) > fabs(r2[2]))
1116 r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4],
1117 r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6], r3[7] -= m3 * r2[7];
1131 r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
1132 r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
1134 r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1,
1135 r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1;
1137 r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0,
1138 r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0;
1142 r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
1143 r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
1145 r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0,
1146 r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0;
1150 r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
1151 r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
1153 MAT(out, 0, 0) = r0[4];
1154 MAT(out, 0, 1) = r0[5], MAT(out, 0, 2) = r0[6];
1155 MAT(out, 0, 3) = r0[7], MAT(out, 1, 0) = r1[4];
1156 MAT(out, 1, 1) = r1[5], MAT(out, 1, 2) = r1[6];
1157 MAT(out, 1, 3) = r1[7], MAT(out, 2, 0) = r2[4];
1158 MAT(out, 2, 1) = r2[5], MAT(out, 2, 2) = r2[6];
1159 MAT(out, 2, 3) = r2[7], MAT(out, 3, 0) = r3[4];
1160 MAT(out, 3, 1) = r3[5], MAT(out, 3, 2) = r3[6];
1161 MAT(out, 3, 3) = r3[7];
1171 return Vector4<T>(r[0 + row], r[4 + row], r[8 + row], r[12 + row]);
1176 return Vector4<T>(r[0 + column * 4], r[1 + column * 4], r[2 + column * 4], r[3 + column * 4]);
1181 printf(
"[%5.2lf %5.2lf %5.2lf %17.12le]\n"
1182 "[%5.2lf %5.2lf %5.2lf %17.12le]\n"
1183 "[%5.2lf %5.2lf %5.2lf %17.12le]\n"
1184 "[%5.2lf %5.2lf %5.2lf %17.12le]\n\n",
1185 r[0],r[4],r[8],r[12],
1186 r[1],r[5],r[9],r[13],
1187 r[2],r[6],r[10],r[14],
1188 r[3],r[7],r[11],r[15]);
1192 template<
class T>
inline
1194 return a.v[0] * b.v[0] + a.v[1] * b.v[1];
1197 template<
class T>
inline
1199 return a.v[0] * b.v[0] + a.v[1] * b.v[1] + a.v[2] * b.v[2];
1202 template<
class T>
inline
1204 return a.v[0]*b.v[0] + a.v[1]*b.v[1] + a.v[2]*b.v[2] + a.v[3]*b.v[3];
1207 template<
class T>
inline
1212 template<
class T>
inline
1217 template<
class T>
inline
1219 return Vector4<T>(s*v[0],s*v[1],s*v[2],s*v[3]);
1222 Q_DECLARE_TYPEINFO(
Vec2d, Q_PRIMITIVE_TYPE);
1223 Q_DECLARE_TYPEINFO(
Vec2f, Q_PRIMITIVE_TYPE);
1224 Q_DECLARE_TYPEINFO(
Vec2i, Q_PRIMITIVE_TYPE);
1225 Q_DECLARE_TYPEINFO(
Vec3d, Q_PRIMITIVE_TYPE);
1226 Q_DECLARE_TYPEINFO(
Vec3f, Q_PRIMITIVE_TYPE);
1227 Q_DECLARE_TYPEINFO(
Vec4d, Q_PRIMITIVE_TYPE);
1228 Q_DECLARE_TYPEINFO(
Vec4f, Q_PRIMITIVE_TYPE);
1229 Q_DECLARE_TYPEINFO(
Vec4i, Q_PRIMITIVE_TYPE);
1230 Q_DECLARE_TYPEINFO(
Mat4d, Q_PRIMITIVE_TYPE);
1231 Q_DECLARE_TYPEINFO(
Mat4f, Q_PRIMITIVE_TYPE);
1233 #endif // _VECMATH_H_