1 #ifndef MATH3D_PRIMITIVES_H 2 #define MATH3D_PRIMITIVES_H 34 class RigidTransform2D;
48 explicit Vector2(
const Real* data);
50 inline bool operator == (
const Vector2&)
const;
51 inline bool operator != (
const Vector2&)
const;
53 inline void operator += (
const Vector2&);
54 inline void operator -= (
const Vector2&);
55 inline void operator *= (Real);
56 inline void operator /= (Real);
57 inline Real& operator [] (
int);
58 inline const Real& operator [] (
int)
const;
59 inline operator Real* ();
60 inline operator const Real* ()
const;
64 inline void mul(
const Vector2& a, Real b);
65 inline void div(
const Vector2& a, Real b);
66 inline void madd(
const Vector2& a, Real b);
67 inline Real dot(
const Vector2& a)
const;
68 inline Real cross(
const Vector2& a)
const;
69 inline Real distance(
const Vector2& a)
const;
70 inline Real distanceSquared(
const Vector2& a)
const;
71 inline Real norm()
const;
72 inline Real normSquared()
const;
73 inline Real length()
const;
74 inline Real minElement(
int* index=NULL)
const;
75 inline Real maxElement(
int* index=NULL)
const;
76 inline Real minAbsElement(
int* index=NULL)
const;
77 inline Real maxAbsElement(
int* index=NULL)
const;
79 inline void set(
const Vector2&);
80 inline void set(Real x);
81 inline void set(Real x, Real y);
82 inline void set(
const Real* data);
83 inline void setZero();
84 inline void setRotation(Real rads);
85 inline void setPerpendicular(
const Vector2&);
86 inline void setOrthogonal(
const Vector2& v) { setPerpendicular(v); }
87 inline void setNegative(
const Vector2&);
88 inline void setNormalized(
const Vector2&);
91 inline void setMinimum(
const Vector2&);
93 inline void setMaximum(
const Vector2&);
95 inline void get(
Vector2&)
const;
96 inline void get(Real& x, Real& y)
const;
97 inline void get(Real data[2])
const;
98 inline void getNegative(
Vector2&)
const;
99 inline void getNormalized(
Vector2&)
const;
100 inline void getOrthogonal(
Vector2&)
const;
102 inline void inplaceNegative();
103 inline void inplaceMul(Real);
104 inline void inplaceDiv(Real);
105 inline void inplaceNormalize();
107 inline bool isZero(Real eps=Zero)
const;
108 inline bool isEqual(
const Vector2&,Real eps=Zero)
const;
111 bool Write(
File&)
const;
115 struct { Real x,y; };
121 inline void normalize(
Vector2& a);
142 Vector3(Real x, Real y, Real z);
143 explicit Vector3(
const Real* data);
145 inline bool operator == (
const Vector3&)
const;
146 inline bool operator != (
const Vector3&)
const;
148 inline void operator += (
const Vector3&);
149 inline void operator -= (
const Vector3&);
150 inline void operator *= (Real);
151 inline void operator /= (Real);
152 inline Real& operator [] (
int);
153 inline const Real& operator [] (
int)
const;
154 inline operator Real* ();
155 inline operator const Real* ()
const;
159 inline void mul(
const Vector3& a, Real b);
160 inline void div(
const Vector3& a, Real b);
161 inline void madd(
const Vector3& a, Real b);
162 inline Real dot(
const Vector3& a)
const;
163 inline Real distance(
const Vector3& a)
const;
164 inline Real distanceSquared(
const Vector3& a)
const;
165 inline Real norm()
const;
166 inline Real normSquared()
const;
167 inline Real length()
const;
168 inline Real minElement(
int* index=NULL)
const;
169 inline Real maxElement(
int* index=NULL)
const;
170 inline Real minAbsElement(
int* index=NULL)
const;
171 inline Real maxAbsElement(
int* index=NULL)
const;
173 inline void set(
const Vector3&);
174 inline void set(Real x);
175 inline void set(Real x, Real y, Real z);
176 inline void set(
const Real* data);
177 inline void setZero();
178 inline void setNegative(
const Vector3&);
180 inline void setNormalized(
const Vector3&);
183 inline void setMinimum(
const Vector3&);
185 inline void setMaximum(
const Vector3&);
187 inline void get(
Vector3&)
const;
188 inline void get(Real& x, Real& y, Real& z)
const;
189 inline void get(Real data[3])
const;
190 inline void getNegative(
Vector3&)
const;
191 inline void getNormalized(
Vector3&)
const;
194 inline void inplaceNegative();
195 inline void inplaceMul(Real);
196 inline void inplaceDiv(Real);
197 inline void inplaceNormalize();
199 inline bool isZero(Real eps=Zero)
const;
200 inline bool isEqual(
const Vector3&,Real eps=Zero)
const;
203 bool Write(
File&)
const;
207 struct { Real x,y,z; };
213 inline void normalize(
Vector3& a);
234 Vector4(Real x, Real y, Real z, Real w = One);
235 explicit Vector4(
const Real* data);
238 inline bool operator == (
const Vector4&)
const;
239 inline bool operator != (
const Vector4&)
const;
241 inline void operator += (
const Vector4&);
242 inline void operator -= (
const Vector4&);
243 inline void operator *= (Real);
244 inline void operator /= (Real);
245 inline void operator += (
const Vector3&);
246 inline void operator -= (
const Vector3&);
247 inline Real& operator [] (
int);
248 inline const Real& operator [] (
int)
const;
249 inline operator Vector3()
const;
250 inline operator Real* ();
251 inline operator const Real* ()
const;
255 inline void mul(
const Vector4& a, Real b);
256 inline void div(
const Vector4& a, Real b);
257 inline void madd(
const Vector4& a, Real b);
260 inline Real dot(
const Vector4& a)
const;
261 inline Real dot3(
const Vector4& a)
const;
262 inline Real dot3(
const Vector3& a)
const;
263 inline Real distance(
const Vector4& a)
const;
264 inline Real distanceSquared(
const Vector4& a)
const;
265 inline Real norm()
const;
266 inline Real normSquared()
const;
267 inline Real length()
const;
268 inline Real minElement(
int* index=NULL)
const;
269 inline Real maxElement(
int* index=NULL)
const;
270 inline Real minAbsElement(
int* index=NULL)
const;
271 inline Real maxAbsElement(
int* index=NULL)
const;
273 inline void set(
const Vector4&);
274 inline void set(Real x);
275 inline void set(Real x, Real y, Real z, Real w = One);
276 inline void set(
const Real* data);
277 inline void setZero();
278 inline void setVector(
const Vector3&);
279 inline void setHomogeneous(
const Vector3&);
280 inline void setNegative(
const Vector4&);
281 inline void setNormalized(
const Vector4&);
284 inline void setMinimum(
const Vector4&);
286 inline void setMaximum(
const Vector4&);
288 inline void get(
Vector4&)
const;
289 inline void get(Real& x, Real& y, Real& z, Real& w)
const;
290 inline void get(Real data[4])
const;
291 inline void get(
Vector3&)
const;
292 inline void getNegative(
Vector4&)
const;
293 inline void getNormalized(
Vector4&)
const;
295 inline void inplaceNegative();
296 inline void inplaceMul(Real);
297 inline void inplaceDiv(Real);
298 inline void inplaceNormalize();
300 inline bool isZero(Real eps=Zero)
const;
301 inline bool isEqual(
const Vector4&,Real eps=Zero)
const;
304 bool Write(
File&)
const;
308 struct { Real x,y,z,w; };
316 inline void normalize(
Vector4& a);
339 explicit Matrix2(
const Real [2][2]);
340 explicit Matrix2(
const Real *);
343 bool operator == (
const Matrix2&)
const;
344 bool operator != (
const Matrix2&)
const;
346 inline void operator += (
const Matrix2&);
347 inline void operator -= (
const Matrix2&);
348 inline void operator *= (
const Matrix2&);
349 inline void operator *= (Real scale);
350 inline void operator /= (Real scale);
351 operator const Real*()
const {
return &data[0][0]; }
352 inline Real& operator () (
int i,
int j) {
return data[j][i]; }
353 inline const Real& operator () (
int i,
int j)
const {
return data[j][i]; }
366 inline void mul(
const Matrix2& a, Real b);
367 inline void div(
const Matrix2& a, Real b);
376 inline void set(
const Matrix2&);
377 inline void set(Real);
378 inline void set(
const Real [2][2]);
379 inline void set(
const Real*);
381 inline void setZero();
382 inline void setIdentity();
383 inline void setDiagonal(
const Vector2&);
384 inline void setTranspose(
const Matrix2&);
385 inline void setNegative(
const Matrix2&);
386 inline bool setInverse(
const Matrix2&);
387 inline void setScale(Real s);
388 inline void setScale(Real sx, Real sy);
389 inline void setRotate(Real rads);
392 inline void get(
Matrix2&)
const;
393 inline void get(Real [2][2])
const;
394 inline void get(Real [4])
const;
396 inline void getTranspose(
Matrix2&)
const;
397 inline void getNegative(
Matrix2&)
const;
398 inline bool getInverse(
Matrix2&)
const;
400 inline void inplaceTranspose();
401 inline void inplaceNegative();
402 inline bool inplaceInverse();
403 inline void inplaceMul(Real s);
404 inline void inplaceDiv(Real s);
405 inline void inplaceRowScale(Real sx, Real sy);
406 inline void inplaceColScale(Real sx, Real sy);
408 inline bool isZero(Real eps=Zero)
const;
409 inline bool isIdentity(Real eps=Zero)
const;
410 inline bool isEqual(
const Matrix2&,Real eps=Zero)
const;
411 inline bool isInvertible(Real eps=Zero)
const;
412 inline Real determinant()
const;
413 inline Real trace()
const;
414 inline Real minElement(
int* i=NULL,
int* j=NULL)
const;
415 inline Real maxElement(
int* i=NULL,
int* j=NULL)
const;
416 inline Real minAbsElement(
int* i=NULL,
int* j=NULL)
const;
417 inline Real maxAbsElement(
int* i=NULL,
int* j=NULL)
const;
420 bool Write(
File&)
const;
422 inline Real* col(
int j) {
return data[j]; }
423 inline Real* col1() {
return data[0]; }
424 inline Real* col2() {
return data[1]; }
425 inline const Real* col(
int j)
const {
return data[j]; }
426 inline const Real* col1()
const {
return data[0]; }
427 inline const Real* col2()
const {
return data[1]; }
429 inline void setCol(
int j,
const Vector2& v) { v.get(data[j]); }
430 inline void setCol1(
const Vector2& v) { v.get(data[0]); }
431 inline void setCol2(
const Vector2& v) { v.get(data[1]); }
433 inline void setRow(
int i,
const Vector2& v) { v.get(data[0][i], data[1][i]); }
434 inline void setRow1(
const Vector2& v) { v.get(data[0][0], data[1][0]); }
435 inline void setRow2(
const Vector2& v) { v.get(data[0][1], data[1][1]); }
437 inline void getCol(
int j,
Vector2& v)
const { v.set(data[j]); }
438 inline void getCol1(
Vector2& v)
const { v.set(data[0]); }
439 inline void getCol2(
Vector2& v)
const { v.set(data[1]); }
441 inline void getRow(
int i,
Vector2& v)
const { v.set(data[0][i], data[1][i]); }
442 inline void getRow1(
Vector2& v)
const { v.set(data[0][0], data[1][0]); }
443 inline void getRow2(
Vector2& v)
const { v.set(data[0][1], data[1][1]); }
452 inline Real determinant(
const Matrix2&);
453 inline Real trace(
const Matrix2&);
475 explicit Matrix3(
const Real [3][3]);
476 explicit Matrix3(
const Real *);
479 bool operator == (
const Matrix3&)
const;
480 bool operator != (
const Matrix3&)
const;
482 inline void operator += (
const Matrix3&);
483 inline void operator -= (
const Matrix3&);
484 inline void operator *= (
const Matrix3&);
485 inline void operator *= (Real scale);
486 inline void operator /= (Real scale);
487 operator const Real*()
const {
return &data[0][0]; }
488 inline Real& operator () (
int i,
int j) {
return data[j][i]; }
489 inline const Real& operator () (
int i,
int j)
const {
return data[j][i]; }
502 inline void mul(
const Matrix3& a, Real b);
503 inline void div(
const Matrix3& a, Real b);
515 inline void mulVectorTranspose(
const Vector2& a,
Vector2& out)
const;
518 inline void set(
const Matrix3&);
519 inline void set(Real);
520 inline void set(
const Real [3][3]);
521 inline void set(
const Real [9]);
523 inline void setZero();
524 inline void setIdentity();
525 inline void setDiagonal(
const Vector3&);
526 inline void setTranspose(
const Matrix3&);
527 inline void setNegative(
const Matrix3&);
528 bool setInverse(
const Matrix3&);
529 inline void setScale(Real s);
530 inline void setScale(Real sx, Real sy, Real sz);
531 inline void setCrossProduct(
const Vector3&);
532 inline void setRotateX(Real rads);
533 inline void setRotateY(Real rads);
534 inline void setRotateZ(Real rads);
537 inline void get(
Matrix3&)
const;
538 inline void get(Real [3][3])
const;
539 inline void get(Real [9])
const;
541 inline void getTranspose(
Matrix3&)
const;
542 inline void getNegative(
Matrix3&)
const;
543 inline bool getInverse(
Matrix3&)
const;
544 inline void getCrossProduct(
Vector3&)
const;
546 inline void inplaceTranspose();
547 inline void inplaceNegative();
548 inline bool inplaceInverse();
549 inline void inplaceMul(Real s);
550 inline void inplaceDiv(Real s);
551 inline void inplaceRowScale(Real sx, Real sy, Real sz);
552 inline void inplaceColScale(Real sx, Real sy, Real sz);
554 inline bool isZero(Real eps=Zero)
const;
555 inline bool isIdentity(Real eps=Zero)
const;
556 inline bool isEqual(
const Matrix3&,Real eps=Zero)
const;
557 inline bool isInvertible(Real eps=Zero)
const;
558 Real cofactor(
int i,
int j)
const;
559 Real determinant()
const;
560 inline Real trace()
const;
561 inline Real minElement(
int* i=NULL,
int* j=NULL)
const;
562 inline Real maxElement(
int* i=NULL,
int* j=NULL)
const;
563 inline Real minAbsElement(
int* i=NULL,
int* j=NULL)
const;
564 inline Real maxAbsElement(
int* i=NULL,
int* j=NULL)
const;
567 bool Write(
File&)
const;
569 inline Real* col(
int j) {
return data[j]; }
570 inline Real* col1() {
return data[0]; }
571 inline Real* col2() {
return data[1]; }
572 inline Real* col3() {
return data[2]; }
573 inline const Real* col(
int j)
const {
return data[j]; }
574 inline const Real* col1()
const {
return data[0]; }
575 inline const Real* col2()
const {
return data[1]; }
576 inline const Real* col3()
const {
return data[2]; }
578 inline void setCol(
int j,
const Vector3& v) { v.get(data[j]); }
579 inline void setCol1(
const Vector3& v) { v.get(data[0]); }
580 inline void setCol2(
const Vector3& v) { v.get(data[1]); }
581 inline void setCol3(
const Vector3& v) { v.get(data[2]); }
583 inline void setRow(
int i,
const Vector3& v) { v.get(data[0][i], data[1][i], data[2][i]); }
584 inline void setRow1(
const Vector3& v) { v.get(data[0][0], data[1][0], data[2][0]); }
585 inline void setRow2(
const Vector3& v) { v.get(data[0][1], data[1][1], data[2][1]); }
586 inline void setRow3(
const Vector3& v) { v.get(data[0][2], data[1][2], data[2][2]); }
588 inline void getCol(
int j,
Vector3& v)
const { v.set(data[j]); }
589 inline void getCol1(
Vector3& v)
const { v.set(data[0]); }
590 inline void getCol2(
Vector3& v)
const { v.set(data[1]); }
591 inline void getCol3(
Vector3& v)
const { v.set(data[2]); }
593 inline void getRow(
int i,
Vector3& v)
const { v.set(data[0][i], data[1][i], data[2][i]); }
594 inline void getRow1(
Vector3& v)
const { v.set(data[0][0], data[1][0], data[2][0]); }
595 inline void getRow2(
Vector3& v)
const { v.set(data[0][1], data[1][1], data[2][1]); }
596 inline void getRow3(
Vector3& v)
const { v.set(data[0][2], data[1][2], data[2][2]); }
604 inline Vector2 getTranslation2D()
const {
return Vector2(col3()); }
610 inline Real determinant(
const Matrix3&);
611 inline Real trace(
const Matrix3&);
632 explicit Matrix4(
const Real [4][4]);
633 explicit Matrix4(
const Real *);
640 bool operator == (
const Matrix4&)
const;
641 bool operator != (
const Matrix4&)
const;
643 inline void operator += (
const Matrix4&);
644 inline void operator -= (
const Matrix4&);
645 inline void operator *= (
const Matrix4&);
646 inline void operator *= (Real scale);
647 inline void operator /= (Real scale);
649 inline operator const Real*()
const {
return &data[0][0]; }
650 inline Real& operator () (
int i,
int j) {
return data[j][i]; }
651 inline const Real& operator () (
int i,
int j)
const {
return data[j][i]; }
664 inline void mul(
const Matrix4& a, Real b);
665 inline void div(
const Matrix4& a, Real b);
678 inline void mulVectorTranspose(
const Vector3& a,
Vector3& out)
const;
681 inline void set(
const Matrix4&);
682 inline void set(Real);
683 inline void set(
const Real [4][4]);
684 inline void set(
const Real *);
687 inline void set(
const Matrix3&);
689 inline void setZero();
690 inline void setIdentity();
691 inline void setDiagonal(
const Vector4&);
692 inline void setTranslate(
const Vector3& trans);
693 inline void setTranspose(
const Matrix4&);
694 inline void setNegative(
const Matrix4&);
695 bool setInverse(
const Matrix4&);
698 inline void get(
Matrix4&)
const;
699 inline void get(Real [4][4])
const;
700 inline void get(Real [16])
const;
703 inline void get(Matrix3&)
const;
704 inline void get(Matrix3&,
Vector3&)
const;
705 inline void getTranspose(
Matrix4&)
const;
706 inline void getNegative(
Matrix4&)
const;
707 inline bool getInverse(
Matrix4&)
const;
709 inline void inplaceTranspose();
710 inline void inplaceNegative();
711 inline bool inplaceInverse();
712 inline void inplaceMul(Real s);
713 inline void inplaceDiv(Real s);
715 inline bool isZero(Real eps=Zero)
const;
716 inline bool isIdentity(Real eps=Zero)
const;
717 inline bool isEqual(
const Matrix4&,Real eps=Zero)
const;
718 inline bool isInvertible(Real eps=Zero)
const;
719 Real cofactor(
int i,
int j)
const;
720 Real determinant()
const;
721 inline Real trace()
const;
722 inline Real minElement(
int* i=NULL,
int* j=NULL)
const;
723 inline Real maxElement(
int* i=NULL,
int* j=NULL)
const;
724 inline Real minAbsElement(
int* i=NULL,
int* j=NULL)
const;
725 inline Real maxAbsElement(
int* i=NULL,
int* j=NULL)
const;
728 bool Write(
File&)
const;
730 inline Real* col(
int j) {
return data[j]; }
731 inline Real* col1() {
return data[0]; }
732 inline Real* col2() {
return data[1]; }
733 inline Real* col3() {
return data[2]; }
734 inline Real* col4() {
return data[3]; }
735 inline const Real* col(
int j)
const {
return data[j]; }
736 inline const Real* col1()
const {
return data[0]; }
737 inline const Real* col2()
const {
return data[1]; }
738 inline const Real* col3()
const {
return data[2]; }
739 inline const Real* col4()
const {
return data[3]; }
741 inline void setCol(
int j,
const Vector4& v) { v.get(data[j]); }
742 inline void setCol1(
const Vector4& v) { v.get(data[0]); }
743 inline void setCol2(
const Vector4& v) { v.get(data[1]); }
744 inline void setCol3(
const Vector4& v) { v.get(data[2]); }
745 inline void setCol4(
const Vector4& v) { v.get(data[3]); }
746 inline void setCol(
int j,
const Vector3& v) { v.get(data[j]); }
747 inline void setCol1(
const Vector3& v) { v.get(data[0]); }
748 inline void setCol2(
const Vector3& v) { v.get(data[1]); }
749 inline void setCol3(
const Vector3& v) { v.get(data[2]); }
750 inline void setCol4(
const Vector3& v) { v.get(data[3]); }
752 inline void setRow(
int i,
const Vector4& v) { v.get(data[0][i], data[1][i], data[2][i], data[3][i]); }
753 inline void setRow1(
const Vector4& v) { v.get(data[0][0], data[1][0], data[2][0], data[3][0]); }
754 inline void setRow2(
const Vector4& v) { v.get(data[0][1], data[1][1], data[2][1], data[3][1]); }
755 inline void setRow3(
const Vector4& v) { v.get(data[0][2], data[1][2], data[2][2], data[3][2]); }
756 inline void setRow4(
const Vector4& v) { v.get(data[0][3], data[1][3], data[2][3], data[3][3]); }
757 inline void setRow(
int i,
const Vector3& v) { v.get(data[0][i], data[1][i], data[2][i]); }
758 inline void setRow1(
const Vector3& v) { v.get(data[0][0], data[1][0], data[2][0]); }
759 inline void setRow2(
const Vector3& v) { v.get(data[0][1], data[1][1], data[2][1]); }
760 inline void setRow3(
const Vector3& v) { v.get(data[0][2], data[1][2], data[2][2]); }
761 inline void setRow4(
const Vector3& v) { v.get(data[0][3], data[1][3], data[2][3]); }
763 inline void getCol(
int j,
Vector4& v)
const { v.set(data[j]); }
764 inline void getCol1(
Vector4& v)
const { v.set(data[0]); }
765 inline void getCol2(
Vector4& v)
const { v.set(data[1]); }
766 inline void getCol3(
Vector4& v)
const { v.set(data[2]); }
767 inline void getCol4(
Vector4& v)
const { v.set(data[3]); }
768 inline void getCol(
int j,
Vector3& v)
const { v.set(data[j]); }
769 inline void getCol1(
Vector3& v)
const { v.set(data[0]); }
770 inline void getCol2(
Vector3& v)
const { v.set(data[1]); }
771 inline void getCol3(
Vector3& v)
const { v.set(data[2]); }
772 inline void getCol4(
Vector3& v)
const { v.set(data[3]); }
774 inline void getRow(
int i,
Vector4& v)
const { v.set(data[0][i], data[1][i], data[2][i], data[3][i]); }
775 inline void getRow1(
Vector4& v)
const { v.set(data[0][0], data[1][0], data[2][0], data[3][0]); }
776 inline void getRow2(
Vector4& v)
const { v.set(data[0][1], data[1][1], data[2][1], data[3][1]); }
777 inline void getRow3(
Vector4& v)
const { v.set(data[0][2], data[1][2], data[2][2], data[3][2]); }
778 inline void getRow4(
Vector4& v)
const { v.set(data[0][3], data[1][3], data[2][3], data[3][3]); }
779 inline void getRow(
int i,
Vector3& v)
const { v.set(data[0][i], data[1][i], data[2][i]); }
780 inline void getRow1(
Vector3& v)
const { v.set(data[0][0], data[1][0], data[2][0]); }
781 inline void getRow2(
Vector3& v)
const { v.set(data[0][1], data[1][1], data[2][1]); }
782 inline void getRow3(
Vector3& v)
const { v.set(data[0][2], data[1][2], data[2][2]); }
783 inline void getRow4(
Vector3& v)
const { v.set(data[0][3], data[1][3], data[2][3]); }
795 inline Real determinant(
const Matrix4&);
796 inline Real trace(
const Matrix4&);
833 inline void operator *= (
const Matrix3&);
834 inline void operator += (
const Vector3&);
835 inline void operator -= (
const Vector3&);
836 inline operator Matrix4 ()
const;
854 inline void mulPointInverse(
const Vector3& a,
Vector3& out)
const;
855 inline void mulVectorInverse(
const Vector3& a,
Vector3& out)
const;
858 inline void setIdentity();
862 inline void set(
const Matrix4&);
863 inline void setRotate(
const Matrix3&);
864 inline void setTranslate(
const Vector3&);
865 inline void setRotation(
const Matrix3&);
866 inline void setTranslation(
const Vector3&);
868 inline void setRotated(
const RigidTransform& a,
const Matrix3& r);
872 inline void get(Matrix3&,
Vector3&)
const;
874 inline void get(
Matrix4&)
const;
875 inline void getRotation(Matrix3&)
const;
876 inline void getTranslation(
Vector3&)
const;
879 inline void inplaceInverse();
880 inline void inplaceRotate(
const Matrix3&);
881 inline void inplaceShift(
const Vector3&);
883 inline bool isIdentity(Real eps=Zero)
const;
884 bool isValid(Real eps=Epsilon)
const;
887 bool Write(
File&)
const;
927 inline void mulPointInverse(
const Vector2& a,
Vector2& out)
const;
928 inline void mulVectorInverse(
const Vector2& a,
Vector2& out)
const;
930 inline void setIdentity();
932 inline void set(
const Matrix3& mat);
933 inline void set(Real theta,
const Vector2& t);
936 inline void get(
Matrix3& mat)
const;
937 inline void get(Real& theta,
Vector2& t)
const;
939 inline bool isIdentity(Real eps=Zero)
const;
940 bool isValid(Real eps=Epsilon)
const;
943 bool Write(
File&)
const;
955 inline bool Vector2::operator == (
const Vector2& a)
const {
return a.x == x && a.y == y; }
956 inline bool Vector2::operator != (
const Vector2& a)
const {
return a.x != x || a.y != y; }
957 inline const Vector2& Vector2::operator = (
const Vector2& v) {
set(v);
return *
this; }
958 inline void Vector2::operator += (
const Vector2& v) { x += v.x; y += v.y; }
959 inline void Vector2::operator -= (
const Vector2& v) { x -= v.x; y -= v.y; }
960 inline void Vector2::operator *= (Real c) { inplaceMul(c); }
961 inline void Vector2::operator /= (Real c) { inplaceDiv(c); }
962 inline Real& Vector2::operator [] (
int i) {
return data[i]; }
963 inline const Real& Vector2::operator [] (
int i)
const {
return data[i]; }
964 inline Vector2::operator Real* () {
return data; }
965 inline Vector2::operator
const Real* ()
const {
return data; }
966 inline void Vector2::add(
const Vector2& a,
const Vector2& b) { x=a.x+b.x; y=a.y+b.y; }
967 inline void Vector2::sub(
const Vector2& a,
const Vector2& b) { x=a.x-b.x; y=a.y-b.y; }
968 inline void Vector2::mul(
const Vector2& a, Real b) { x=a.x*b; y=a.y*b; }
969 inline void Vector2::div(
const Vector2& a, Real b) { x=a.x/b; y=a.y/b; }
970 inline void Vector2::madd(
const Vector2& a, Real b) { x+=a.x*b; y+=a.y*b; }
971 inline Real Vector2::dot(
const Vector2& a)
const {
return x*a.x + y*a.y; }
973 inline Real Vector2::distance(
const Vector2& a)
const {
return Sqrt(distanceSquared(a)); }
974 inline Real Vector2::distanceSquared(
const Vector2& a)
const {
return Sqr(x-a.x)+Sqr(y-a.y); }
975 inline Real Vector2::minElement(
int* index)
const {
976 if(x <= y) {
if(index) *index=0;
return x; }
977 else {
if(index) *index=1;
return y; }
979 inline Real Vector2::maxElement(
int* index)
const {
980 if(x >= y) {
if(index) *index=0;
return x; }
981 else {
if(index) *index=1;
return y; }
983 inline Real Vector2::minAbsElement(
int* index)
const {
984 if(Abs(x) <= Abs(y)) {
if(index) *index=0;
return x; }
985 else {
if(index) *index=1;
return y; }
987 inline Real Vector2::maxAbsElement(
int* index)
const {
988 if(Abs(x) >= Abs(y)) {
if(index) *index=0;
return x; }
989 else {
if(index) *index=1;
return y; }
991 inline Real Vector2::norm()
const {
return Sqrt(normSquared()); }
992 inline Real Vector2::normSquared()
const {
return Sqr(x)+Sqr(y); }
994 inline void Vector2::set(
const Vector2& a) {
set(a.x,a.y); }
995 inline void Vector2::set(Real _x) { x = y = _x; }
996 inline void Vector2::set(Real _x, Real _y) { x=_x; y=_y; }
997 inline void Vector2::set(
const Real* _data) {
if(_data)
set(_data[0],_data[1]);
else setZero(); }
998 inline void Vector2::setZero() { x = y = Zero; }
1001 inline void Vector2::setNegative(
const Vector2& a) { x=-a.x; y=-a.y; }
1002 inline void Vector2::setNormalized(
const Vector2& a) { mul(a,
PseudoInv(a.norm())); }
1004 inline void Vector2::setMinimum(
const Vector2& v) {
if(v.x<x) x=v.x;
if(v.y<y) y=v.y; }
1005 inline void Vector2::setMinimum(
const Vector2& a,
const Vector2& b) {
set(Min(a.x,b.x),Min(a.y,b.y)); }
1006 inline void Vector2::setMaximum(
const Vector2& v) {
if(v.x>x) x=v.x;
if(v.y>y) y=v.y; }
1007 inline void Vector2::setMaximum(
const Vector2& a,
const Vector2& b) {
set(Max(a.x,b.x),Max(a.y,b.y)); }
1008 inline void Vector2::get(
Vector2& v)
const {
get(v.x,v.y); }
1009 inline void Vector2::get(Real& _x, Real& _y)
const { _x=x; _y=y; }
1010 inline void Vector2::get(Real _data[2])
const {
get(_data[0],_data[1]); }
1011 inline void Vector2::getNegative(
Vector2& v)
const { v.setNegative(*
this); }
1012 inline void Vector2::getNormalized(
Vector2& v)
const { v.setNormalized(*
this); }
1014 inline void Vector2::inplaceNegative() { x=-x; y=-y; }
1015 inline void Vector2::inplaceMul(Real c) { x*=c; y*=c; }
1016 inline void Vector2::inplaceDiv(Real c) { x/=c; y/=c; }
1017 inline void Vector2::inplaceNormalize() { inplaceMul(
PseudoInv(norm())); }
1018 inline bool Vector2::isZero(Real eps)
const {
return FuzzyZero(x,eps)&&FuzzyZero(y,eps); }
1021 inline bool Vector3::operator == (
const Vector3& a)
const {
return a.x == x && a.y == y && a.z == z; }
1022 inline bool Vector3::operator != (
const Vector3& a)
const {
return a.x != x || a.y != y || a.z != z; }
1023 inline const Vector3& Vector3::operator = (
const Vector3& v) {
set(v);
return *
this; }
1024 inline void Vector3::operator += (
const Vector3& v) { x += v.x; y += v.y; z += v.z; }
1025 inline void Vector3::operator -= (
const Vector3& v) { x -= v.x; y -= v.y; z -= v.z; }
1026 inline void Vector3::operator *= (Real c) { inplaceMul(c); }
1027 inline void Vector3::operator /= (Real c) { inplaceDiv(c); }
1028 inline Real& Vector3::operator [] (
int i) {
return data[i]; }
1029 inline const Real& Vector3::operator [] (
int i)
const {
return data[i]; }
1030 inline Vector3::operator Real* () {
return data; }
1031 inline Vector3::operator
const Real* ()
const {
return data; }
1032 inline void Vector3::add(
const Vector3& a,
const Vector3& b) { x=a.x+b.x; y=a.y+b.y; z=a.z+b.z; }
1033 inline void Vector3::sub(
const Vector3& a,
const Vector3& b) { x=a.x-b.x; y=a.y-b.y; z=a.z-b.z; }
1034 inline void Vector3::mul(
const Vector3& a, Real b) { x=a.x*b; y=a.y*b; z=a.z*b; }
1035 inline void Vector3::div(
const Vector3& a, Real b) { x=a.x/b; y=a.y/b; z=a.z/b; }
1036 inline void Vector3::madd(
const Vector3& a, Real b) { x+=a.x*b; y+=a.y*b; z+=a.z*b; }
1037 inline Real Vector3::dot(
const Vector3& a)
const {
return x*a.x + y*a.y + z*a.z; }
1038 inline Real Vector3::distance(
const Vector3& a)
const {
return Sqrt(distanceSquared(a)); }
1039 inline Real Vector3::distanceSquared(
const Vector3& a)
const {
return Sqr(x-a.x)+Sqr(y-a.y)+Sqr(z-a.z); }
1040 inline Real Vector3::norm()
const {
return Sqrt(normSquared()); }
1041 inline Real Vector3::normSquared()
const {
return Sqr(x)+Sqr(y)+Sqr(z); }
1043 inline Real Vector3::minElement(
int* index)
const 1047 if(y < vmin) { vmin=y; imin=1; }
1048 if(z < vmin) { vmin=z; imin=2; }
1049 if(index) *index=imin;
1052 inline Real Vector3::maxElement(
int* index)
const 1056 if(y > vmax) { vmax=y; imin=1; }
1057 if(z > vmax) { vmax=z; imin=2; }
1058 if(index) *index=imin;
1061 inline Real Vector3::minAbsElement(
int* index)
const 1065 if(Abs(y) < vmin) { vmin=Abs(y); imin=1; }
1066 if(Abs(z) < vmin) { vmin=Abs(z); imin=2; }
1067 if(index) *index=imin;
1070 inline Real Vector3::maxAbsElement(
int* index)
const 1074 if(Abs(y) > vmax) { vmax=Abs(y); imin=1; }
1075 if(Abs(z) > vmax) { vmax=Abs(z); imin=2; }
1076 if(index) *index=imin;
1079 inline void Vector3::set(
const Vector3& a) {
set(a.x,a.y,a.z); }
1080 inline void Vector3::set(Real _x) { x = y = z = _x; }
1081 inline void Vector3::set(Real _x, Real _y, Real _z) { x=_x; y=_y; z=_z; }
1082 inline void Vector3::set(
const Real *_data) {
if(_data)
set(_data[0],_data[1],_data[2]);
else setZero(); }
1083 inline void Vector3::setZero() { x = y = z = Zero; }
1084 inline void Vector3::setNegative(
const Vector3& a) { x=-a.x; y=-a.y; z=-a.z; }
1085 inline void Vector3::setCross(
const Vector3& a,
const Vector3& b) { x=a.y*b.z-a.z*b.y; y=a.z*b.x-a.x*b.z; z=a.x*b.y-a.y*b.x; }
1086 inline void Vector3::setNormalized(
const Vector3& a) { mul(a,
PseudoInv(a.norm())); }
1087 inline void Vector3::setProjection(
const Vector3& a,
const Vector3& b) { mul(b, a.dot(b)/b.dot(b)); }
1088 inline void Vector3::setMinimum(
const Vector3& v) {
if(v.x<x) x=v.x;
if(v.y<y) y=v.y;
if(v.z<z) z=v.z; }
1089 inline void Vector3::setMinimum(
const Vector3& a,
const Vector3& b) {
set(Min(a.x,b.x),Min(a.y,b.y),Min(a.z,b.z)); }
1090 inline void Vector3::setMaximum(
const Vector3& v) {
if(v.x>x) x=v.x;
if(v.y>y) y=v.y;
if(v.z>z) z=v.z; }
1091 inline void Vector3::setMaximum(
const Vector3& a,
const Vector3& b) {
set(Max(a.x,b.x),Max(a.y,b.y),Max(a.z,b.z)); }
1092 inline void Vector3::get(
Vector3& v)
const {
get(v.x,v.y,v.z); }
1093 inline void Vector3::get(Real& _x, Real& _y, Real& _z)
const { _x=x; _y=y; _z=z; }
1094 inline void Vector3::get(Real _data[3])
const {
get(_data[0],_data[1],_data[2]); }
1095 inline void Vector3::getNegative(
Vector3& v)
const { v.setNegative(*
this); }
1096 inline void Vector3::getNormalized(
Vector3& v)
const { v.setNormalized(*
this); }
1100 Real n = normSquared(),invn = 1.0;
1102 yb.set(0.0,1.0,0.0);
1103 zb.set(0.0,0.0,1.0);
1112 yb.set(0.0,-1.0,0.0);
1113 zb.set(0.0,0.0,1.0);
1116 else scale = n*(n-x)/(Sqr(n)-Sqr(x));
1118 yb.y = x + scale*Sqr(z);
1122 zb.z = x + scale*Sqr(y);
1128 inline void Vector3::inplaceNegative() { x=-x; y=-y; z=-z; }
1129 inline void Vector3::inplaceMul(Real c) { x*=c; y*=c; z*=c; }
1130 inline void Vector3::inplaceDiv(Real c) { x/=c; y/=c; z/=c; }
1131 inline void Vector3::inplaceNormalize() { inplaceMul(
PseudoInv(norm())); }
1132 inline bool Vector3::isZero(Real eps)
const {
return FuzzyZero(x,eps)&&FuzzyZero(y,eps)&&FuzzyZero(z,eps); }
1135 inline bool Vector4::operator == (
const Vector4& a)
const {
return a.x == x && a.y == y && a.z == z && a.w == w; }
1136 inline bool Vector4::operator != (
const Vector4& a)
const {
return a.x != x || a.y != y || a.z != z || a.w != w; }
1137 inline const Vector4& Vector4::operator = (
const Vector4& v) {
set(v);
return *
this; }
1138 inline void Vector4::operator += (
const Vector4& v) { x += v.x; y += v.y; z += v.z; w += v.w; }
1139 inline void Vector4::operator -= (
const Vector4& v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; }
1140 inline void Vector4::operator *= (Real c) { inplaceMul(c); }
1141 inline void Vector4::operator /= (Real c) { inplaceDiv(c); }
1142 inline void Vector4::operator += (
const Vector3& v) { x += v.x; y += v.y; z += v.z; }
1143 inline void Vector4::operator -= (
const Vector3& v) { x -= v.x; y -= v.y; z -= v.z; }
1144 inline Real& Vector4::operator [] (
int i) {
return data[i]; }
1145 inline const Real& Vector4::operator [] (
int i)
const {
return data[i]; }
1146 inline Vector4::operator
Vector3()
const {
return Vector3(x,y,z); }
1147 inline Vector4::operator Real* () {
return data; }
1148 inline Vector4::operator
const Real* ()
const {
return data; }
1149 inline void Vector4::add(
const Vector4& a,
const Vector4& b) { x=a.x+b.x; y=a.y+b.y; z=a.z+b.z; w=a.w+b.w; }
1150 inline void Vector4::sub(
const Vector4& a,
const Vector4& b) { x=a.x-b.x; y=a.y-b.y; z=a.z-b.z; w=a.w-b.w; }
1151 inline void Vector4::mul(
const Vector4& a, Real b) { x=a.x*b; y=a.y*b; z=a.z*b; w=a.w*b; }
1152 inline void Vector4::div(
const Vector4& a, Real b) { x=a.x/b; y=a.y/b; z=a.z/b; w=a.w/b; }
1153 inline void Vector4::madd(
const Vector4& a, Real b) { x+=a.x*b; y+=a.y*b; z+=a.z*b; w+=a.w*b; }
1154 inline Real Vector4::dot(
const Vector4& a)
const {
return x*a.x + y*a.y + z*a.z + w*a.w; }
1155 inline Real Vector4::dot3(
const Vector4& a)
const {
return x*a.x + y*a.y + z*a.z; }
1156 inline Real Vector4::dot3(
const Vector3& a)
const {
return x*a.x + y*a.y + z*a.z; }
1157 inline Real Vector4::distance(
const Vector4& a)
const {
return Sqrt(distanceSquared(a)); }
1158 inline Real Vector4::distanceSquared(
const Vector4& a)
const {
return Sqr(x-a.x)+Sqr(y-a.y)+Sqr(z-a.z)+Sqr(w-a.w); }
1159 inline Real Vector4::norm()
const {
return Sqrt(normSquared()); }
1160 inline Real Vector4::normSquared()
const {
return Sqr(x)+Sqr(y)+Sqr(z)+Sqr(w); }
1161 inline Real Vector4::length()
const {
return norm(); }
1162 inline Real Vector4::minElement(
int* index)
const 1166 if(y < vmin) { vmin=y; imin=1; }
1167 if(z < vmin) { vmin=z; imin=2; }
1168 if(w < vmin) { vmin=w; imin=3; }
1169 if(index) *index=imin;
1172 inline Real Vector4::maxElement(
int* index)
const 1176 if(y > vmax) { vmax=y; imin=1; }
1177 if(z > vmax) { vmax=z; imin=2; }
1178 if(w > vmax) { vmax=w; imin=3; }
1179 if(index) *index=imin;
1182 inline Real Vector4::minAbsElement(
int* index)
const 1186 if(Abs(y) < vmin) { vmin=Abs(y); imin=1; }
1187 if(Abs(z) < vmin) { vmin=Abs(z); imin=2; }
1188 if(Abs(w) < vmin) { vmin=Abs(w); imin=3; }
1189 if(index) *index=imin;
1192 inline Real Vector4::maxAbsElement(
int* index)
const 1196 if(Abs(y) > vmax) { vmax=Abs(y); imin=1; }
1197 if(Abs(z) > vmax) { vmax=Abs(z); imin=2; }
1198 if(Abs(w) > vmax) { vmax=Abs(w); imin=3; }
1199 if(index) *index=imin;
1202 inline void Vector4::set(
const Vector4& a) { x = a.x; y = a.y; z = a.z; w = a.w; }
1203 inline void Vector4::set(Real _x) { x = y = z = w = _x; }
1204 inline void Vector4::set(Real _x, Real _y, Real _z, Real _w) { x=_x; y=_y; z=_z; w=_w; }
1205 inline void Vector4::set(
const Real *_data) {
if(_data)
set(_data[0],_data[1],_data[2],_data[3]);
else setZero(); }
1206 inline void Vector4::setZero() { x = y = z = w = Zero; }
1209 inline void Vector4::setNegative(
const Vector4& v) {
set(-v.x, -v.y, -v.z, -v.w); }
1210 inline void Vector4::setNormalized(
const Vector4& v) { mul(v,
PseudoInv(v.norm())); }
1211 inline void Vector4::setProjection(
const Vector4& a,
const Vector4& b) { mul(b, a.dot(b)/b.dot(b)); }
1212 inline void Vector4::setMinimum(
const Vector4& v) {
if(v.x<x) x=v.x;
if(v.y<y) y=v.y;
if(v.z<z) z=v.z;
if(v.w<w) w=v.w; }
1213 inline void Vector4::setMinimum(
const Vector4& a,
const Vector4& b) {
set(Min(a.x,b.x),Min(a.y,b.y),Min(a.z,b.z),Min(a.w,b.w)); }
1214 inline void Vector4::setMaximum(
const Vector4& v) {
if(v.x>x) x=v.x;
if(v.y>y) y=v.y;
if(v.z>z) z=v.z;
if(v.w>w) w=v.w; }
1215 inline void Vector4::setMaximum(
const Vector4& a,
const Vector4& b) {
set(Max(a.x,b.x),Max(a.y,b.y),Max(a.z,b.z),Max(a.w,b.w)); }
1216 inline void Vector4::get(
Vector4& v)
const {
get(v.x,v.y,v.z,v.w); }
1217 inline void Vector4::get(Real& _x, Real& _y, Real& _z, Real& _w)
const { _x=x; _y=y; _z=z; _w=w; }
1218 inline void Vector4::get(Real _data[4])
const {
get(_data[0],_data[1],_data[2],_data[3]); }
1219 inline void Vector4::get(
Vector3& v)
const { v.x=x; v.y=y; v.z=z; }
1220 inline void Vector4::getNegative(
Vector4& v)
const { v.setNegative(*
this); }
1221 inline void Vector4::getNormalized(
Vector4& v)
const { v.setNormalized(*
this); }
1222 inline void Vector4::inplaceNegative() { x=-x; y=-y; z=-z; w=-w; }
1223 inline void Vector4::inplaceMul(Real c) { x*=c; y*=c; z*=c; w*=c; }
1224 inline void Vector4::inplaceDiv(Real c) { x/=c; y/=c; z/=c; w/=c; }
1225 inline void Vector4::inplaceNormalize() { inplaceMul(
PseudoInv(norm())); }
1226 inline bool Vector4::isZero(Real eps)
const {
return FuzzyZero(x,eps)&&FuzzyZero(y,eps)&&FuzzyZero(z,eps)&&FuzzyZero(w,eps); }
1237 inline void Matrix2::operator += (
const Matrix2& m)
1243 data[i][j] += m.
data[i][j];
1247 inline void Matrix2::operator -= (
const Matrix2& m)
1253 data[i][j] -= m.
data[i][j];
1257 inline void Matrix2::operator *= (
const Matrix2& m)
1262 inline void Matrix2::operator *= (Real s)
1267 inline void Matrix2::operator /= (Real s)
1277 data[i][j] = a.
data[i][j] + b.
data[i][j];
1285 data[i][j] = a.
data[i][j] - b.
data[i][j];
1299 inline void Matrix2::mulTransposeA(
const Matrix2& a,
const Matrix2& b)
1310 inline void Matrix2::mulTransposeB(
const Matrix2& a,
const Matrix2& b)
1321 inline void Matrix2::mul(
const Matrix2& a, Real b)
1326 data[i][j] = a.
data[i][j]*b;
1329 inline void Matrix2::div(
const Matrix2& a, Real b)
1334 data[i][j] = a.
data[i][j]/b;
1339 out.x = data[0][0]*a.x + data[1][0]*a.y;
1340 out.y = data[0][1]*a.x + data[1][1]*a.y;
1343 inline void Matrix2::mulTranspose(
const Vector2& a,
Vector2& out)
const 1345 out.x = data[0][0]*a.x + data[0][1]*a.y;
1346 out.y = data[1][0]*a.x + data[1][1]*a.y;
1349 inline void Matrix2::set(
const Matrix2& m)
1354 data[i][j] = m.
data[i][j];
1357 inline void Matrix2::set(Real x)
1365 inline void Matrix2::set(
const Real m[2][2])
1370 data[i][j] = m[i][j];
1373 inline void Matrix2::set(
const Real* m)
1381 for(j=0; j<2; j++, k++)
1391 inline void Matrix2::setZero()
1396 inline void Matrix2::setIdentity()
1401 data[i][j] =
Delta(i,j);
1404 inline void Matrix2::setDiagonal(
const Vector2& d)
1407 d.get(data[0][0],data[1][1]);
1410 inline void Matrix2::setTranspose(
const Matrix2& m)
1415 data[i][j] = m.
data[j][i];
1418 inline void Matrix2::setNegative(
const Matrix2& m)
1423 data[i][j] = -m.
data[i][j];
1428 Real det = m.determinant();
1429 if(det == Zero)
return false;
1430 Real detinv =
Inv(det);
1431 data[0][0] = m.
data[1][1];
1432 data[1][1] = m.
data[0][0];
1433 data[0][1] = -m.
data[0][1];
1434 data[1][0] = -m.
data[1][0];
1439 inline void Matrix2::setScale(Real s)
1442 data[0][0] = data[1][1] = s;
1445 inline void Matrix2::setScale(Real sx, Real sy)
1454 Real cr = Cos(rads);
1455 Real sr = Sin(rads);
1457 data[0][0] = cr; data[1][0] = -sr;
1458 data[0][1] = sr; data[1][1] = cr;
1463 data[0][0] = a.x*b.x; data[1][0] = a.x*b.y;
1464 data[0][1] = a.y*b.x; data[1][1] = a.y*b.y;
1468 inline void Matrix2::get(
Matrix2& m)
const 1473 inline void Matrix2::get(Real m [2][2])
const 1478 m[i][j] = data[i][j];
1481 inline void Matrix2::get(Real m [4])
const 1485 for(j=0; j<2; j++, k++)
1495 inline void Matrix2::getTranspose(
Matrix2& m)
const 1497 m.setTranspose(*
this);
1500 inline void Matrix2::getNegative(
Matrix2& m)
const 1502 m.setNegative(*
this);
1505 inline bool Matrix2::getInverse(
Matrix2& m)
const 1510 inline void Matrix2::inplaceTranspose()
1514 for(i=0; i<2; i++) {
1515 for(j=0; j<i; j++) {
1517 data[i][j] = data[j][i];
1523 inline void Matrix2::inplaceNegative()
1528 data[i][j] = -data[i][j];
1531 inline void Matrix2::inplaceMul(Real s)
1539 inline void Matrix2::inplaceDiv(Real s)
1547 inline void Matrix2::inplaceRowScale(Real sx, Real sy)
1550 for(j=0; j<2; j++) {
1556 inline void Matrix2::inplaceColScale(Real sx, Real sy)
1559 for(j=0; j<2; j++) {
1565 inline bool Matrix2::inplaceInverse()
1568 return setInverse(tmp);
1571 inline bool Matrix2::isZero(Real eps)
const 1573 return FuzzyZero(data[0][0],eps)
1574 && FuzzyZero(data[0][1],eps)
1575 && FuzzyZero(data[1][0],eps)
1576 && FuzzyZero(data[1][1],eps);
1579 inline bool Matrix2::isEqual(
const Matrix2&a,Real eps)
const 1587 inline bool Matrix2::isIdentity(Real eps)
const 1590 && FuzzyZero(data[0][1],eps)
1591 && FuzzyZero(data[1][0],eps)
1595 inline bool Matrix2::isInvertible(Real eps)
const 1597 return !FuzzyZero(determinant(),eps);
1600 inline Real Matrix2::trace()
const {
return data[0][0] + data[1][1]; }
1602 inline Real Matrix2::determinant()
const 1604 return data[0][0]*data[1][1]-data[0][1]*data[1][0];
1607 inline Real Matrix2::minElement(
int* _i,
int* _j)
const 1611 for(
int i=0;i<2;i++)
1612 for(
int j=0;j<2;j++)
1613 if(data[i][j] < vmin) {
1623 Real Matrix2::maxElement(
int* _i,
int* _j)
const 1627 for(
int i=0;i<2;i++)
1628 for(
int j=0;j<2;j++)
1629 if(data[i][j] > vmax) {
1639 Real Matrix2::minAbsElement(
int* _i,
int* _j)
const 1643 for(
int i=0;i<2;i++)
1644 for(
int j=0;j<2;j++)
1645 if(Abs(data[i][j]) < vmin) {
1646 vmin=Abs(data[i][j]);
1655 Real Matrix2::maxAbsElement(
int* _i,
int* _j)
const 1659 for(
int i=0;i<2;i++)
1660 for(
int j=0;j<2;j++)
1661 if(Abs(data[i][j]) > vmax) {
1662 vmax=Abs(data[i][j]);
1680 inline void Matrix3::operator += (
const Matrix3& m)
1686 data[i][j] += m.
data[i][j];
1690 inline void Matrix3::operator -= (
const Matrix3& m)
1696 data[i][j] -= m.
data[i][j];
1700 inline void Matrix3::operator *= (
const Matrix3& m)
1705 inline void Matrix3::operator *= (Real s)
1710 inline void Matrix3::operator /= (Real s)
1720 data[i][j] = a.
data[i][j] + b.
data[i][j];
1728 data[i][j] = a.
data[i][j] - b.
data[i][j];
1731 inline void Matrix3::mul(
const Matrix3& a, Real b)
1736 data[i][j] = a.
data[i][j]*b;
1739 inline void Matrix3::div(
const Matrix3& a, Real b)
1744 data[i][j] = a.
data[i][j]/b;
1749 out.x = data[0][0]*a.x + data[1][0]*a.y + data[2][0]*a.z;
1750 out.y = data[0][1]*a.x + data[1][1]*a.y + data[2][1]*a.z;
1751 out.z = data[0][2]*a.x + data[1][2]*a.y + data[2][2]*a.z;
1756 out.x = data[0][0]*a.x + data[0][1]*a.y + data[0][2]*a.z;
1757 out.y = data[1][0]*a.x + data[1][1]*a.y + data[1][2]*a.z;
1758 out.z = data[2][0]*a.x + data[2][1]*a.y + data[2][2]*a.z;
1763 out.x = data[0][0]*a.x + data[1][0]*a.y + data[2][0];
1764 out.y = data[0][1]*a.x + data[1][1]*a.y + data[2][1];
1769 out.x = data[0][0]*a.x + data[1][0]*a.y;
1770 out.y = data[0][1]*a.x + data[1][1]*a.y;
1775 out.x = data[0][0]*a.x + data[0][1]*a.y;
1776 out.y = data[1][0]*a.x + data[1][1]*a.y;
1779 inline void Matrix3::set(
const Matrix3& m)
1784 data[i][j] = m.
data[i][j];
1787 inline void Matrix3::set(Real x)
1795 inline void Matrix3::set(
const Real m[3][3])
1800 data[i][j] = m[i][j];
1803 inline void Matrix3::set(
const Real* m)
1811 for(j=0; j<3; j++, k++)
1822 inline void Matrix3::setZero()
1827 inline void Matrix3::setIdentity()
1832 data[i][j] =
Delta(i,j);
1835 inline void Matrix3::setDiagonal(
const Vector3& d)
1838 d.get(data[0][0],data[1][1],data[2][2]);
1841 inline void Matrix3::setTranspose(
const Matrix3& m)
1846 data[i][j] = m.
data[j][i];
1849 inline void Matrix3::setNegative(
const Matrix3& m)
1854 data[i][j] = -m.
data[i][j];
1857 inline void Matrix3::setScale(Real s)
1860 data[0][0] = data[1][1] = data[2][2] = s;
1863 inline void Matrix3::setScale(Real sx, Real sy, Real sz)
1873 Real cr = Cos(rads);
1874 Real sr = Sin(rads);
1876 data[1][1] = cr; data[2][1] = -sr;
1877 data[1][2] = sr; data[2][2] = cr;
1882 Real cr = Cos(rads);
1883 Real sr = Sin(rads);
1885 data[0][0] = cr; data[2][0] = sr;
1886 data[0][2] = -sr; data[2][2] = cr;
1891 Real cr = Cos(rads);
1892 Real sr = Sin(rads);
1894 data[0][0] = cr; data[1][0] = -sr;
1895 data[0][1] = sr; data[1][1] = cr;
1908 data[0][0] = data[1][1] = data[2][2] = Zero;
1913 data[0][0] = a.x*b.x; data[1][0] = a.x*b.y; data[2][0] = a.x*b.z;
1914 data[0][1] = a.y*b.x; data[1][1] = a.y*b.y; data[2][1] = a.y*b.z;
1915 data[0][2] = a.z*b.x; data[1][2] = a.z*b.y; data[2][2] = a.z*b.z;
1918 inline void Matrix3::get(
Matrix3& m)
const 1923 inline void Matrix3::get(Real m [3][3])
const 1928 m[i][j] = data[i][j];
1931 inline void Matrix3::get(Real m [9])
const 1935 for(j=0; j<3; j++, k++)
1946 inline void Matrix3::getTranspose(
Matrix3& m)
const 1948 m.setTranspose(*
this);
1951 inline void Matrix3::getNegative(
Matrix3& m)
const 1953 m.setNegative(*
this);
1956 inline bool Matrix3::getInverse(
Matrix3& m)
const 1958 return m.setInverse(*
this);
1963 v[0] = Half*(data[1][2]-data[2][1]);
1964 v[1] = Half*(data[2][0]-data[0][2]);
1965 v[2] = Half*(data[0][1]-data[1][0]);
1968 inline void Matrix3::inplaceTranspose()
1972 for(i=0; i<3; i++) {
1973 for(j=0; j<i; j++) {
1975 data[i][j] = data[j][i];
1981 inline void Matrix3::inplaceNegative()
1986 data[i][j] = -data[i][j];
1989 inline void Matrix3::inplaceMul(Real s)
1997 inline void Matrix3::inplaceDiv(Real s)
2005 inline void Matrix3::inplaceRowScale(Real sx, Real sy, Real sz)
2008 for(j=0; j<3; j++) {
2015 inline void Matrix3::inplaceColScale(Real sx, Real sy, Real sz)
2018 for(j=0; j<3; j++) {
2025 inline bool Matrix3::inplaceInverse()
2028 return setInverse(tmp);
2031 inline bool Matrix3::isZero(Real eps)
const 2036 if(!FuzzyZero(data[i][j],eps))
return false;
2040 inline bool Matrix3::isEqual(
const Matrix3& a,Real eps)
const 2049 inline bool Matrix3::isIdentity(Real eps)
const 2058 inline bool Matrix3::isInvertible(Real eps)
const 2063 inline Real Matrix3::trace()
const {
return data[0][0] + data[1][1] + data[2][2]; }
2065 inline Real Matrix3::minElement(
int* _i,
int* _j)
const 2069 for(
int i=0;i<3;i++)
2070 for(
int j=0;j<3;j++)
2071 if(data[i][j] < vmin) {
2081 Real Matrix3::maxElement(
int* _i,
int* _j)
const 2085 for(
int i=0;i<3;i++)
2086 for(
int j=0;j<3;j++)
2087 if(data[i][j] > vmax) {
2097 Real Matrix3::minAbsElement(
int* _i,
int* _j)
const 2101 for(
int i=0;i<3;i++)
2102 for(
int j=0;j<3;j++)
2103 if(Abs(data[i][j]) < vmin) {
2104 vmin=Abs(data[i][j]);
2113 Real Matrix3::maxAbsElement(
int* _i,
int* _j)
const 2117 for(
int i=0;i<3;i++)
2118 for(
int j=0;j<3;j++)
2119 if(Abs(data[i][j]) > vmax) {
2120 vmax=Abs(data[i][j]);
2138 inline void Matrix4::operator += (
const Matrix4& m)
2141 for(i=0; i<4; i++) {
2143 data[i][j] += m.
data[i][j];
2147 inline void Matrix4::operator -= (
const Matrix4& m)
2150 for(i=0; i<4; i++) {
2152 data[i][j] -= m.
data[i][j];
2156 inline void Matrix4::operator *= (
const Matrix4& m)
2162 inline void Matrix4::operator *= (Real s)
2167 inline void Matrix4::operator /= (Real s)
2176 for(i=0; i<4; i++) {
2178 data[i][j] = a.
data[i][j] + b.
data[i][j];
2185 for(i=0; i<4; i++) {
2187 data[i][j] = a.
data[i][j] - b.
data[i][j];
2191 inline void Matrix4::mul(
const Matrix4& a, Real b)
2194 for(i=0; i<4; i++) {
2196 data[i][j] = a.
data[i][j]*b;
2200 inline void Matrix4::div(
const Matrix4& a, Real b)
2203 for(i=0; i<4; i++) {
2205 data[i][j] = a.
data[i][j]/b;
2211 out.x = data[0][0]*a.x + data[1][0]*a.y + data[2][0]*a.z + data[3][0]*a.w;
2212 out.y = data[0][1]*a.x + data[1][1]*a.y + data[2][1]*a.z + data[3][1]*a.w;
2213 out.z = data[0][2]*a.x + data[1][2]*a.y + data[2][2]*a.z + data[3][2]*a.w;
2214 out.w = data[0][3]*a.x + data[1][3]*a.y + data[2][3]*a.z + data[3][3]*a.w;
2217 inline void Matrix4::mulTranspose(
const Vector4& a,
Vector4& out)
const 2219 out.x = data[0][0]*a.x + data[0][1]*a.y + data[0][2]*a.z + data[0][3]*a.w;
2220 out.y = data[1][0]*a.x + data[1][1]*a.y + data[1][2]*a.z + data[1][3]*a.w;
2221 out.z = data[2][0]*a.x + data[2][1]*a.y + data[2][2]*a.z + data[2][3]*a.w;
2222 out.w = data[3][0]*a.x + data[3][1]*a.y + data[3][2]*a.z + data[3][3]*a.w;
2227 out.x = data[0][0]*a.x + data[1][0]*a.y + data[2][0]*a.z + data[3][0];
2228 out.y = data[0][1]*a.x + data[1][1]*a.y + data[2][1]*a.z + data[3][1];
2229 out.z = data[0][2]*a.x + data[1][2]*a.y + data[2][2]*a.z + data[3][2];
2234 out.x = data[0][0]*a.x + data[1][0]*a.y + data[2][0]*a.z;
2235 out.y = data[0][1]*a.x + data[1][1]*a.y + data[2][1]*a.z;
2236 out.z = data[0][2]*a.x + data[1][2]*a.y + data[2][2]*a.z;
2241 out.x = data[0][0]*a.x + data[0][1]*a.y + data[0][2]*a.z;
2242 out.y = data[1][0]*a.x + data[1][1]*a.y + data[1][2]*a.z;
2243 out.z = data[2][0]*a.x + data[2][1]*a.y + data[2][2]*a.z;
2246 inline void Matrix4::set(
const Matrix4& m)
2251 data[i][j] = m.
data[i][j];
2254 inline void Matrix4::set(Real x)
2262 inline void Matrix4::set(
const Real m [4][4])
2267 data[i][j] = m[i][j];
2270 inline void Matrix4::set(
const Real* m)
2278 for(j=0; j<4; j++, k++)
2285 data[0][3] = data[1][3] = data[2][3] = Zero;
2303 data[0][3] = data[1][3] = data[2][3] = Zero;
2308 data[i][j] = m.
data[i][j];
2309 data[3][0] = data[3][1] = data[3][2] = Zero;
2314 data[0][3] = data[1][3] = data[2][3] = Zero;
2319 data[i][j] = m.
data[i][j];
2323 inline void Matrix4::setZero()
2328 inline void Matrix4::setIdentity()
2333 data[i][j] =
Delta(i,j);
2336 inline void Matrix4::setDiagonal(
const Vector4& d)
2339 d.get(data[0][0],data[1][1],data[2][2],data[3][3]);
2342 inline void Matrix4::setTranslate(
const Vector3& trans)
2347 data[i][j] =
Delta(i,j);
2353 inline void Matrix4::setTranspose(
const Matrix4& m)
2358 data[i][j] = m.
data[j][i];
2361 inline void Matrix4::setNegative(
const Matrix4& m)
2366 data[i][j] = -m.
data[i][j];
2372 data[0][0] = a.x*b.x; data[1][0] = a.x*b.y; data[2][0] = a.x*b.z; data[3][0] = a.x*b.z;
2373 data[0][1] = a.y*b.x; data[1][1] = a.y*b.y; data[2][1] = a.y*b.z; data[3][1] = a.y*b.z;
2374 data[0][2] = a.z*b.x; data[1][2] = a.z*b.y; data[2][2] = a.z*b.z; data[3][2] = a.z*b.z;
2375 data[0][3] = a.w*b.x; data[1][3] = a.w*b.y; data[2][3] = a.w*b.z; data[3][3] = a.w*b.w;
2378 inline void Matrix4::get(
Matrix4& m)
const { m.set(*
this); }
2380 inline void Matrix4::get(Real m[4][4])
const 2385 m[i][j] = data[i][j];
2388 inline void Matrix4::get(Real m[16])
const 2392 for(j=0; j<4; j++, k++)
2412 inline void Matrix4::get(
Matrix3& m)
const 2417 m.
data[i][j] = data[i][j];
2425 m.
data[i][j] = data[i][j];
2429 inline void Matrix4::getTranspose(
Matrix4& m)
const { m.setTranspose(*
this); }
2430 inline void Matrix4::getNegative(
Matrix4& m)
const { m.setNegative(*
this); }
2431 inline bool Matrix4::getInverse(
Matrix4& m)
const {
return m.setInverse(*
this); }
2433 inline void Matrix4::inplaceTranspose()
2437 for(i=0; i<4; i++) {
2438 for(j=0; j<i; j++) {
2440 data[i][j] = data[j][i];
2446 inline void Matrix4::inplaceNegative()
2449 for(i=0; i<4; i++) {
2450 for(j=0; j<4; j++) {
2451 data[i][j] = -data[i][j];
2456 inline bool Matrix4::inplaceInverse()
2459 return setInverse(tmp);
2462 inline void Matrix4::inplaceMul(Real s)
2470 inline void Matrix4::inplaceDiv(Real s)
2478 inline bool Matrix4::isZero(Real eps)
const 2483 if(!FuzzyZero(data[i][j],eps))
return false;
2487 inline bool Matrix4::isEqual(
const Matrix4& a,Real eps)
const 2496 inline bool Matrix4::isIdentity(Real eps)
const 2505 inline bool Matrix4::isInvertible(Real eps)
const 2510 inline Real Matrix4::trace()
const {
return data[0][0] + data[1][1] + data[2][2] + data[3][3]; }
2512 inline Real Matrix4::minElement(
int* _i,
int* _j)
const 2516 for(
int i=0;i<4;i++)
2517 for(
int j=0;j<4;j++)
2518 if(data[i][j] < vmin) {
2528 Real Matrix4::maxElement(
int* _i,
int* _j)
const 2532 for(
int i=0;i<4;i++)
2533 for(
int j=0;j<4;j++)
2534 if(data[i][j] > vmax) {
2544 Real Matrix4::minAbsElement(
int* _i,
int* _j)
const 2548 for(
int i=0;i<4;i++)
2549 for(
int j=0;j<4;j++)
2550 if(Abs(data[i][j]) < vmin) {
2551 vmin=Abs(data[i][j]);
2560 Real Matrix4::maxAbsElement(
int* _i,
int* _j)
const 2564 for(
int i=0;i<4;i++)
2565 for(
int j=0;j<4;j++)
2566 if(Abs(data[i][j]) > vmax) {
2567 vmax=Abs(data[i][j]);
2579 inline bool RigidTransform::operator == (
const RigidTransform& a)
const {
return a.R == R && a.t == t; }
2580 inline bool RigidTransform::operator != (
const RigidTransform& a)
const {
return a.R != R || a.t != t; }
2582 inline void RigidTransform::operator *= (
const RigidTransform& x) { t += R*x.t; R *= x.R; }
2583 inline void RigidTransform::operator *= (
const Matrix3& r) { inplaceRotate(r); }
2584 inline void RigidTransform::operator += (
const Vector3& v) { t += v; }
2585 inline void RigidTransform::operator -= (
const Vector3& v) { t -= v; }
2586 inline RigidTransform::operator
Matrix4 ()
const {
Matrix4 tmp; tmp.set(R, t);
return tmp; }
2602 R.mulTransposeA(a.R,b.R);
2610 R.mulTransposeB(a.R,b.R);
2612 t.inplaceNegative();
2621 inline void RigidTransform::mulPoint(
const Vector3& a,
Vector3& out)
const { R.mul(a,out); out += t; }
2622 inline void RigidTransform::mulVector(
const Vector3& a,
Vector3& out)
const { R.mul(a,out); }
2625 inline void RigidTransform::mulPointInverse(
const Vector3& a,
Vector3& out)
const { R.mulTranspose(a-t,out); }
2626 inline void RigidTransform::mulVectorInverse(
const Vector3& a,
Vector3& out)
const { R.mulTranspose(a,out); }
2627 inline void RigidTransform::setIdentity() { R.setIdentity(); t.setZero(); }
2628 inline void RigidTransform::set(
const RigidTransform& x) {
set(x.R, x.t); }
2629 inline void RigidTransform::set(
const Matrix3& m,
const Vector3& v) { R.set(m); t.set(v); }
2630 inline void RigidTransform::set(
const Vector3& x,
const Vector3& y,
const Vector3& z,
const Vector3& trans) { R.set(x,y,z); t.set(trans); }
2631 inline void RigidTransform::set(
const Matrix4& m) { m.get(R,t); }
2634 inline void RigidTransform::setRotation(
const Matrix3& m) { R.set(m); }
2635 inline void RigidTransform::setTranslation(
const Vector3& v) { t.set(v); }
2636 inline void RigidTransform::setInverse(
const RigidTransform& x) { R.setTranspose(x.R); R.mul(x.t,t); t.inplaceNegative(); }
2637 inline void RigidTransform::setRotated(
const RigidTransform& a,
const Matrix3& r) { R.mul(a.R,r); t.set(a.t); }
2638 inline void RigidTransform::setShifted(
const RigidTransform& a,
const Vector3& v) { R.set(a.R); t.add(a.t,v); }
2639 inline void RigidTransform::get(
RigidTransform& x)
const { x.set(*
this); }
2640 inline void RigidTransform::get(
Matrix3& m,
Vector3& v)
const { m.set(R); v.set(t); }
2642 inline void RigidTransform::get(
Matrix4& m)
const { m.set(R,t); }
2643 inline void RigidTransform::getRotation(
Matrix3& m)
const { m.set(R); }
2644 inline void RigidTransform::getTranslation(
Vector3& v)
const { v.set(t); }
2645 inline void RigidTransform::getInverse(
RigidTransform& x) { x.setInverse(*
this); }
2646 inline void RigidTransform::inplaceInverse() { R.inplaceTranspose();
Vector3 tmp; tmp.setNegative(t); R.mul(tmp,t); }
2647 inline void RigidTransform::inplaceRotate(
const Matrix3& m) { R *= m; }
2648 inline void RigidTransform::inplaceShift(
const Vector3& v) { t += v; }
2649 inline bool RigidTransform::isIdentity(Real eps)
const {
return R.isIdentity(eps) && t.isZero(eps); }
2652 inline void RigidTransform2D::operator *= (
const RigidTransform2D& x) { t += R*x.t; R *= x.R; }
2661 a.R.mulTranspose(b.t-a.t, t);
2662 R.mulTransposeA(a.R,b.R);
2666 R.mulTransposeB(a.R,b.R);
2667 R.mulTranspose(b.t, t);
2668 t.inplaceNegative();
2674 inline void RigidTransform2D::mul(
const Vector3& a,
Vector2& out)
const { R.mul(
Vector2(a.x,a.y),out); out.madd(t,a.z); }
2675 inline void RigidTransform2D::mul(
const Vector2& a,
Vector2& out)
const { mulPoint(a,out); }
2676 inline void RigidTransform2D::mulPoint(
const Vector2& a,
Vector2& out)
const { R.mul(a,out); out+=t; }
2677 inline void RigidTransform2D::mulVector(
const Vector2& a,
Vector2& out)
const { R.mul(a,out); }
2678 inline void RigidTransform2D::mulInverse(
const Vector2& a,
Vector2& out)
const { mulPointInverse(a,out); }
2679 inline void RigidTransform2D::mulInverse(
const Vector3& a,
Vector2& out)
const {
Vector2 tmp(a.x,a.y); tmp.madd(t,-a.z); R.mulTranspose(tmp,out); }
2680 inline void RigidTransform2D::mulPointInverse(
const Vector2& a,
Vector2& out)
const { R.mulTranspose(a-t,out); }
2681 inline void RigidTransform2D::mulVectorInverse(
const Vector2& a,
Vector2& out)
const { R.mulTranspose(a,out); }
2682 inline void RigidTransform2D::setIdentity() { R.setIdentity(); t.setZero(); }
2683 inline void RigidTransform2D::set(
const RigidTransform2D& rhs) { R=rhs.R; t=rhs.t; }
2684 inline void RigidTransform2D::set(
const Matrix3& mat) { R.set(
Vector2(mat(0,0),mat(0,1)),
Vector2(mat(1,0),mat(1,1))); t.set(mat(2,0),mat(2,1)); }
2685 inline void RigidTransform2D::set(Real theta,
const Vector2& _t) { R.setRotate(theta); t=_t; }
2686 inline void RigidTransform2D::setInverse(
const RigidTransform2D& x) { R.setTranspose(x.R); R.mul(x.t,t); t.inplaceNegative(); }
2687 inline void RigidTransform2D::get(
RigidTransform2D& rhs)
const { rhs.R=R; rhs.t=t; }
2688 inline void RigidTransform2D::get(
Matrix3& m)
const { m.set(
Vector3(R(0,0),R(1,0),Zero),
Vector3(R(0,1),R(1,1),Zero),
Vector3(t.x,t.y,One)); }
2689 inline void RigidTransform2D::get(Real& theta,
Vector2& _t)
const { theta=Acos(R(0,0));
if(R(1,0)<0) theta=-theta; _t=t; }
2690 inline bool RigidTransform2D::isIdentity(Real eps)
const {
return R.isIdentity(eps) && t.isZero(eps); }
2702 inline void normalize(
Vector2& a)
2704 a.inplaceNormalize();
2722 temp.setNegative(a);
2768 inline void normalize(
Vector3& a)
2770 a.inplaceNormalize();
2783 temp.setProjection(a,b);
2790 temp.setNegative(a);
2851 inline void normalize(
Vector4& a)
2853 a.inplaceNormalize();
2859 temp.setNegative(a);
2900 inline Real determinant(
const Matrix2& m) {
return m.determinant(); }
2901 inline Real trace(
const Matrix2& m) {
return m.trace(); }
2906 temp.setTranspose(m);
2913 if(!temp.
setInverse(m)) { temp.setZero(); temp.inplaceDiv(0.0); }
2965 b.mulTranspose(a,v);
2971 inline Real determinant(
const Matrix3& m) {
return m.determinant(); }
2972 inline Real trace(
const Matrix3& m) {
return m.trace(); }
2977 temp.setTranspose(m);
2984 if(!temp.setInverse(m)) { temp.setZero(); temp.inplaceDiv(0.0); }
3043 inline Real determinant(
const Matrix4& m) {
return m.determinant(); }
3044 inline Real trace(
const Matrix4& m) {
return m.determinant(); }
3049 temp.setTranspose(m);
3056 if(!temp.setInverse(m)) { temp.setZero(); temp.inplaceDiv(0.0); }
3107 b.mulTranspose(a,v);
3192 std::ostream& operator << (std::ostream&,
const Vector2&);
3193 std::istream& operator >> (std::istream&,
Vector2&);
3195 std::ostream& operator << (std::ostream&,
const Vector3&);
3196 std::istream& operator >> (std::istream&,
Vector3&);
3198 std::ostream& operator << (std::ostream&,
const Vector4&);
3199 std::istream& operator >> (std::istream&,
Vector4&);
3201 std::ostream& operator << (std::ostream&,
const Matrix2&);
3202 std::istream& operator >> (std::istream&,
Matrix2&);
3204 std::ostream& operator << (std::ostream&,
const Matrix3&);
3205 std::istream& operator >> (std::istream&,
Matrix3&);
3207 std::ostream& operator << (std::ostream&,
const Matrix4&);
3208 std::istream& operator >> (std::istream&,
Matrix4&);
3210 std::ostream& operator << (std::ostream&,
const RigidTransform&);
Common math typedefs, constants, functions.
A 2x2 matrix class.
Definition: math3d/primitives.h:333
Real length() const
= norm
Definition: math3d/primitives.h:1042
void setRotate(const Matrix3 &)
sets the xform to just rotate
Definition: math3d/primitives.h:2632
void getCrossProduct(Vector3 &) const
if this is a cross-product matrix, returns the vector that performs the cross product ...
Definition: math3d/primitives.h:1961
void compose(const RigidTransform &a, const RigidTransform &b)
this(v) = a(b(v))
Definition: math3d/primitives.h:2587
A 3D vector class.
Definition: math3d/primitives.h:136
void setRotateZ(Real rads)
sets the matrix that rotates ccw by rads around the x axis
Definition: math3d/primitives.h:1889
void getOrthogonalBasis(Vector3 &yb, Vector3 &zb) const
calculates two unit vectors orthogonal to this vector (and positively oriented)
Definition: math3d/primitives.h:1097
Real length() const
= norm
Definition: math3d/primitives.h:993
void mulVectorTranspose(const Vector2 &a, Vector2 &out) const
Definition: math3d/primitives.h:1773
void setOuterProduct(const Vector3 &a, const Vector3 &b)
this = a*b^t
Definition: math3d/primitives.h:1911
double PseudoInv(double x, double eps=dZero)
Returns 1/x if x is nonzero, otherwise 0.
Definition: math.h:226
void setRotateY(Real rads)
sets the matrix that rotates ccw by rads around the x axis
Definition: math3d/primitives.h:1880
void setTranslate(const Vector3 &)
sets the xform to just translate
Definition: math3d/primitives.h:2633
Real Delta(T i, T j)
Kronecker delta.
Definition: math.h:233
Utilities commonly used throughout a program.
A 4D vector class.
Definition: math3d/primitives.h:228
bool setInverse(const Matrix2 &)
returns true when successful
Definition: math3d/primitives.h:1426
void getOrthogonal(Vector2 &) const
calculates an orthogonal vector
Definition: math3d/primitives.h:1013
A 4x4 matrix class.
Definition: math3d/primitives.h:626
void setRotateX(Real rads)
sets the matrix that rotates ccw by rads around the x axis
Definition: math3d/primitives.h:1871
void setProjection(const Vector2 &, const Vector2 &)
sets this to the projection of a on b
Definition: math3d/primitives.h:1003
void mul(const RigidTransform &a, const RigidTransform &b)
mul = compose
Definition: math3d/primitives.h:2615
void composeInverseB(const RigidTransform &a, const RigidTransform &b)
Definition: math3d/primitives.h:2604
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:13
void setOuterProduct(const Vector4 &a, const Vector4 &b)
this = a*b^t
Definition: math3d/primitives.h:2370
void mulVector(const Vector3 &a, Vector3 &out) const
assumes w = 0
Definition: math3d/primitives.h:2232
void setPerpendicular(const Vector2 &)
sets this to the vector rotated 90 degrees ccw
Definition: math3d/primitives.h:1000
void setCrossProduct(const Vector3 &)
sets the matrix that performs the vector cross product
Definition: math3d/primitives.h:1898
void composeInverseA(const RigidTransform &a, const RigidTransform &b)
this(v) = a^-1(b(v))
Definition: math3d/primitives.h:2595
Real data[3][3]
column major format
Definition: math3d/primitives.h:607
void setRotation(Real rads)
sets x=cos(rads), y=sin(rads)
Definition: math3d/primitives.h:999
A 3x3 matrix class.
Definition: math3d/primitives.h:469
double Inv(double x)
1/x
Definition: math.h:205
void setRotate(Real rads)
sets the matrix that rotates ccw by rads
Definition: math3d/primitives.h:1452
void mulPoint(const Vector3 &a, Vector3 &out) const
assumes w = 1
Definition: math3d/primitives.h:2225
Vector3 getXBasis() const
the following are for 4x4 homogeneous transforms
Definition: math3d/primitives.h:786
void mulVector(const Vector2 &a, Vector2 &out) const
assumes w = 0
Definition: math3d/primitives.h:1767
Real data[2][2]
column major format
Definition: math3d/primitives.h:449
void mulVectorTranspose(const Vector3 &a, Vector3 &out) const
Definition: math3d/primitives.h:2239
void mulTranspose(const Vector3 &a, Vector3 &out) const
Definition: math3d/primitives.h:1754
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
Real cross(const Vector2 &a) const
2d cross product
Definition: math3d/primitives.h:972
A 2D vector class.
Definition: math3d/primitives.h:41
void mulPoint(const Vector2 &a, Vector2 &out) const
assumes w = 1
Definition: math3d/primitives.h:1761
bool FuzzyEquals(double a, double b, double eps=dEpsilon)
Returns true if a and b are within +/- eps.
Definition: math.h:222
void setOuterProduct(const Vector2 &a, const Vector2 &b)
this = a*b^t
Definition: math3d/primitives.h:1461
void mulInverse(const Vector3 &a, Vector3 &out) const
= mulPointInverse
Definition: math3d/primitives.h:2623
A cross-platform class for reading/writing binary data.
Definition: File.h:47
void setVector(const Vector3 &)
sets w = 0
Definition: math3d/primitives.h:1207
void setHomogeneous(const Vector3 &)
sets w = 1
Definition: math3d/primitives.h:1208
Real data[4][4]
column major format
Definition: math3d/primitives.h:792