1 package edu.berkeley.qfat.geom;
3 /** affine matrix; immutable */
6 public static final Matrix ZERO = new Matrix(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
14 public final float a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p;
15 public Matrix() { this(1); }
16 public Matrix(float scale) {
18 l = h = d = e = b = i = c = j = g = 0;
22 public Matrix(float scalex, float scaley, float scalez) {
26 l = h = d = e = b = i = c = j = g = 0;
30 public Matrix(Vec translate) {
31 d = translate.x; h = translate.y; l = translate.z;
33 b = c = e = g = i = j = 0;
37 public Matrix(float a, float b, float c, float d, float e, float f, float g,
38 float h, float i, float j, float k, float l, float m, float n, float o, float p) {
39 this.a = a; this.b = b; this.c = c; this.d = d; this.e = e; this.f = f; this.g = g; this.h = h; this.i = i;
40 this.j = j; this.k = k; this.l = l; this.m = m; this.n = n; this.o = o; this.p = p;
42 public Matrix plus(Matrix x) {
43 return new Matrix(a+x.a, b+x.b, c+x.c, d+x.d, e+x.e, f+x.f, g+x.g, h+x.h, i+x.i, j+x.j, k+x.k, l+x.l, m+x.m, n+x.n, o+x.o, p+x.p);
45 public Matrix minus(Matrix x) {
46 return new Matrix(a-x.a, b-x.b, c-x.c, d-x.d, e-x.e, f-x.f, g-x.g, h-x.h, i-x.i, j-x.j, k-x.k, l-x.l, m-x.m, n-x.n, o-x.o, p-x.p);
48 public Matrix times(float x) {
49 return new Matrix(a*x, b*x, c*x, d*x, e*x, f*x, g*x, h*x, i*x, j*x, k*x, l*x, m*x, n*x, o*x, p*x);
52 /** computes (v^T)(this)(v) */
53 public float preAndPostMultiply(Point point) {
55 ((a*point.x + b*point.y + c*point.z + d) * point.x) +
56 ((e*point.x + f*point.y + g*point.z + h) * point.y) +
57 ((i*point.x + j*point.y + k*point.z + l) * point.z) +
58 ((m*point.x + n*point.y + o*point.z + p) * 1);
62 public Matrix(Vec axis, float angle) {
63 double q = Math.cos(angle);
64 double s = Math.sin(angle);
66 a = (float)(q + axis.x*axis.x*t);
67 f = (float)(q + axis.y*axis.y*t);
68 k = (float)(q + axis.z*axis.z*t);
69 double tmp1 = axis.x*axis.y*t;
70 double tmp2 = axis.z*s;
71 e = (float)(tmp1 + tmp2);
72 b = (float)(tmp1 - tmp2);
73 tmp1 = axis.x*axis.z*t;
75 i = (float)(tmp1 - tmp2);
76 c = (float)(tmp1 + tmp2);
77 tmp1 = axis.y*axis.z*t;
79 j = (float)(tmp1 + tmp2);
80 g = (float)(tmp1 - tmp2);
85 public Point times(Point p) {
86 // discards bottom row
87 return new Point(a*p.x + b*p.y + c*p.z + d,
88 e*p.x + f*p.y + g*p.z + h,
89 i*p.x + j*p.y + k*p.z + l);
91 public Vec times(Vec p) {
92 // discards bottom row
93 return new Vec(a*p.x + b*p.y + c*p.z + d,
94 e*p.x + f*p.y + g*p.z + h,
95 i*p.x + j*p.y + k*p.z + l);
97 public Point apply(Point p) { return p; }
98 public Vec apply(Vec v) { return v; }
99 public Matrix invert() { return this; }
100 public Matrix times(Matrix m) { return this; }
103 public float determinant() {
121 m03 * m12 * m21 * m30-m02 * m13 * m21 * m30-m03 * m11 * m22 * m30+m01 * m13 * m22 * m30+
122 m02 * m11 * m23 * m30-m01 * m12 * m23 * m30-m03 * m12 * m20 * m31+m02 * m13 * m20 * m31+
123 m03 * m10 * m22 * m31-m00 * m13 * m22 * m31-m02 * m10 * m23 * m31+m00 * m12 * m23 * m31+
124 m03 * m11 * m20 * m32-m01 * m13 * m20 * m32-m03 * m10 * m21 * m32+m00 * m13 * m21 * m32+
125 m01 * m10 * m23 * m32-m00 * m11 * m23 * m32-m02 * m11 * m20 * m33+m01 * m12 * m20 * m33+
126 m02 * m10 * m21 * m33-m00 * m12 * m21 * m33-m01 * m10 * m22 * m33+m00 * m11 * m22 * m33;
129 public Matrix inverse() {
147 new Matrix(m12*m23*m31 - m13*m22*m31 + m13*m21*m32 - m11*m23*m32 - m12*m21*m33 + m11*m22*m33,
148 m03*m22*m31 - m02*m23*m31 - m03*m21*m32 + m01*m23*m32 + m02*m21*m33 - m01*m22*m33,
149 m02*m13*m31 - m03*m12*m31 + m03*m11*m32 - m01*m13*m32 - m02*m11*m33 + m01*m12*m33,
150 m03*m12*m21 - m02*m13*m21 - m03*m11*m22 + m01*m13*m22 + m02*m11*m23 - m01*m12*m23,
151 m13*m22*m30 - m12*m23*m30 - m13*m20*m32 + m10*m23*m32 + m12*m20*m33 - m10*m22*m33,
152 m02*m23*m30 - m03*m22*m30 + m03*m20*m32 - m00*m23*m32 - m02*m20*m33 + m00*m22*m33,
153 m03*m12*m30 - m02*m13*m30 - m03*m10*m32 + m00*m13*m32 + m02*m10*m33 - m00*m12*m33,
154 m02*m13*m20 - m03*m12*m20 + m03*m10*m22 - m00*m13*m22 - m02*m10*m23 + m00*m12*m23,
155 m11*m23*m30 - m13*m21*m30 + m13*m20*m31 - m10*m23*m31 - m11*m20*m33 + m10*m21*m33,
156 m03*m21*m30 - m01*m23*m30 - m03*m20*m31 + m00*m23*m31 + m01*m20*m33 - m00*m21*m33,
157 m01*m13*m30 - m03*m11*m30 + m03*m10*m31 - m00*m13*m31 - m01*m10*m33 + m00*m11*m33,
158 m03*m11*m20 - m01*m13*m20 - m03*m10*m21 + m00*m13*m21 + m01*m10*m23 - m00*m11*m23,
159 m12*m21*m30 - m11*m22*m30 - m12*m20*m31 + m10*m22*m31 + m11*m20*m32 - m10*m21*m32,
160 m01*m22*m30 - m02*m21*m30 + m02*m20*m31 - m00*m22*m31 - m01*m20*m32 + m00*m21*m32,
161 m02*m11*m30 - m01*m12*m30 - m02*m10*m31 + m00*m12*m31 + m01*m10*m32 - m00*m11*m32,
162 m01*m12*m20 - m02*m11*m20 + m02*m10*m21 - m00*m12*m21 - m01*m10*m22 + m00*m11*m22)
163 .times(1/determinant());