X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FMatrix.java;h=e52b8954ca2fdd5f53b509ea9477d826f50dae49;hp=31fe6e0ef849ab0037a99f3c084085542de6a590;hb=0e80eb500d944f8ad1f3a9e2d296d9a4cbcd7e25;hpb=2d6bccf0ca59bca01f2a9942e90c7ddb9399ed44 diff --git a/src/edu/berkeley/qfat/geom/Matrix.java b/src/edu/berkeley/qfat/geom/Matrix.java index 31fe6e0..e52b895 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; @@ -110,9 +119,11 @@ public class Matrix { /** 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 */ @@ -301,4 +312,52 @@ public class Matrix { Float.floatToIntBits(o) ^ Float.floatToIntBits(p); } + + public static Matrix getProjectionMatrix(GL gl) { + int view[] = new int[4]; + double mvmatrix[] = new double[16]; + double projmatrix[] = new double[16]; + gl.glGetIntegerv(GL.GL_VIEWPORT, view, 0); + gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0); + gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0); + Matrix m = new Matrix(mvmatrix[0], + mvmatrix[4], + mvmatrix[8], + mvmatrix[12], + mvmatrix[1], + mvmatrix[5], + mvmatrix[9], + mvmatrix[13], + mvmatrix[2], + mvmatrix[6], + mvmatrix[10], + mvmatrix[14], + mvmatrix[3], + mvmatrix[7], + mvmatrix[11], + mvmatrix[15]); + Matrix p = new Matrix(projmatrix[0], + projmatrix[4], + projmatrix[8], + projmatrix[12], + projmatrix[1], + projmatrix[5], + projmatrix[9], + projmatrix[13], + projmatrix[2], + projmatrix[6], + projmatrix[10], + projmatrix[14], + projmatrix[3], + projmatrix[7], + projmatrix[11], + projmatrix[15]); + Matrix z = + new Matrix(0.5*view[2], 0, 0, view[0]+view[2]*0.5, + 0, 0.5*view[3], 0, view[1]+view[3]*0.5, + 0, 0, 0.5, 0.5, + 0, 0, 0, 1); + return z.times(p).times(m); + } + }