content: package com.google.vrtoolkit.cardboard.sensors.internal;
  
  public class Matrix3x3d {
      public double[] m;
      
      public Matrix3x3d() {
          super();
          this.m = new double[9];
      }
      
      public Matrix3x3d(final double m00, final double m01, final double m02, final double m10, final double m11, final double m12, final double m20, final double m21, final double m22) {
          super();
          (this.m = new double[9])[0] = m00;
          this.m[1] = m01;
          this.m[2] = m02;
          this.m[3] = m10;
          this.m[4] = m11;
          this.m[5] = m12;
          this.m[6] = m20;
          this.m[7] = m21;
          this.m[8] = m22;
      }
      
      public Matrix3x3d(final Matrix3x3d o) {
          super();
          (this.m = new double[9])[0] = o.m[0];
          this.m[1] = o.m[1];
          this.m[2] = o.m[2];
          this.m[3] = o.m[3];
          this.m[4] = o.m[4];
          this.m[5] = o.m[5];
          this.m[6] = o.m[6];
          this.m[7] = o.m[7];
          this.m[8] = o.m[8];
      }
      
      public void set(final double m00, final double m01, final double m02, final double m10, final double m11, final double m12, final double m20, final double m21, final double m22) {
          this.m[0] = m00;
          this.m[1] = m01;
          this.m[2] = m02;
          this.m[3] = m10;
          this.m[4] = m11;
          this.m[5] = m12;
          this.m[6] = m20;
          this.m[7] = m21;
          this.m[8] = m22;
      }
      
      public void set(final Matrix3x3d o) {
          this.m[0] = o.m[0];
          this.m[1] = o.m[1];
          this.m[2] = o.m[2];
          this.m[3] = o.m[3];
          this.m[4] = o.m[4];
          this.m[5] = o.m[5];
          this.m[6] = o.m[6];
          this.m[7] = o.m[7];
          this.m[8] = o.m[8];
      }
      
      public void setZero() {
          this.m[0] = 0;
          this.m[1] = 0;
          this.m[2] = 0;
          this.m[3] = 0;
          this.m[4] = 0;
          this.m[5] = 0;
          this.m[6] = 0;
          this.m[7] = 0;
          this.m[8] = 0;
      }
      
      public void setIdentity() {
          this.m[0] = 1;
          this.m[1] = 0;
          this.m[2] = 0;
          this.m[3] = 0;
          this.m[4] = 1;
          this.m[5] = 0;
          this.m[6] = 0;
          this.m[7] = 0;
          this.m[8] = 1;
      }
      
      public void setSameDiagonal(final double d) {
          this.m[0] = d;
          this.m[4] = d;
          this.m[8] = d;
      }
      
      public double get(final int row, final int col) {
          return this.m[3 * row + col];
      }
      
      public void set(final int row, final int col, final double value) {
          this.m[3 * row + col] = value;
      }
      
      public void getColumn(final int col, final Vector3d v) {
          v.x = this.m[col];
          v.y = this.m[col + 3];
          v.z = this.m[col + 6];
      }
      
      public void setColumn(final int col, final Vector3d v) {
          this.m[col] = v.x;
          this.m[col + 3] = v.y;
          this.m[col + 6] = v.z;
      }
      
      public void scale(final double s) {
          for (int i = 0; i < 9; i++) {
              this.m[i] *= s;
          }
      }
      
      public void plusEquals(final Matrix3x3d b) {
          for (int i = 0; i < 9; i++) {
              this.m[i] += b.m[i];
          }
      }
      
      public void minusEquals(final Matrix3x3d b) {
          for (int i = 0; i < 9; i++) {
              this.m[i] -= b.m[i];
          }
      }
      
      public void transpose() {
          double tmp = this.m[1];
          this.m[1] = this.m[3];
          this.m[3] = tmp;
          tmp = this.m[2];
          this.m[2] = this.m[6];
          this.m[6] = tmp;
          tmp = this.m[5];
          this.m[5] = this.m[7];
          this.m[7] = tmp;
      }
      
      public void transpose(final Matrix3x3d result) {
          final double m1 = this.m[1];
          final double m2 = this.m[2];
          final double m3 = this.m[5];
          result.m[0] = this.m[0];
          result.m[1] = this.m[3];
          result.m[2] = this.m[6];
          result.m[3] = m1;
          result.m[4] = this.m[4];
          result.m[5] = this.m[7];
          result.m[6] = m2;
          result.m[7] = m3;
          result.m[8] = this.m[8];
      }
      
      public static void add(final Matrix3x3d a, final Matrix3x3d b, final Matrix3x3d result) {
          result.m[0] = a.m[0] + b.m[0];
          result.m[1] = a.m[1] + b.m[1];
          result.m[2] = a.m[2] + b.m[2];
          result.m[3] = a.m[3] + b.m[3];
          result.m[4] = a.m[4] + b.m[4];
          result.m[5] = a.m[5] + b.m[5];
          result.m[6] = a.m[6] + b.m[6];
          result.m[7] = a.m[7] + b.m[7];
          result.m[8] = a.m[8] + b.m[8];
      }
      
      public static void mult(final Matrix3x3d a, final Matrix3x3d b, final Matrix3x3d result) {
          result.set(a.m[0] * b.m[0] + a.m[1] * b.m[3] + a.m[2] * b.m[6],
                  a.m[0] * b.m[1] + a.m[1] * b.m[4] + a.m[2] * b.m[7],
                  a.m[0] * b.m[2] + a.m[1] * b.m[5] + a.m[2] * b.m[8],
                  a.m[3] * b.m[0] + a.m[4] * b.m[3] + a.m[5] * b.m[6],
                  a.m[3] * b.m[1] + a.m[4] * b.m[4] + a.m[5] * b.m[7],
                  a.m[3] * b.m[2] + a.m[4] * b.m[5] + a.m[5] * b.m[8],
                  a.m[6] * b.m[0] + a.m[7] * b.m[3] + a.m[8] * b.m[6],
                  a.m[6] * b.m[1] + a.m[7] * b.m[4] + a.m[8] * b.m[7],
                  a.m[6] * b.m[2] + a.m[7] * b.m[5] + a.m[8] * b.m[8]);
      }
      
      public static void mult(final Matrix3x3d a, final Vector3d v, final Vector3d result) {
          final double x = a.m[0] * v.x + a.m[1] * v.y + a.m[2] * v.z;
          final double y = a.m[3] * v.x + a.m[4] * v.y + a.m[5] * v.z;
          final double z = a.m[6] * v.x + a.m[7] * v.y + a.m[8] * v.z;
          result.x = x;
          result.y = y;
          result.z = z;
      }
      
      public double determinant() {
          return this.get(0, 0) * (this.get(1, 1) * this.get(2, 2) - this.get(2, 1) * this.get(1, 2))
                  - this.get(0, 1) * (this.get(1, 0) * this.get(2, 2) - this.get(1, 2) * this.get(2, 0))
                  + this.get(0, 2) * (this.get(1, 0) * this.get(2, 1) - this.get(1, 1) * this.get(2, 0));
      }
      
      public boolean invert(final Matrix3x3d result) {
          final double d = this.determinant();
          if (d == 0.0) {
              return false;
          }
          final double invdet = 1.0 / d;
          result.set((this.m[4] * this.m[8] - this.m[7] * this.m[5]) * invdet,
                  -(this.m[1] * this.m[8] - this.m[2] * this.m[7]) * invdet,
                  (this.m[1] * this.m[5] - this.m[2] * this.m[4]) * invdet,
                  -(this.m[3] * this.m[8] - this.m[5] * this.m[6]) * invdet,
                  (this.m[0] * this.m[8] - this.m[2] * this.m[6]) * invdet,
                  -(this.m[0] * this.m[5] - this.m[3] * this.m[2]) * invdet,
                  (this.m[3] * this.m[7] - this.m[6] * this.m[4]) * invdet,
                  -(this.m[0] * this.m[7] - this.m[6] * this.m[1]) * invdet,
                  (this.m[0] * this.m[4] - this.m[3] * this.m[1]) * invdet);
          return true;
      }
  
      @Override
      public String toString() {
          final StringBuilder builder = new StringBuilder().append("{ ");
          for (int i = 0; i < 9; ++i)
          {
              builder.append(Double.toString(this.m[i]));
              if (i < 9 - 1)
              {
                  builder.append(", ");
              }
          }
          builder.append(" }");
          return builder.toString();
      }
  }
  