Guest User

Matrix

a guest
Jul 4th, 2015
476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.20 KB | None | 0 0
  1. public class Matrix {
  2.    
  3.     public final static Matrix IDENTITY=new Matrix(Vec.X_AXIS, Vec.Y_AXIS, Vec.Z_AXIS);
  4.    
  5.     public final double m11, m12, m13,
  6.                         m21, m22, m23,
  7.                         m31, m32, m33;
  8.    
  9.    
  10.     public Matrix(double ... e) {
  11.         if(e.length!=9) throw new RuntimeException();
  12.         m11=e[0]; m12=e[1]; m13=e[2];
  13.         m21=e[3]; m22=e[4]; m23=e[5];
  14.         m31=e[6]; m32=e[7]; m33=e[8];
  15.     }
  16.    
  17.     public Matrix(Vec vx, Vec vy, Vec vz) {
  18.         this(vx.x, vy.x, vz.x,
  19.              vx.y, vy.y, vz.y,
  20.              vx.z, vy.z, vz.z);
  21.     }
  22.    
  23.     public Matrix(Vec axis, double theta) {
  24.         Vec u=axis.normalize();
  25.         double sin=Math.sin(theta);
  26.         double cos=Math.cos(theta);
  27.         double uxy=u.x*u.y*(1-cos);
  28.         double uyz=u.y*u.z*(1-cos);
  29.         double uxz=u.x*u.z*(1-cos);
  30.         double ux2=u.x*u.x*(1-cos);
  31.         double uy2=u.y*u.y*(1-cos);
  32.         double uz2=u.z*u.z*(1-cos);
  33.         double uxsin=u.x*sin;
  34.         double uysin=u.y*sin;
  35.         double uzsin=u.z*sin;
  36.        
  37.        
  38.         m11=cos+ux2;   m12=uxy-uzsin; m13=uxz+uysin;
  39.         m21=uxy+uzsin; m22=cos+uy2;   m23=uyz-uxsin;
  40.         m31=uxz-uysin; m32=uyz+uxsin; m33=cos+uz2;
  41.     }
  42.      
  43.     public Vec mul(Vec v) {
  44.         double rx = m11*v.x + m12*v.y + m13*v.z;
  45.         double ry = m21*v.x + m22*v.y + m23*v.z;
  46.         double rz = m31*v.x + m32*v.y + m33*v.z;
  47.         return new Vec(rx, ry, rz);
  48.     }
  49.    
  50.     private Matrix mul(Matrix m) {
  51.        
  52.         double r11 = m11*m.m11 + m12*m.m21 + m13*m.m31;
  53.         double r12 = m11*m.m12 + m12*m.m22 + m13*m.m32;
  54.         double r13 = m11*m.m13 + m12*m.m23 + m13*m.m33;
  55.        
  56.         double r21 = m21*m.m11 + m22*m.m21 + m23*m.m31;
  57.         double r22 = m21*m.m12 + m22*m.m22 + m23*m.m32;
  58.         double r23 = m21*m.m13 + m22*m.m23 + m23*m.m33;
  59.        
  60.         double r31 = m31*m.m11 + m32*m.m21 + m33*m.m31;
  61.         double r32 = m31*m.m12 + m32*m.m22 + m33*m.m32;
  62.         double r33 = m31*m.m13 + m32*m.m23 + m33*m.m33;
  63.        
  64.         return new Matrix(r11, r12, r13,
  65.                           r21, r22, r23,
  66.                           r31, r32, r33);
  67.     }
  68.    
  69.     public Matrix rotateRel(Matrix m) {
  70.         return mul(m);
  71.     }
  72.    
  73.     public Matrix rotateAbs(Matrix m) {
  74.         return m.mul(this);
  75.     }
  76.    
  77.     public Matrix normalize() {
  78.        
  79.         Vec vx=new Vec(m11, m21, m31);
  80.         Vec vy=new Vec(m12, m22, m32);
  81.         Vec vz=new Vec(m13, m23, m33);
  82.        
  83.         vz=vx.crossProduct(vy);
  84.         vy=vz.crossProduct(vx);
  85.        
  86.         vx=vx.normalize();
  87.         vy=vy.normalize();
  88.         vz=vz.normalize();
  89.        
  90.         return new Matrix(vx, vy, vz);
  91.     }
  92.    
  93.     public Matrix transpose() {
  94.         return new Matrix(m11, m21, m31,
  95.                           m12, m22, m32,
  96.                           m13, m23, m33);
  97.     }
  98.    
  99.     public Matrix oppositeRotMatrix() {
  100.         return transpose();
  101.     }
  102.    
  103.    
  104.     public String toString() {
  105.         return String.format(java.util.Locale.ENGLISH,
  106.             "[%.3f, %.3f, %.3f]\n[%.3f, %.3f, %.3f]\n[%.3f, %.3f, %.3f]",
  107.             m11, m12, m13, m21, m22, m23, m31, m32, m33);
  108.     }
  109.    
  110. }
Advertisement
Add Comment
Please, Sign In to add comment