95 inline explicit Vector2(
const T*);
104 inline void set(T, T);
106 inline bool operator==(
const Vector2<T>&)
const;
107 inline bool operator!=(
const Vector2<T>&)
const;
109 inline const T& operator[](
int x)
const;
110 inline T& operator[](
int);
111 inline operator const T*()
const;
112 inline operator T*();
149 inline T length()
const;
150 inline T lengthSquared()
const;
151 inline void normalize();
155 QString toString()
const {
return QString(
"[%1, %2]").arg(v[0]).arg(v[1]);}
162 template<
class T>
class Vector3 171 inline explicit Vector3(
const T*);
180 inline void set(T, T, T);
182 inline bool operator==(
const Vector3<T>&)
const;
183 inline bool operator!=(
const Vector3<T>&)
const;
185 inline bool fuzzyEquals(
const Vector3<T>&, T epsilon = std::numeric_limits<T>::epsilon())
const;
187 inline T& operator[](
int);
188 inline const T& operator[](
int)
const;
189 inline operator const T*()
const;
190 inline operator T*();
191 inline const T* data()
const {
return v;}
192 inline T* data() {
return v;}
213 inline T latitude()
const;
215 inline T longitude()
const;
219 inline T angleNormalized(
const Vector3<T>&)
const;
221 inline T length()
const;
222 inline T lengthSquared()
const;
223 inline void normalize();
225 inline void transfo4d(
const Mat4d&);
226 inline void transfo4d(
const Mat4f&);
229 inline Vec3f toVec3f()
const;
230 inline Vec3d toVec3d()
const;
234 QString toString()
const {
return QString(
"[%1, %2, %3]").arg(v[0]).arg(v[1]).arg(v[2]);}
235 QString toStringLonLat()
const {
return QString(
"[") + QString::number(longitude()*180./M_PI,
'g', 12) +
"," + QString::number(latitude()*180./M_PI,
'g', 12)+
"]";}
242 template<
class T>
class Vector4 249 inline explicit Vector4(
const T*);
258 inline void set(T, T, T, T);
260 inline bool operator==(
const Vector4<T>&)
const;
261 inline bool operator!=(
const Vector4<T>&)
const;
263 inline T& operator[](
int);
264 inline const T& operator[](
int)
const;
265 inline operator T*();
266 inline operator const T*()
const;
285 inline T length()
const;
286 inline T lengthSquared()
const;
287 inline void normalize();
289 inline void transfo4d(
const Mat4d&);
290 QString toString()
const {
return QString(
"[%1, %2, %3, %4]").arg(v[0]).arg(v[1]).arg(v[2]).arg(v[3]);}
298 template<
class T>
class Matrix3 307 inline void set(T,T,T,T,T,T,T,T,T);
309 inline T& operator[](
int);
310 inline operator T*();
311 inline operator const T*()
const;
324 inline T
trace()
const {
return r[0]+r[4]+r[8];}
326 inline T
angle()
const {
return acos(0.5*(this->trace()-1.0));}
328 inline void print(
void)
const;
329 QString toString(
int fieldWidth=0,
char format=
'g',
int precision=-1)
const {
return QString(
"[[%1, %2, %3], [%4, %5, %6], [%7, %8, %9]]")
330 .arg(r[0], fieldWidth, format, precision)
331 .arg(r[1], fieldWidth, format, precision)
332 .arg(r[2], fieldWidth, format, precision)
333 .arg(r[3], fieldWidth, format, precision)
334 .arg(r[4], fieldWidth, format, precision)
335 .arg(r[5], fieldWidth, format, precision)
336 .arg(r[6], fieldWidth, format, precision)
337 .arg(r[7], fieldWidth, format, precision)
338 .arg(r[8], fieldWidth, format, precision);}
346 template<
class T>
class Matrix4 350 Matrix4(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
356 inline void set(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
358 inline T& operator[](
int);
359 inline operator T*();
360 inline operator const T*()
const;
390 inline Vector4<T> getRow(
const int row)
const;
391 inline Vector4<T> getColumn(
const int column)
const;
394 inline QMatrix4x4 convertToQMatrix()
const;
396 inline void print(
void)
const;
397 QString toString(
int fieldWidth=0,
char format=
'g',
int precision=-1)
const {
return QString(
"[[%1, %2, %3, %4], [%5, %6, %7, %8], [%9, %10, %11, %12], [%13, %14, %15, %16]]")
398 .arg(r[0], fieldWidth, format, precision)
399 .arg(r[1], fieldWidth, format, precision)
400 .arg(r[2], fieldWidth, format, precision)
401 .arg(r[3], fieldWidth, format, precision)
402 .arg(r[4], fieldWidth, format, precision)
403 .arg(r[5], fieldWidth, format, precision)
404 .arg(r[6], fieldWidth, format, precision)
405 .arg(r[7], fieldWidth, format, precision)
406 .arg(r[8], fieldWidth, format, precision)
407 .arg(r[9], fieldWidth, format, precision)
408 .arg(r[10], fieldWidth, format, precision)
409 .arg(r[11], fieldWidth, format, precision)
410 .arg(r[12], fieldWidth, format, precision)
411 .arg(r[13], fieldWidth, format, precision)
412 .arg(r[14], fieldWidth, format, precision)
413 .arg(r[15], fieldWidth, format, precision);}
419 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector2<T>& v) {out << v[0] << v[1];
return out;}
420 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector3<T>& v) {out << v[0] << v[1] << v[2];
return out;}
421 template<
class T> QDataStream& operator<<(QDataStream& out, const Vector4<T>& v) {out << v[0] << v[1] << v[2] << v[3];
return out;}
422 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;}
423 template<
class T> QDataStream& operator<<(QDataStream& out, const Matrix3<T>& m) {out << m[0] << m[1] << m[2] << m[3] << m[4] << m[5] << m[6] << m[7] << m[8];
return out;}
425 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector2<T>& v) {in >> v[0] >> v[1];
return in;}
426 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector3<T>& v) {in >> v[0] >> v[1] >> v[2];
return in;}
427 template<
class T> QDataStream&
operator>>(QDataStream& in,
Vector4<T>& v) {in >> v[0] >> v[1] >> v[2] >> v[3];
return in;}
428 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;}
429 template<
class T> QDataStream&
operator>>(QDataStream& in,
Matrix3<T>& m) {in >> m[0] >> m[1] >> m[2] >> m[3] >> m[4] >> m[5] >> m[6] >> m[7] >> m[8];
return in;}
432 template <
class T>
inline bool fuzzyEquals(T a, T b, T eps = std::numeric_limits<T>::epsilon())
434 if(a == b)
return true;
435 if(((a+eps) < b) || ((a-eps) > b))
return false;
450 v[0]=x[0]; v[1]=x[1];
455 v[0]=other[0]; v[1]=other[1];
466 v[0]=a[0]; v[1]=a[1];
478 return (v[0] == a.v[0] && v[1] == a.v[1]);
483 return (v[0] != a.v[0] || v[1] != a.v[1]);
509 v[0] += a.v[0]; v[1] += a.v[1];
515 v[0] -= a.v[0]; v[1] -= a.v[1];
521 v[0] *= s; v[1] *= s;
527 v[0] *= b.v[0]; v[1] *= b.v[1];
533 v[0] /= s; v[1] /= s;
539 v[0] /= b.v[0]; v[1] /= b.v[1];
555 return Vector2<T>(v[0] + b.v[0], v[1] + b.v[1]);
560 return Vector2<T>(v[0] - b.v[0], v[1] - b.v[1]);
570 return Vector2<T>(v[0] * b.v[0], v[1] * b.v[1]);
585 return Vector2<T>(std::min(v[0],b.v[0]), std::min(v[1],b.v[1]));
590 return Vector2<T>(std::max(v[0],b.v[0]), std::max(v[1],b.v[1]));
595 return this->
max(low).min(high);
600 return v[0] * b.v[0] + v[1] * b.v[1];
606 return (T) std::sqrt(v[0] * v[0] + v[1] * v[1]);
611 return v[0] * v[0] + v[1] * v[1];
616 T s = (T) 1 / std::sqrt(v[0] * v[0] + v[1] * v[1]);
642 v[0]=x; v[1]=x; v[2]=x;
647 v[0]=x[0]; v[1]=x[1]; v[2]=x[2];
652 v[0]=x; v[1]=y; v[2]=z;
669 v[0]=a[0]; v[1]=a[1]; v[2]=a[2];
675 v[0]=x; v[1]=y; v[2]=z;
681 return (v[0] == a.v[0] && v[1] == a.v[1] && v[2] == a.v[2]);
686 return (v[0] != a.v[0] || v[1] != a.v[1] || v[2] != a.v[2]);
691 return ::fuzzyEquals(v[0], a.v[0], eps) && ::fuzzyEquals(v[1], a.v[1], eps) && ::fuzzyEquals(v[2], a.v[2], eps);
716 v[0] += a.v[0]; v[1] += a.v[1]; v[2] += a.v[2];
721 v[0] -= a.v[0]; v[1] -= a.v[1]; v[2] -= a.v[2];
726 v[0] *= s; v[1] *= s; v[2] *= s;
731 v[0] /= s; v[1] /= s; v[2] /= s;
746 return Vector3<T>(v[0] + b.v[0], v[1] + b.v[1], v[2] + b.v[2]);
751 return Vector3<T>(v[0] - b.v[0], v[1] - b.v[1], v[2] - b.v[2]);
756 return Vector3<T>(s * v[0], s * v[1], s * v[2]);
767 return v[0] * b.v[0] + v[1] * b.v[1] + v[2] * b.v[2];
774 return Vector3<T>(v[1] * b.v[2] - v[2] * b.v[1],
775 v[2] * b.v[0] - v[0] * b.v[2],
776 v[0] * b.v[1] - v[1] * b.v[0]);
782 const T cosAngle = dot(b)/std::sqrt(lengthSquared()*b.lengthSquared());
783 return cosAngle>=1 ? 0 : (cosAngle<=-1 ? M_PI : std::acos(cosAngle));
789 const T cosAngle = dot(b);
790 return cosAngle>=1 ? 0 : (cosAngle<=-1 ? M_PI : std::acos(cosAngle));
795 return (T) std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
800 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
805 T s = (T) (1. / std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
815 v[0]=m.r[0]*v0 + m.r[4]*v1 + m.r[8]*v[2] + m.r[12];
816 v[1]=m.r[1]*v0 + m.r[5]*v1 + m.r[9]*v[2] + m.r[13];
817 v[2]=m.r[2]*v0 + m.r[6]*v1 + m.r[10]*v[2] + m.r[14];
824 v[0]=m.r[0]*v0 + m.r[4]*v1 + m.r[8]*v[2] + m.r[12];
825 v[1]=m.r[1]*v0 + m.r[5]*v1 + m.r[9]*v[2] + m.r[13];
826 v[2]=m.r[2]*v0 + m.r[6]*v1 + m.r[10]*v[2] + m.r[14];
831 return Vec3f(v[0],v[1],v[2]);
836 return Vec3d(v[0],v[1],v[2]);
842 return std::asin(v[2]/length());
848 return std::atan2(v[1],v[0]);
858 v[0]=x[0]; v[1]=x[1]; v[2]=x[2]; v[3]=x[3];
863 v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2]; v[3]=1;
868 v[0]=x; v[1]=y; v[2]=z; v[3]=1;
873 v[0]=x; v[1]=y; v[2]=z; v[3]=a;
878 v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2]; v[3]=1;
884 v[0]=a[0]; v[1]=a[1]; v[2]=a[2]; v[3]=a[3];
890 v[0]=x; v[1]=y; v[2]=z; v[3]=a;
895 return (v[0] == a.v[0] && v[1] == a.v[1] && v[2] == a.v[2] && v[3] == a.v[3]);
900 return (v[0] != a.v[0] || v[1] != a.v[1] || v[2] != a.v[2] || v[3] != a.v[3]);
925 v[0] += a.v[0]; v[1] += a.v[1]; v[2] += a.v[2]; v[3] += a.v[3];
930 v[0] -= a.v[0]; v[1] -= a.v[1]; v[2] -= a.v[2]; v[3] -= a.v[3];
935 v[0] *= s; v[1] *= s; v[2] *= s; v[3] *= s;
940 v[0] /= s; v[1] /= s; v[2] /= s; v[3] /= s;
945 return Vector4<T>(-v[0], -v[1], -v[2], -v[3]);
955 return Vector4<T>(v[0] + b.v[0], v[1] + b.v[1], v[2] + b.v[2], v[3] + b.v[3]);
960 return Vector4<T>(v[0] - b.v[0], v[1] - b.v[1], v[2] - b.v[2], v[3] - b.v[3]);
965 return Vector4<T>(s * v[0], s * v[1], s * v[2], s * v[3]);
970 return Vector4<T>(v[0]/s, v[1]/s, v[2]/s, v[3]/s);
975 return v[0] * b.v[0] + v[1] * b.v[1] + v[2] * b.v[2] + v[3] * b.v[3];
980 return (T) std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
985 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
990 T s = (T) (1. / std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]));
1014 memcpy(r,m,
sizeof(T)*9);
1019 r[0] = v0.v[0]; r[3] = v1.v[0]; r[6] = v2.v[0];
1020 r[1] = v0.v[1]; r[4] = v1.v[1]; r[7] = v2.v[1];
1021 r[2] = v0.v[2]; r[5] = v1.v[2]; r[8] = v2.v[2];
1026 r[0] = a; r[3] = d; r[6] = g;
1027 r[1] = b; r[4] = e; r[7] = h;
1028 r[2] = c; r[5] = f; r[8] = i;
1031 template<
class T>
void Matrix3<T>::set(T a, T b, T c, T d, T e, T f, T g, T h, T i)
1033 r[0] = a; r[3] = d; r[6] = g;
1034 r[1] = b; r[4] = e; r[7] = h;
1035 r[2] = c; r[5] = f; r[8] = i;
1063 return Vector3<T>(r[0]*a.v[0] + r[3]*a.v[1] + r[6]*a.v[2],
1064 r[1]*a.v[0] + r[4]*a.v[1] + r[7]*a.v[2],
1065 r[2]*a.v[0] + r[5]*a.v[1] + r[8]*a.v[2]);
1077 #define MATMUL(R, C) (r[R] * a.r[C] + r[R+3] * a.r[C+1] + r[R+6] * a.r[C+2]) 1078 return Matrix3<T>(MATMUL(0,0), MATMUL(1,0), MATMUL(2,0),
1079 MATMUL(0,3), MATMUL(1,3), MATMUL(2,3),
1080 MATMUL(0,6), MATMUL(1,6), MATMUL(2,6));
1087 return Matrix3<T>(r[0]+a.r[0], r[1]+a.r[1], r[2]+a.r[2],
1088 r[3]+a.r[3], r[4]+a.r[4], r[5]+a.r[5],
1089 r[6]+a.r[6], r[7]+a.r[7], r[8]+a.r[8]);
1094 return Matrix3<T>(r[0]-a.r[0], r[1]-a.r[1], r[2]-a.r[2],
1095 r[3]-a.r[3], r[4]-a.r[4], r[5]-a.r[5],
1096 r[6]-a.r[6], r[7]-a.r[7], r[8]-a.r[8]);
1109 #define SWAP_ROWS(a, b) { T *_tmp = a; (a)=(b); (b)=_tmp; } 1110 #define MAT(m,r,c) (m)[(c)*3+(r)] 1116 r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2];
1118 r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1), r0[2] = MAT(m, 0, 2),
1119 r0[3] = 1.0, r0[4] = r0[5] = 0.0,
1120 r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1), r1[2] = MAT(m, 1, 2),
1121 r1[4] = 1.0, r1[3] = r1[5] = 0.0,
1122 r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1), r2[2] = MAT(m, 2, 2),
1123 r2[5] = 1.0, r2[3] = r2[4] = 0.0;
1126 if (fabs(r2[0]) > fabs(r1[0]))
1128 if (fabs(r1[0]) > fabs(r0[0]))
1162 if (fabs(r2[1]) > fabs(r1[1]))
1169 r2[2] -= m2 * r1[2];
1193 r1[3] = s * (r1[3] - r2[3] * m1), r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1);
1195 r0[3] -= r2[3] * m0, r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0;
1199 r0[3] = s * (r0[3] - r1[3] * m0), r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0);
1201 MAT(out, 0, 0) = r0[3]; MAT(out, 0, 1) = r0[4]; MAT(out, 0, 2) = r0[5];
1202 MAT(out, 1, 0) = r1[3]; MAT(out, 1, 1) = r1[4]; MAT(out, 1, 2) = r1[5];
1203 MAT(out, 2, 0) = r2[3]; MAT(out, 2, 1) = r2[4]; MAT(out, 2, 2) = r2[5];
1213 printf(
"[%5.2lf %5.2lf %5.2lf]\n" 1214 "[%5.2lf %5.2lf %5.2lf]\n" 1215 "[%5.2lf %5.2lf %5.2lf]\n",
1227 memcpy(r,m,
sizeof(T)*16);
1254 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)
1256 r[0]=a; r[1]=b; r[2]=c; r[3]=d; r[4]=e; r[5]=f; r[6]=g; r[7]=h;
1257 r[8]=i; r[9]=j; r[10]=k; r[11]=l; r[12]=m; r[13]=n; r[14]=o; r[15]=p;
1260 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)
1262 r[0]=a; r[1]=b; r[2]=c; r[3]=d; r[4]=e; r[5]=f; r[6]=g; r[7]=h;
1263 r[8]=i; r[9]=j; r[10]=k; r[11]=l; r[12]=m; r[13]=n; r[14]=o; r[15]=p;
1295 a.v[0], a.v[1], a.v[2], 1);
1303 const T c = (T) cos(angle);
1304 const T s = (T) sin(angle);
1306 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,
1307 a[0]*a[1]*d-a[2]*s, a[1]*a[1]*d+c , a[1]*a[2]*d+a[0]*s, 0,
1308 a[0]*a[2]*d+a[1]*s, a[1]*a[2]*d-a[0]*s, a[2]*a[2]*d+c , 0,
1314 T c = (T) cos(angle);
1315 T s = (T) sin(angle);
1326 T c = (T) cos(angle);
1327 T s = (T) sin(angle);
1338 T c = (T) cos(angle);
1339 T s = (T) sin(angle);
1359 return scaling(
Vector3<T>(scale, scale, scale));
1365 return Vector3<T>(r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12],
1366 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13],
1367 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14]);
1372 return Vector3<T>(r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2],
1373 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2],
1374 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2]);
1380 return Vector4<T>(r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12]*a.v[3],
1381 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13]*a.v[3],
1382 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14]*a.v[3]);
1387 a.set(r[0]*a.v[0] + r[4]*a.v[1] + r[8]*a.v[2] + r[12],
1388 r[1]*a.v[0] + r[5]*a.v[1] + r[9]*a.v[2] + r[13],
1389 r[2]*a.v[0] + r[6]*a.v[1] + r[10]*a.v[2] + r[14]);
1395 r[1], r[5], r[9], r[13],
1396 r[2], r[6], r[10], r[14],
1397 r[3], r[7], r[11], r[15]);
1402 #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]) 1403 return Matrix4<T>(MATMUL(0,0) , MATMUL(1,0) , MATMUL(2,0) , MATMUL(3,0) ,
1404 MATMUL(0,4) , MATMUL(1,4) , MATMUL(2,4) , MATMUL(3,4) ,
1405 MATMUL(0,8) , MATMUL(1,8) , MATMUL(2,8) , MATMUL(3,8) ,
1406 MATMUL(0,12), MATMUL(1,12), MATMUL(2,12), MATMUL(3,12));
1413 return Matrix4<T>(r[0]+a.r[0] , r[1]+a.r[1] , r[2]+a.r[2] , r[3]+a.r[3] ,
1414 r[4]+a.r[4] , r[5]+a.r[5] , r[6]+a.r[6] , r[7]+a.r[7] ,
1415 r[8]+a.r[8] , r[9]+a.r[9] , r[10]+a.r[10], r[11]+a.r[11],
1416 r[12]+a.r[12], r[13]+a.r[13], r[14]+a.r[14], r[15]+a.r[15]);
1421 return Matrix4<T>(r[0]-a.r[0] , r[1]-a.r[1] , r[2]-a.r[2] , r[3]-a.r[3] ,
1422 r[4]-a.r[4] , r[5]-a.r[5] , r[6]-a.r[6] , r[7]-a.r[7] ,
1423 r[8]-a.r[8] , r[9]-a.r[9] , r[10]-a.r[10], r[11]-a.r[11],
1424 r[12]-a.r[12], r[13]-a.r[13], r[14]-a.r[14], r[15]-a.r[15]);
1439 #define SWAP_ROWS(a, b) { T *_tmp = a; (a)=(b); (b)=_tmp; } 1440 #define MAT(m,r,c) (m)[(c)*4+(r)] 1443 T m0, m1, m2, m3, s;
1444 T *r0, *r1, *r2, *r3;
1446 r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
1448 r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1),
1449 r0[2] = MAT(m, 0, 2), r0[3] = MAT(m, 0, 3),
1450 r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
1451 r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1),
1452 r1[2] = MAT(m, 1, 2), r1[3] = MAT(m, 1, 3),
1453 r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
1454 r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1),
1455 r2[2] = MAT(m, 2, 2), r2[3] = MAT(m, 2, 3),
1456 r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
1457 r3[0] = MAT(m, 3, 0), r3[1] = MAT(m, 3, 1),
1458 r3[2] = MAT(m, 3, 2), r3[3] = MAT(m, 3, 3),
1459 r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
1462 if (fabs(r3[0]) > fabs(r2[0]))
1464 if (fabs(r2[0]) > fabs(r1[0]))
1466 if (fabs(r1[0]) > fabs(r0[0]))
1513 if (fabs(r3[1]) > fabs(r2[1]))
1515 if (fabs(r2[1]) > fabs(r1[1]))
1523 r2[2] -= m2 * r1[2];
1524 r3[2] -= m3 * r1[2];
1525 r2[3] -= m2 * r1[3];
1526 r3[3] -= m3 * r1[3];
1549 if (fabs(r3[2]) > fabs(r2[2]))
1556 r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4],
1557 r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6], r3[7] -= m3 * r2[7];
1571 r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
1572 r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
1574 r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1,
1575 r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1;
1577 r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0,
1578 r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0;
1582 r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
1583 r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
1585 r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0,
1586 r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0;
1590 r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
1591 r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
1593 MAT(out, 0, 0) = r0[4];
1594 MAT(out, 0, 1) = r0[5], MAT(out, 0, 2) = r0[6];
1595 MAT(out, 0, 3) = r0[7], MAT(out, 1, 0) = r1[4];
1596 MAT(out, 1, 1) = r1[5], MAT(out, 1, 2) = r1[6];
1597 MAT(out, 1, 3) = r1[7], MAT(out, 2, 0) = r2[4];
1598 MAT(out, 2, 1) = r2[5], MAT(out, 2, 2) = r2[6];
1599 MAT(out, 2, 3) = r2[7], MAT(out, 3, 0) = r3[4];
1600 MAT(out, 3, 1) = r3[5], MAT(out, 3, 2) = r3[6];
1601 MAT(out, 3, 3) = r3[7];
1624 return Vector4<T>(r[0 + row], r[4 + row], r[8 + row], r[12 + row]);
1629 return Vector4<T>(r[0 + column * 4], r[1 + column * 4], r[2 + column * 4], r[3 + column * 4]);
1634 return QMatrix4x4( r[0], r[4], r[8],r[12],
1635 r[1], r[5], r[9],r[13],
1636 r[2], r[6],r[10],r[14],
1637 r[3], r[7],r[11],r[15] );
1642 printf(
"[%5.2lf %5.2lf %5.2lf %17.12le]\n" 1643 "[%5.2lf %5.2lf %5.2lf %17.12le]\n" 1644 "[%5.2lf %5.2lf %5.2lf %17.12le]\n" 1645 "[%5.2lf %5.2lf %5.2lf %17.12le]\n\n",
1646 r[0],r[4],r[8],r[12],
1647 r[1],r[5],r[9],r[13],
1648 r[2],r[6],r[10],r[14],
1649 r[3],r[7],r[11],r[15]);
1653 template<
class T>
inline 1656 return a.v[0] * b.v[0] + a.v[1] * b.v[1];
1659 template<
class T>
inline 1662 return a.v[0] * b.v[0] + a.v[1] * b.v[1] + a.v[2] * b.v[2];
1665 template<
class T>
inline 1668 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];
1671 template<
class T>
inline 1677 template<
class T>
inline 1683 template<
class T>
inline 1686 return Vector4<T>(s*v[0],s*v[1],s*v[2],s*v[3]);
1690 Q_DECLARE_TYPEINFO(
Vec2d, Q_PRIMITIVE_TYPE);
1691 Q_DECLARE_TYPEINFO(
Vec2f, Q_PRIMITIVE_TYPE);
1692 Q_DECLARE_TYPEINFO(
Vec2i, Q_PRIMITIVE_TYPE);
1693 Q_DECLARE_TYPEINFO(
Vec3d, Q_PRIMITIVE_TYPE);
1694 Q_DECLARE_TYPEINFO(
Vec3f, Q_PRIMITIVE_TYPE);
1695 Q_DECLARE_TYPEINFO(
Vec3i, Q_PRIMITIVE_TYPE);
1696 Q_DECLARE_TYPEINFO(
Vec4d, Q_PRIMITIVE_TYPE);
1697 Q_DECLARE_TYPEINFO(
Vec4f, Q_PRIMITIVE_TYPE);
1698 Q_DECLARE_TYPEINFO(
Vec4i, Q_PRIMITIVE_TYPE);
1699 Q_DECLARE_TYPEINFO(
Mat4d, Q_PRIMITIVE_TYPE);
1700 Q_DECLARE_TYPEINFO(
Mat4f, Q_PRIMITIVE_TYPE);
1701 Q_DECLARE_TYPEINFO(
Mat3d, Q_PRIMITIVE_TYPE);
1702 Q_DECLARE_TYPEINFO(
Mat3f, Q_PRIMITIVE_TYPE);
1706 Q_DECLARE_METATYPE(
Vec2d)
1707 Q_DECLARE_METATYPE(
Vec2f)
1708 Q_DECLARE_METATYPE(
Vec2i)
1709 Q_DECLARE_METATYPE(
Vec3d)
1710 Q_DECLARE_METATYPE(
Vec3f)
1711 Q_DECLARE_METATYPE(
Vec3i)
1712 Q_DECLARE_METATYPE(
Vec4d)
1713 Q_DECLARE_METATYPE(
Vec4f)
1714 Q_DECLARE_METATYPE(
Vec4i)
1715 Q_DECLARE_METATYPE(
Mat4d)
1716 Q_DECLARE_METATYPE(
Mat4f)
1717 Q_DECLARE_METATYPE(
Mat3d)
1718 Q_DECLARE_METATYPE(
Mat3f)
1721 QDebug operator<<(QDebug debug, const Vector2<T> &c)
1723 QDebugStateSaver saver(debug);
1724 debug.nospace() <<
'[' << c[0] <<
", " << c[1] <<
']';
1730 QDebug operator<<(QDebug debug, const Vector3<T> &c)
1732 QDebugStateSaver saver(debug);
1733 debug.nospace() <<
'[' << c[0] <<
", " << c[1] <<
", " << c[2] <<
']';
1739 QDebug operator<<(QDebug debug, const Vector4<T> &c)
1741 QDebugStateSaver saver(debug);
1742 debug.nospace() <<
'[' << c[0] <<
", " << c[1] <<
", " << c[2] <<
", " << c[3] <<
']';
1749 inline QVector3D
operator*(
const QMatrix3x3& mat,
const QVector3D& vec)
1752 x = vec.x() * mat(0,0) +
1753 vec.y() * mat(0,1) +
1755 y = vec.x() * mat(1,0) +
1756 vec.y() * mat(1,1) +
1758 z = vec.x() * mat(2,0) +
1759 vec.y() * mat(2,1) +
1761 return QVector3D(x,y,z);
1764 #endif // _VECMATH_H_ Vector2< T > clamp(const Vector2< T > &low, const Vector2< T > &high) const
Component-wise clamping to the specified upper and lower bounds.
Vector4()
The vector is not initialized!
Vector3 & operator=(const T *)
Assignment from array.
bool fuzzyEquals(const Vector3< T > &, T epsilon=std::numeric_limits< T >::epsilon()) const
allows for a fuzzy comparison using some epsilon value
Vector2< T > max(const Vector2< T > &) const
Component-wise maximum determination.
Vector2< T > operator/(T) const
Scalar division.
T trace() const
return trace (sum of diagonal elements).
A templatized column-major 3x3 matrix compatible with openGL (mostly for NormalMatrix calculation)...
T angle() const
return rotational angle
A templatized 2d vector compatible with openGL.
A templatized column-major 4x4 matrix compatible with openGL.
Vector2< T > & operator*=(T)
Scalar multiplication.
A templatized 4d vector compatible with openGL.
Vector2< T > & operator=(const T *)
Assignment from array.
Vector2()
The vector is not initialized!
Vector2< T > & operator/=(T)
Scalar division.
QDataStream & operator>>(QDataStream &in, SphericalRegionP ®ion)
Load the SphericalRegionP from a binary blob.
A templatized 3d vector compatible with openGL.
Vector3()
The vector is not initialized!
Vector2< T > operator*(T) const
Scalar multiplication.
const QCPRange operator-(const QCPRange &range, double value)
Vector2< T > min(const Vector2< T > &) const
Component-wise minimum determination.
const QCPRange operator+(const QCPRange &range, double value)