checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Matrix.java
diff --git a/src/edu/berkeley/qfat/geom/Matrix.java b/src/edu/berkeley/qfat/geom/Matrix.java
new file mode 100644 (file)
index 0000000..751dfa1
--- /dev/null
@@ -0,0 +1,65 @@
+package edu.berkeley.qfat.geom;
+
+/** affine matrix; immutable */
+public class Matrix {
+    //
+    //  [ a b c d ]   [ x ]
+    //  [ e f g h ]   [ y ]
+    //  [ i j k l ]   [ z ]
+    //  [ 0 0 0 1 ]   [ 1 ]
+    //
+    public final float a, b, c, d, e, f, g, h, i, j, k, l;
+    public Matrix() { this(1); }
+    public Matrix(float scale) {
+        a = f = k = scale;
+        l = h = d = e = b = i = c = j = g = 0;            
+    }
+    public Matrix(float scalex, float scaley, float scalez) {
+        a = scalex;
+        f = scaley;
+        k = scalez;
+        l = h = d = e = b = i = c = j = g = 0;            
+    }
+    public Matrix(Vec translate) {
+        d = translate.x; h = translate.y; l = translate.z;
+        a = f = k = 1;
+        b = c = e = g = i = j = 0;
+    }
+    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) {
+        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;
+        this.j = j; this.k = k; this.l = l;
+    }
+    public Matrix times(float x) {
+        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);
+    }
+    public Matrix(Vec axis, float angle) {
+        double q = Math.cos(angle);
+        double s = Math.sin(angle);
+        double t = 1.0 - q;
+        a = (float)(q + axis.x*axis.x*t);
+        f = (float)(q + axis.y*axis.y*t);
+        k = (float)(q + axis.z*axis.z*t);
+        double tmp1 = axis.x*axis.y*t;
+        double tmp2 = axis.z*s;
+        e = (float)(tmp1 + tmp2);
+        b = (float)(tmp1 - tmp2);
+        tmp1 = axis.x*axis.z*t;
+        tmp2 = axis.y*s;
+        i = (float)(tmp1 - tmp2);
+        c = (float)(tmp1 + tmp2);
+        tmp1 = axis.y*axis.z*t;
+        tmp2 = axis.x*s;
+        j = (float)(tmp1 + tmp2);
+        g = (float)(tmp1 - tmp2);
+        d = h = l = 0;
+    }
+    public Point times(Point p) {
+        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);
+    }
+    public Point apply(Point p) { return p; }
+    public Vec apply(Vec v) { return v; }
+    public Matrix invert() { return this; }
+    public Matrix times(Matrix m) { return this; }
+}