Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / src / javajs / util / M34.java
index 883a56e..260a82c 100644 (file)
-package javajs.util;\r
-\r
-/**\r
- * A base class for both M3 and M4 to conserve code size.\r
- * \r
- * @author Kenji hiranabe\r
- * \r
- *         additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique\r
- *         constructor and method names for the optimization of compiled\r
- *         JavaScript using Java2Script and for subclassing to M3 and M4\r
- * \r
- */\r
-public abstract class M34 {\r
-\r
-  /**\r
-   * The first element of the first row\r
-   */\r
-  public float m00;\r
-\r
-  /**\r
-   * The second element of the first row.\r
-   */\r
-  public float m01;\r
-\r
-  /**\r
-   * third element of the first row.\r
-   */\r
-  public float m02;\r
-\r
-  /**\r
-   * The first element of the second row.\r
-   */\r
-  public float m10;\r
-\r
-  /**\r
-   * The second element of the second row.\r
-   */\r
-  public float m11;\r
-\r
-  /**\r
-   * The third element of the second row.\r
-   */\r
-  public float m12;\r
-\r
-  /**\r
-   * The first element of the third row.\r
-   */\r
-  public float m20;\r
-\r
-  /**\r
-   * The second element of the third row.\r
-   */\r
-  public float m21;\r
-\r
-  /**\r
-   * The third element of the third row.\r
-   */\r
-  public float m22;\r
-\r
-  protected void setAA33(A4 a) {\r
-    double x = a.x;\r
-    double y = a.y;\r
-    double z = a.z;\r
-    double angle = a.angle;\r
-    // Taken from Rick's which is taken from Wertz. pg. 412\r
-    // Bug Fixed and changed into right-handed by hiranabe\r
-    double n = Math.sqrt(x * x + y * y + z * z);\r
-    // zero-div may occur\r
-    n = 1 / n;\r
-    x *= n;\r
-    y *= n;\r
-    z *= n;\r
-    double c = Math.cos(angle);\r
-    double s = Math.sin(angle);\r
-    double omc = 1.0 - c;\r
-    m00 = (float) (c + x * x * omc);\r
-    m11 = (float) (c + y * y * omc);\r
-    m22 = (float) (c + z * z * omc);\r
-\r
-    double tmp1 = x * y * omc;\r
-    double tmp2 = z * s;\r
-    m01 = (float) (tmp1 - tmp2);\r
-    m10 = (float) (tmp1 + tmp2);\r
-\r
-    tmp1 = x * z * omc;\r
-    tmp2 = y * s;\r
-    m02 = (float) (tmp1 + tmp2);\r
-    m20 = (float) (tmp1 - tmp2);\r
-\r
-    tmp1 = y * z * omc;\r
-    tmp2 = x * s;\r
-    m12 = (float) (tmp1 - tmp2);\r
-    m21 = (float) (tmp1 + tmp2);\r
-  }\r
-\r
-  public void rotate(T3 t) {\r
-    // alias-safe\r
-    rotate2(t, t);\r
-  }\r
-\r
-  /**\r
-   * Transform the vector vec using this Matrix3f and place the result into\r
-   * vecOut.\r
-   * \r
-   * @param t\r
-   *        the single precision vector to be transformed\r
-   * @param result\r
-   *        the vector into which the transformed values are placed\r
-   */\r
-  public void rotate2(T3 t, T3 result) {\r
-    // alias-safe\r
-    result.set(m00 * t.x + m01 * t.y + m02 * t.z, m10 * t.x + m11 * t.y + m12\r
-        * t.z, m20 * t.x + m21 * t.y + m22 * t.z);\r
-  }\r
-\r
-\r
-  /**\r
-   * Sets the value of this matrix to the double value of the Matrix3f argument.\r
-   * \r
-   * @param m1\r
-   *        the matrix3f\r
-   */\r
-  protected void setM33(M34 m1) {\r
-    m00 = m1.m00;\r
-    m01 = m1.m01;\r
-    m02 = m1.m02;\r
-    m10 = m1.m10;\r
-    m11 = m1.m11;\r
-    m12 = m1.m12;\r
-    m20 = m1.m20;\r
-    m21 = m1.m21;\r
-    m22 = m1.m22;\r
-  }\r
-\r
-  protected void clear33() {\r
-    m00 = m01 = m02 = m10 = m11 = m12 = m20 = m21 = m22 = 0.0f;\r
-  }\r
-\r
-  protected void set33(int row, int col, float v) {\r
-    switch (row) {\r
-    case 0:\r
-      switch (col) {\r
-      case 0:\r
-        m00 = v;\r
-        return;\r
-      case 1:\r
-        m01 = v;\r
-        return;\r
-      case 2: \r
-        m02 = v;\r
-        return;\r
-      }\r
-      break;\r
-    case 1:\r
-      switch (col) {\r
-      case 0:\r
-        m10 = v;\r
-        return;\r
-      case 1:\r
-        m11 = v;\r
-        return;\r
-      case 2: \r
-        m12 = v;\r
-        return;\r
-      }\r
-      break;\r
-    case 2: \r
-      switch (col) {\r
-      case 0:\r
-        m20 = v;\r
-        return;\r
-      case 1:\r
-        m21 = v;\r
-        return;\r
-      case 2: \r
-        m22 = v;\r
-        return;\r
-      }\r
-      break;\r
-    }\r
-    err();\r
-  }\r
-\r
-  protected float get33(int row, int col) {\r
-    switch (row) {\r
-    case 0:\r
-      switch (col) {\r
-      case 0:\r
-        return m00;\r
-      case 1:\r
-        return m01;\r
-      case 2:\r
-        return m02;\r
-      }\r
-      break;\r
-    case 1:\r
-      switch (col) {\r
-      case 0:\r
-        return m10;\r
-      case 1:\r
-        return m11;\r
-      case 2:\r
-        return m12;\r
-      }\r
-      break;\r
-    case 2:\r
-      switch (col) {\r
-      case 0:\r
-        return m20;\r
-      case 1:\r
-        return m21;\r
-      case 2:\r
-        return m22;\r
-      }\r
-      break;\r
-    }\r
-    err();\r
-    return 0;\r
-  }\r
-\r
-  protected void setRow33(int row, float v[]) {\r
-    switch (row) {\r
-    case 0:\r
-      m00 = v[0];\r
-      m01 = v[1];\r
-      m02 = v[2];\r
-      return;\r
-    case 1:\r
-      m10 = v[0];\r
-      m11 = v[1];\r
-      m12 = v[2];\r
-      return;\r
-    case 2:\r
-      m20 = v[0];\r
-      m21 = v[1];\r
-      m22 = v[2];\r
-      return;\r
-    default:\r
-      err();\r
-    }\r
-  }\r
-  \r
-  public abstract void getRow(int row, float v[]);\r
-\r
-  protected void getRow33(int row, float v[]) {\r
-    switch (row) {\r
-    case 0:\r
-      v[0] = m00;\r
-      v[1] = m01;\r
-      v[2] = m02;\r
-      return;\r
-    case 1:\r
-      v[0] = m10;\r
-      v[1] = m11;\r
-      v[2] = m12;\r
-      return;\r
-    case 2:\r
-      v[0] = m20;\r
-      v[1] = m21;\r
-      v[2] = m22;\r
-      return;\r
-    }\r
-    err();\r
-  }\r
-\r
-  protected void setColumn33(int column, float v[]) {\r
-    switch(column) {\r
-    case 0:\r
-      m00 = v[0];\r
-      m10 = v[1];\r
-      m20 = v[2];\r
-      break;\r
-    case 1:\r
-      m01 = v[0];\r
-      m11 = v[1];\r
-      m21 = v[2];\r
-      break;\r
-    case 2:\r
-      m02 = v[0];\r
-      m12 = v[1];\r
-      m22 = v[2];\r
-      break;\r
-     default:\r
-      err();\r
-    }\r
-  }\r
-\r
-  protected void getColumn33(int column, float v[]) {\r
-    switch(column) {\r
-    case 0:\r
-      v[0] = m00;\r
-      v[1] = m10;\r
-      v[2] = m20;\r
-      break;\r
-    case 1:\r
-      v[0] = m01;\r
-      v[1] = m11;\r
-      v[2] = m21;\r
-      break;\r
-    case 2:\r
-      v[0] = m02;\r
-      v[1] = m12;\r
-      v[2] = m22;\r
-      break;\r
-    default:\r
-      err();\r
-    }\r
-  }\r
-\r
-  protected void add33(M34 m1) {\r
-    m00 += m1.m00;\r
-    m01 += m1.m01;\r
-    m02 += m1.m02;\r
-    m10 += m1.m10;\r
-    m11 += m1.m11;\r
-    m12 += m1.m12;\r
-    m20 += m1.m20;\r
-    m21 += m1.m21;\r
-    m22 += m1.m22;\r
-  }\r
-\r
-  protected void sub33(M34 m1) {\r
-    m00 -= m1.m00;\r
-    m01 -= m1.m01;\r
-    m02 -= m1.m02;\r
-    m10 -= m1.m10;\r
-    m11 -= m1.m11;\r
-    m12 -= m1.m12;\r
-    m20 -= m1.m20;\r
-    m21 -= m1.m21;\r
-    m22 -= m1.m22;\r
-  }\r
-\r
-  protected void mul33(float x) {\r
-    m00 *= x;\r
-    m01 *= x;\r
-    m02 *= x;\r
-    m10 *= x;\r
-    m11 *= x;\r
-    m12 *= x;\r
-    m20 *= x;\r
-    m21 *= x;\r
-    m22 *= x;\r
-  }\r
-\r
-  protected void transpose33() {\r
-    float tmp = m01;\r
-    m01 = m10;\r
-    m10 = tmp;\r
-\r
-    tmp = m02;\r
-    m02 = m20;\r
-    m20 = tmp;\r
-\r
-    tmp = m12;\r
-    m12 = m21;\r
-    m21 = tmp;\r
-  }\r
-\r
-  protected void setXRot(float angle) {\r
-    double c = Math.cos(angle);\r
-    double s = Math.sin(angle);\r
-    m00 = 1.0f;\r
-    m01 = 0.0f;\r
-    m02 = 0.0f;\r
-    m10 = 0.0f;\r
-    m11 = (float) c;\r
-    m12 = (float) -s;\r
-    m20 = 0.0f;\r
-    m21 = (float) s;\r
-    m22 = (float) c;\r
-  }\r
-\r
-  protected void setYRot(float angle) {\r
-    double c = Math.cos(angle);\r
-    double s = Math.sin(angle);\r
-    m00 = (float) c;\r
-    m01 = 0.0f;\r
-    m02 = (float) s;\r
-    m10 = 0.0f;\r
-    m11 = 1.0f;\r
-    m12 = 0.0f;\r
-    m20 = (float) -s;\r
-    m21 = 0.0f;\r
-    m22 = (float) c;\r
-  }\r
-  \r
-  protected void setZRot(float angle) {\r
-    double c = Math.cos(angle);\r
-    double s = Math.sin(angle);\r
-    m00 = (float) c;\r
-    m01 = (float) -s;\r
-    m02 = 0.0f;\r
-    m10 = (float) s;\r
-    m11 = (float) c;\r
-    m12 = 0.0f;\r
-    m20 = 0.0f;\r
-    m21 = 0.0f;\r
-    m22 = 1.0f;\r
-  }\r
-  \r
-  /**\r
-   * @return 3x3 determinant\r
-   */\r
-  public float determinant3() {\r
-    return m00 * (m11 * m22 - m21 * m12) - m01 * (m10 * m22 - m20 * m12) + m02\r
-        * (m10 * m21 - m20 * m11);\r
-  }\r
-  \r
-  protected void err() {\r
-    throw new ArrayIndexOutOfBoundsException(\r
-        "matrix column/row out of bounds");\r
-  }\r
-\r
-\r
-}\r
+package javajs.util;
+
+/**
+ * A base class for both M3 and M4 to conserve code size.
+ * 
+ * @author Kenji hiranabe
+ * 
+ *         additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique
+ *         constructor and method names for the optimization of compiled
+ *         JavaScript using Java2Script and for subclassing to M3 and M4
+ * 
+ */
+public abstract class M34 {
+
+  /**
+   * The first element of the first row
+   */
+  public float m00;
+
+  /**
+   * The second element of the first row.
+   */
+  public float m01;
+
+  /**
+   * third element of the first row.
+   */
+  public float m02;
+
+  /**
+   * The first element of the second row.
+   */
+  public float m10;
+
+  /**
+   * The second element of the second row.
+   */
+  public float m11;
+
+  /**
+   * The third element of the second row.
+   */
+  public float m12;
+
+  /**
+   * The first element of the third row.
+   */
+  public float m20;
+
+  /**
+   * The second element of the third row.
+   */
+  public float m21;
+
+  /**
+   * The third element of the third row.
+   */
+  public float m22;
+
+  protected void setAA33(A4 a) {
+    double x = a.x;
+    double y = a.y;
+    double z = a.z;
+    double angle = a.angle;
+    // Taken from Rick's which is taken from Wertz. pg. 412
+    // Bug Fixed and changed into right-handed by hiranabe
+    double n = Math.sqrt(x * x + y * y + z * z);
+    // zero-div may occur
+    n = 1 / n;
+    x *= n;
+    y *= n;
+    z *= n;
+    double c = Math.cos(angle);
+    double s = Math.sin(angle);
+    double omc = 1.0 - c;
+    m00 = (float) (c + x * x * omc);
+    m11 = (float) (c + y * y * omc);
+    m22 = (float) (c + z * z * omc);
+
+    double tmp1 = x * y * omc;
+    double tmp2 = z * s;
+    m01 = (float) (tmp1 - tmp2);
+    m10 = (float) (tmp1 + tmp2);
+
+    tmp1 = x * z * omc;
+    tmp2 = y * s;
+    m02 = (float) (tmp1 + tmp2);
+    m20 = (float) (tmp1 - tmp2);
+
+    tmp1 = y * z * omc;
+    tmp2 = x * s;
+    m12 = (float) (tmp1 - tmp2);
+    m21 = (float) (tmp1 + tmp2);
+  }
+
+  public void rotate(T3 t) {
+    // alias-safe
+    rotate2(t, t);
+  }
+
+  /**
+   * Transform the vector vec using this Matrix3f and place the result into
+   * vecOut.
+   * 
+   * @param t
+   *        the single precision vector to be transformed
+   * @param result
+   *        the vector into which the transformed values are placed
+   */
+  public void rotate2(T3 t, T3 result) {
+    // alias-safe
+    result.set(m00 * t.x + m01 * t.y + m02 * t.z, m10 * t.x + m11 * t.y + m12
+        * t.z, m20 * t.x + m21 * t.y + m22 * t.z);
+  }
+
+
+  /**
+   * Sets the value of this matrix to the double value of the Matrix3f argument.
+   * 
+   * @param m1
+   *        the matrix3f
+   */
+  protected void setM33(M34 m1) {
+    m00 = m1.m00;
+    m01 = m1.m01;
+    m02 = m1.m02;
+    m10 = m1.m10;
+    m11 = m1.m11;
+    m12 = m1.m12;
+    m20 = m1.m20;
+    m21 = m1.m21;
+    m22 = m1.m22;
+  }
+
+  protected void clear33() {
+    m00 = m01 = m02 = m10 = m11 = m12 = m20 = m21 = m22 = 0.0f;
+  }
+
+  protected void set33(int row, int col, float v) {
+    switch (row) {
+    case 0:
+      switch (col) {
+      case 0:
+        m00 = v;
+        return;
+      case 1:
+        m01 = v;
+        return;
+      case 2: 
+        m02 = v;
+        return;
+      }
+      break;
+    case 1:
+      switch (col) {
+      case 0:
+        m10 = v;
+        return;
+      case 1:
+        m11 = v;
+        return;
+      case 2: 
+        m12 = v;
+        return;
+      }
+      break;
+    case 2: 
+      switch (col) {
+      case 0:
+        m20 = v;
+        return;
+      case 1:
+        m21 = v;
+        return;
+      case 2: 
+        m22 = v;
+        return;
+      }
+      break;
+    }
+    err();
+  }
+
+  protected float get33(int row, int col) {
+    switch (row) {
+    case 0:
+      switch (col) {
+      case 0:
+        return m00;
+      case 1:
+        return m01;
+      case 2:
+        return m02;
+      }
+      break;
+    case 1:
+      switch (col) {
+      case 0:
+        return m10;
+      case 1:
+        return m11;
+      case 2:
+        return m12;
+      }
+      break;
+    case 2:
+      switch (col) {
+      case 0:
+        return m20;
+      case 1:
+        return m21;
+      case 2:
+        return m22;
+      }
+      break;
+    }
+    err();
+    return 0;
+  }
+
+  protected void setRow33(int row, float v[]) {
+    switch (row) {
+    case 0:
+      m00 = v[0];
+      m01 = v[1];
+      m02 = v[2];
+      return;
+    case 1:
+      m10 = v[0];
+      m11 = v[1];
+      m12 = v[2];
+      return;
+    case 2:
+      m20 = v[0];
+      m21 = v[1];
+      m22 = v[2];
+      return;
+    default:
+      err();
+    }
+  }
+  
+  public abstract void getRow(int row, float v[]);
+
+  protected void getRow33(int row, float v[]) {
+    switch (row) {
+    case 0:
+      v[0] = m00;
+      v[1] = m01;
+      v[2] = m02;
+      return;
+    case 1:
+      v[0] = m10;
+      v[1] = m11;
+      v[2] = m12;
+      return;
+    case 2:
+      v[0] = m20;
+      v[1] = m21;
+      v[2] = m22;
+      return;
+    }
+    err();
+  }
+
+  protected void setColumn33(int column, float v[]) {
+    switch(column) {
+    case 0:
+      m00 = v[0];
+      m10 = v[1];
+      m20 = v[2];
+      break;
+    case 1:
+      m01 = v[0];
+      m11 = v[1];
+      m21 = v[2];
+      break;
+    case 2:
+      m02 = v[0];
+      m12 = v[1];
+      m22 = v[2];
+      break;
+     default:
+      err();
+    }
+  }
+
+  protected void getColumn33(int column, float v[]) {
+    switch(column) {
+    case 0:
+      v[0] = m00;
+      v[1] = m10;
+      v[2] = m20;
+      break;
+    case 1:
+      v[0] = m01;
+      v[1] = m11;
+      v[2] = m21;
+      break;
+    case 2:
+      v[0] = m02;
+      v[1] = m12;
+      v[2] = m22;
+      break;
+    default:
+      err();
+    }
+  }
+
+  protected void add33(M34 m1) {
+    m00 += m1.m00;
+    m01 += m1.m01;
+    m02 += m1.m02;
+    m10 += m1.m10;
+    m11 += m1.m11;
+    m12 += m1.m12;
+    m20 += m1.m20;
+    m21 += m1.m21;
+    m22 += m1.m22;
+  }
+
+  protected void sub33(M34 m1) {
+    m00 -= m1.m00;
+    m01 -= m1.m01;
+    m02 -= m1.m02;
+    m10 -= m1.m10;
+    m11 -= m1.m11;
+    m12 -= m1.m12;
+    m20 -= m1.m20;
+    m21 -= m1.m21;
+    m22 -= m1.m22;
+  }
+
+  protected void mul33(float x) {
+    m00 *= x;
+    m01 *= x;
+    m02 *= x;
+    m10 *= x;
+    m11 *= x;
+    m12 *= x;
+    m20 *= x;
+    m21 *= x;
+    m22 *= x;
+  }
+
+  protected void transpose33() {
+    float tmp = m01;
+    m01 = m10;
+    m10 = tmp;
+
+    tmp = m02;
+    m02 = m20;
+    m20 = tmp;
+
+    tmp = m12;
+    m12 = m21;
+    m21 = tmp;
+  }
+
+  protected void setXRot(float angle) {
+    double c = Math.cos(angle);
+    double s = Math.sin(angle);
+    m00 = 1.0f;
+    m01 = 0.0f;
+    m02 = 0.0f;
+    m10 = 0.0f;
+    m11 = (float) c;
+    m12 = (float) -s;
+    m20 = 0.0f;
+    m21 = (float) s;
+    m22 = (float) c;
+  }
+
+  protected void setYRot(float angle) {
+    double c = Math.cos(angle);
+    double s = Math.sin(angle);
+    m00 = (float) c;
+    m01 = 0.0f;
+    m02 = (float) s;
+    m10 = 0.0f;
+    m11 = 1.0f;
+    m12 = 0.0f;
+    m20 = (float) -s;
+    m21 = 0.0f;
+    m22 = (float) c;
+  }
+  
+  protected void setZRot(float angle) {
+    double c = Math.cos(angle);
+    double s = Math.sin(angle);
+    m00 = (float) c;
+    m01 = (float) -s;
+    m02 = 0.0f;
+    m10 = (float) s;
+    m11 = (float) c;
+    m12 = 0.0f;
+    m20 = 0.0f;
+    m21 = 0.0f;
+    m22 = 1.0f;
+  }
+  
+  /**
+   * @return 3x3 determinant
+   */
+  public float determinant3() {
+    return m00 * (m11 * m22 - m21 * m12) - m01 * (m10 * m22 - m20 * m12) + m02
+        * (m10 * m21 - m20 * m11);
+  }
+  
+  protected void err() {
+    throw new ArrayIndexOutOfBoundsException(
+        "matrix column/row out of bounds");
+  }
+
+
+}