[Bprocessor-commit] model/src/net/sourceforge/bprocessor/model Matrix.java, 1.1, 1.2
Status: Pre-Alpha
Brought to you by:
henryml
From: rimestad <rim...@us...> - 2007-11-26 18:09:06
|
Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv24444/src/net/sourceforge/bprocessor/model Modified Files: Matrix.java Log Message: added invert on matrix and made a small but for now useless test of it Index: Matrix.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Matrix.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Matrix.java 24 Nov 2005 10:30:45 -0000 1.1 --- Matrix.java 26 Nov 2007 18:09:08 -0000 1.2 *************** *** 66,69 **** --- 66,81 ---- /** + * Add a translation to the matrix + * @param x dx + * @param y dy + * @param z dz + */ + public void translate(double x, double y, double z) { + set(3, 0, get(3, 0) + x); + set(3, 1, get(3, 1) + y); + set(3, 2, get(3, 2) + z); + } + + /** * Construct a matrix with specified values * @param values The values in column-major order *************** *** 106,108 **** --- 118,272 ---- return result; } + + /** + * Multiply a vertex with a matrix either as a vertex or vector + * @param v the vertex to multiply with this matrix + * @param asVertex Add the translation as well + * @return the result + */ + public Vertex multiply(Vertex v, boolean asVertex) { + double fourth = asVertex ? 1 : 0; + double res[] = multiply(new double[]{v.getX(), v.getY(), v.getZ(), fourth}); + return new Vertex(res[0], res[1], res[2]); + } + + /** + * Invert a 4x4 matrix by for each indice finding the determinant of the other rows and collums + * @see http://mathworld.wolfram.com/MatrixInverse.html + * @return the inverse of the matrix + */ + public Matrix invert() { + Matrix inverted = new Matrix(); + inverted.set(0, 0, get(1, 2) * get(2, 3) * get(3, 1) - get(1, 3) * get(2, 2) * get(3, 1) + + get(1, 3) * get(2, 1) * get(3, 2) - get(1, 1) * get(2, 3) * get(3, 2) - + get(1, 2) * get(2, 1) * get(3, 3) + get(1, 1) * get(2, 2) * get(3, 3)); + inverted.set(0, 1, get(0, 3) * get(2, 2) * get(3, 1) - get(0, 2) * get(2, 3) * get(3, 1) - + get(0, 3) * get(2, 1) * get(3, 2) + get(0, 1) * get(2, 3) * get(3, 2) + + get(0, 2) * get(2, 1) * get(3, 3) - get(0, 1) * get(2, 2) * get(3, 3)); + inverted.set(0, 2, get(0, 2) * get(1, 3) * get(3, 1) - get(0, 3) * get(1, 2) * get(3, 1) + + get(0, 3) * get(1, 1) * get(3, 2) - get(0, 1) * get(1, 3) * get(3, 2) - + get(0, 2) * get(1, 1) * get(3, 3) + get(0, 1) * get(1, 2) * get(3, 3)); + inverted.set(0, 3, get(0, 3) * get(1, 2) * get(2, 1) - get(0, 2) * get(1, 3) * get(2, 1) - + get(0, 3) * get(1, 1) * get(2, 2) + get(0, 1) * get(1, 3) * get(2, 2) + + get(0, 2) * get(1, 1) * get(2, 3) - get(0, 1) * get(1, 2) * get(2, 3)); + inverted.set(1, 0, get(1, 3) * get(2, 2) * get(3, 0) - get(1, 2) * get(2, 3) * get(3, 0) - + get(1, 3) * get(2, 0) * get(3, 2) + get(1, 0) * get(2, 3) * get(3, 2) + + get(1, 2) * get(2, 0) * get(3, 3) - get(1, 0) * get(2, 2) * get(3, 3)); + inverted.set(1, 1, get(0, 2) * get(2, 3) * get(3, 0) - get(0, 3) * get(2, 2) * get(3, 0) + + get(0, 3) * get(2, 0) * get(3, 2) - get(0, 0) * get(2, 3) * get(3, 2) - + get(0, 2) * get(2, 0) * get(3, 3) + get(0, 0) * get(2, 2) * get(3, 3)); + inverted.set(1, 2, get(0, 3) * get(1, 2) * get(3, 0) - get(0, 2) * get(1, 3) * get(3, 0) - + get(0, 3) * get(1, 0) * get(3, 2) + get(0, 0) * get(1, 3) * get(3, 2) + + get(0, 2) * get(1, 0) * get(3, 3) - get(0, 0) * get(1, 2) * get(3, 3)); + inverted.set(1, 3, get(0, 2) * get(1, 3) * get(2, 0) - get(0, 3) * get(1, 2) * get(2, 0) + + get(0, 3) * get(1, 0) * get(2, 2) - get(0, 0) * get(1, 3) * get(2, 2) - + get(0, 2) * get(1, 0) * get(2, 3) + get(0, 0) * get(1, 2) * get(2, 3)); + inverted.set(2, 0, get(1, 1) * get(2, 3) * get(3, 0) - get(1, 3) * get(2, 1) * get(3, 0) + + get(1, 3) * get(2, 0) * get(3, 1) - get(1, 0) * get(2, 3) * get(3, 1) - + get(1, 1) * get(2, 0) * get(3, 3) + get(1, 0) * get(2, 1) * get(3, 3)); + inverted.set(2, 1, get(0, 3) * get(2, 1) * get(3, 0) - get(0, 1) * get(2, 3) * get(3, 0) - + get(0, 3) * get(2, 0) * get(3, 1) + get(0, 0) * get(2, 3) * get(3, 1) + + get(0, 1) * get(2, 0) * get(3, 3) - get(0, 0) * get(2, 1) * get(3, 3)); + inverted.set(2, 2, get(0, 1) * get(1, 3) * get(3, 0) - get(0, 3) * get(1, 1) * get(3, 0) + + get(0, 3) * get(1, 0) * get(3, 1) - get(0, 0) * get(1, 3) * get(3, 1) - + get(0, 1) * get(1, 0) * get(3, 3) + get(0, 0) * get(1, 1) * get(3, 3)); + inverted.set(2, 3, get(0, 3) * get(1, 1) * get(2, 0) - get(0, 1) * get(1, 3) * get(2, 0) - + get(0, 3) * get(1, 0) * get(2, 1) + get(0, 0) * get(1, 3) * get(2, 1) + + get(0, 1) * get(1, 0) * get(2, 3) - get(0, 0) * get(1, 1) * get(2, 3)); + inverted.set(3, 0, get(1, 2) * get(2, 1) * get(3, 0) - get(1, 1) * get(2, 2) * get(3, 0) - + get(1, 2) * get(2, 0) * get(3, 1) + get(1, 0) * get(2, 2) * get(3, 1) + + get(1, 1) * get(2, 0) * get(3, 2) - get(1, 0) * get(2, 1) * get(3, 2)); + inverted.set(3, 1, get(0, 1) * get(2, 2) * get(3, 0) - get(0, 2) * get(2, 1) * get(3, 0) + + get(0, 2) * get(2, 0) * get(3, 1) - get(0, 0) * get(2, 2) * get(3, 1) - + get(0, 1) * get(2, 0) * get(3, 2) + get(0, 0) * get(2, 1) * get(3, 2)); + inverted.set(3, 2, get(0, 2) * get(1, 1) * get(3, 0) - get(0, 1) * get(1, 2) * get(3, 0) - + get(0, 2) * get(1, 0) * get(3, 1) + get(0, 0) * get(1, 2) * get(3, 1) + + get(0, 1) * get(1, 0) * get(3, 2) - get(0, 0) * get(1, 1) * get(3, 2)); + inverted.set(3, 3, get(0, 1) * get(1, 2) * get(2, 0) - get(0, 2) * get(1, 1) * get(2, 0) + + get(0, 2) * get(1, 0) * get(2, 1) - get(0, 0) * get(1, 2) * get(2, 1) - + get(0, 1) * get(1, 0) * get(2, 2) + get(0, 0) * get(1, 1) * get(2, 2)); + inverted.scale(1 / this.determinant()); + return inverted; + } + + /** + * Calculate the determinant + * @return the determinant + */ + public double determinant() { + double value; + value = + get(0, 3) * get(1, 2) * get(2, 1) * get(3, 0) - + get(0, 2) * get(1, 3) * get(2, 1) * get(3, 0) - + get(0, 3) * get(1, 1) * get(2, 2) * get(3, 0) + + get(0, 1) * get(1, 3) * get(2, 2) * get(3, 0) + + get(0, 2) * get(1, 1) * get(2, 3) * get(3, 0) - + get(0, 1) * get(1, 2) * get(2, 3) * get(3, 0) - + get(0, 3) * get(1, 2) * get(2, 0) * get(3, 1) + + get(0, 2) * get(1, 3) * get(2, 0) * get(3, 1) + + get(0, 3) * get(1, 0) * get(2, 2) * get(3, 1) - + get(0, 0) * get(1, 3) * get(2, 2) * get(3, 1) - + get(0, 2) * get(1, 0) * get(2, 3) * get(3, 1) + + get(0, 0) * get(1, 2) * get(2, 3) * get(3, 1) + + get(0, 3) * get(1, 1) * get(2, 0) * get(3, 2) - + get(0, 1) * get(1, 3) * get(2, 0) * get(3, 2) - + get(0, 3) * get(1, 0) * get(2, 1) * get(3, 2) + + get(0, 0) * get(1, 3) * get(2, 1) * get(3, 2) + + get(0, 1) * get(1, 0) * get(2, 3) * get(3, 2) - + get(0, 0) * get(1, 1) * get(2, 3) * get(3, 2) - + get(0, 2) * get(1, 1) * get(2, 0) * get(3, 3) + + get(0, 1) * get(1, 2) * get(2, 0) * get(3, 3) + + get(0, 2) * get(1, 0) * get(2, 1) * get(3, 3) - + get(0, 0) * get(1, 2) * get(2, 1) * get(3, 3) - + get(0, 1) * get(1, 0) * get(2, 2) * get(3, 3) + + get(0, 0) * get(1, 1) * get(2, 2) * get(3, 3); + return value; + } + + /** + * Scale all indices in the matrix by the given value + * @param value the value to scale with + */ + public void scale(double value) { + for (int i = 0; i < this.storage.length; i++) { + if (this.storage[i] != 0) { + this.storage[i] *= value; + } + } + } + + private final double get(int i, int j) { + return this.storage[4 * i + j]; + } + + private final void set(int i, int j, double val) { + this.storage[4 * i + j] = val; + } + + /** + * Equal if all values in the matrix are the same + * @return true if this and obj are the equal + * @param obj The object to compare with + */ + @Override + public boolean equals(Object obj) { + if (obj instanceof Matrix) { + boolean equal = true; + Matrix other = (Matrix)obj; + for (int i = 0; i < this.storage.length; i++) { + equal &= this.storage[i] == other.storage[i]; + } + return equal; + } + + return super.equals(obj); + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return this.toString().hashCode(); + } } |