X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FMatrix.java;h=37137617786853e7b1eb8d66b490bd8ede5d0086;hp=31fe6e0ef849ab0037a99f3c084085542de6a590;hb=64c6939d78acfa06e7bc380cb713e3800bf16be5;hpb=42acb5af8ff15b7af9fa8f34c071ee58e24faf98 diff --git a/src/edu/berkeley/qfat/geom/Matrix.java b/src/edu/berkeley/qfat/geom/Matrix.java index 31fe6e0..3713761 100644 --- a/src/edu/berkeley/qfat/geom/Matrix.java +++ b/src/edu/berkeley/qfat/geom/Matrix.java @@ -1,4 +1,5 @@ package edu.berkeley.qfat.geom; +import javax.media.opengl.*; // FEATURE: precompute/cache determinant? @@ -24,6 +25,14 @@ public class Matrix { /** the identity matrix */ public static final Matrix NEGATIVE_ONE = new Matrix(-1,0,0,0,0,-1,0,0,0,0,-1,0,0,0,0,1); + public Matrix(double a, double b, double c, double d, double e, double f, double g, + double h, double i, double j, double k, double l, double m, double n, double o, double p) { + this((float)a, (float)b, (float)c, (float)d, + (float)e, (float)f, (float)g, (float)h, + (float)i, (float)j, (float)k, (float)l, + (float)m, (float)n, (float)o, (float)p); + } + public Matrix(float a, float b, float c, float d, float e, float f, float g, float h, float i, float j, float k, float l, float m, float n, float o, float p) { 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; @@ -71,6 +80,7 @@ public class Matrix { 0, 0, 0, 1); } + /** a reflection matrix across the plane passing through the origin with the specified normal */ public static Matrix reflect(Vec v) { Vec reflectionPlaneNormal = v.norm(); float a = reflectionPlaneNormal.x; @@ -83,9 +93,8 @@ public class Matrix { 0, 0, 0, 1); } - public Vec getTranslationalComponent() { - return new Vec(d, h, l); - } + /** returns the translational component of this matrix */ + public Vec getTranslationalComponent() { return this.times(Point.ZERO).minus(Point.ZERO); } public Matrix plus(Matrix x) { 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); @@ -107,27 +116,16 @@ public class Matrix { return ret; } - /** discards bottom row */ public Point times(Point p) { - // discards bottom row - return new Point(a*p.x + b*p.y + c*p.z + d, - e*p.x + f*p.y + g*p.z + h, - i*p.x + j*p.y + k*p.z + l); + double x = a*p.x + b*p.y + c*p.z + d; + double y = e*p.x + f*p.y + g*p.z + h; + double z = i*p.x + j*p.y + k*p.z + l; + double q = m*p.x + n*p.y + o*p.z + this.p; + return new Point(x/q, y/q, z/q); } - /** discards bottom row */ public Vec times(Vec p) { - return new Vec(a*p.x + b*p.y + c*p.z + d, - e*p.x + f*p.y + g*p.z + h, - i*p.x + j*p.y + k*p.z + l); - } - - public Matrix preMultiplyTranslationalComponentBy(Matrix mm) { - Vec v = mm.times(getTranslationalComponent()); - return new Matrix(a, b, c, v.x, - e, f, g, v.y, - i, j, k, v.z, - m, n, o, 1); + return this.times(Matrix.translate(p)).getTranslationalComponent(); } /** multiply by another matrix */ @@ -262,25 +260,43 @@ public class Matrix { if (!(oo instanceof Matrix)) return false; Matrix z = (Matrix)oo; return - near(a,z.a) && - near(b,z.b) && - near(c,z.c) && - near(d,z.d) && - near(e,z.e) && - near(f,z.f) && - near(g,z.g) && - near(h,z.h) && - near(i,z.i) && - near(j,z.j) && - near(k,z.k) && - near(l,z.l) && - near(m,z.m) && - near(n,z.n) && - near(o,z.o) && - near(p,z.p); + (a==z.a) && + (b==z.b) && + (c==z.c) && + (d==z.d) && + (e==z.e) && + (f==z.f) && + (g==z.g) && + (h==z.h) && + (i==z.i) && + (j==z.j) && + (k==z.k) && + (l==z.l) && + (m==z.m) && + (n==z.n) && + (o==z.o) && + (p==z.p); + } + + public boolean equalsModuloEpsilon(Matrix z, float epsilon) { + return + Math.abs(a-z.a)