/** * Copyright (c) 2009, iPlant Collaborative, Texas Advanced Computing Center * This software is licensed under the CC-GNU GPL version 2.0 or later. * License: http://creativecommons.org/licenses/GPL/2.0/ */ package org.iplantc.phyloviewer.shared.math; import java.util.Arrays; public class Matrix33 { private double[][] m=new double[3][3]; public Matrix33() { this.set(1, 0, 0, 0, 1, 0, 0, 0, 1); } public Matrix33(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22) { this.set(m00,m01,m02, m10,m11,m12, m20,m21,m22); } public static Matrix33 makeTranslate(double x, double y) { return new Matrix33(1,0,x, 0,1,y, 0,0,1); } public static Matrix33 makeScale(double sx, double sy ) { return new Matrix33(sx,0,0, 0,sy,0, 0,0,1); } public void set(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21, double m22 ) { m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; } public Vector2 transform(Vector2 vector) { double x = m[0][0] * vector.getX() + m[0][1] * vector.getY() + m[0][2]; double y = m[1][0] * vector.getX() + m[1][1] * vector.getY() + m[1][2]; return new Vector2 ( x, y ); } public Box2D transform(Box2D box) { Vector2 min = transform(box.getMin()); Vector2 max = transform(box.getMax()); return new Box2D(min, max); } public Matrix33 multiply(Matrix33 rhs) { double m00 = this.m[0][0] * rhs.m[0][0] + this.m[0][1] * rhs.m[1][0] + this.m[0][2] * rhs.m[2][0]; double m01 = this.m[0][0] * rhs.m[0][1] + this.m[0][1] * rhs.m[1][1] + this.m[0][2] * rhs.m[2][1]; double m02 = this.m[0][0] * rhs.m[0][2] + this.m[0][1] * rhs.m[1][2] + this.m[0][2] * rhs.m[2][2]; double m10 = this.m[1][0] * rhs.m[1][0] + this.m[1][1] * rhs.m[1][0] + this.m[1][2] * rhs.m[2][0]; double m11 = this.m[1][0] * rhs.m[0][1] + this.m[1][1] * rhs.m[1][1] + this.m[1][2] * rhs.m[2][1]; double m12 = this.m[1][0] * rhs.m[0][2] + this.m[1][1] * rhs.m[1][2] + this.m[1][2] * rhs.m[2][2]; double m20 = this.m[2][0] * rhs.m[1][0] + this.m[2][1] * rhs.m[1][0] + this.m[2][2] * rhs.m[2][0]; double m21 = this.m[2][0] * rhs.m[0][1] + this.m[2][1] * rhs.m[1][1] + this.m[2][2] * rhs.m[2][1]; double m22 = this.m[2][0] * rhs.m[0][2] + this.m[2][1] * rhs.m[1][2] + this.m[2][2] * rhs.m[2][2]; return new Matrix33(m00,m01,m02,m10,m11,m12,m20,m21,m22); } public double determinant() { // Make three column vectors Vector3 v0 = new Vector3(m[0][0], m[1][0], m[2][0]); Vector3 v1 = new Vector3(m[0][1], m[1][1], m[2][1]); Vector3 v2 = new Vector3(m[0][2], m[1][2], m[2][2]); Vector3 t = v1.cross(v2); return v0.dot(t); } public Matrix33 inverse() { double det = this.determinant(); if ( det == 0.0 ) throw new RuntimeException("This matrix is not invertable"); // Make three column vectors Vector3 v0 = new Vector3(m[0][0], m[1][0], m[2][0]); Vector3 v1 = new Vector3(m[0][1], m[1][1], m[2][1]); Vector3 v2 = new Vector3(m[0][2], m[1][2], m[2][2]); // These are row vectors. Vector3 t0 = v1.cross(v2); Vector3 t1 = v2.cross(v0); Vector3 t2 = v0.cross(v1); double oneOverDet = 1.0 / det; return new Matrix33 ( oneOverDet * t0.getX(), oneOverDet * t0.getY(), oneOverDet * t0.getZ(), oneOverDet * t1.getX(), oneOverDet * t1.getY(), oneOverDet * t1.getZ(), oneOverDet * t2.getX(), oneOverDet * t2.getY(), oneOverDet * t2.getZ()); } public void set(int row, int col,double value) { m[row][col] = value; } public double get(int row, int col) { return m[row][col]; } public void setTranslationX(double value) { m[0][2]=value; } public void setTranslationY(double value) { m[1][2]=value; } public double getTranslationX() { return m[0][2]; } public double getTranslationY() { return m[1][2]; } public double getScaleX() { return m[0][0]; } public double getScaleY() { return m[1][1]; } public double getShearX() { return m[0][1]; } public double getShearY() { return m[1][0]; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); sb.append(Arrays.toString(m[0])); sb.append("\n"); sb.append(Arrays.toString(m[1])); sb.append("\n"); sb.append(Arrays.toString(m[2])); sb.append("]"); return sb.toString(); } }