2009/11/03

2x2, 3x3, 4x4の逆行列

気合いで実装しました.
ごにょごにょするより早いと期待して...


 public static float mat2Determinant(float[][] mat){
    return mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
  }
  public static boolean mat2inv(float[][] mat, float[][] inv){
    float det=mat2Determinant(mat);
    if(Math.abs(det)
      //System.out.println("mat inv is not exist");
      return false;
    }
    inv[0][0]=mat[1][1]/det;
    inv[0][1]=-mat[0][1]/det;
    inv[1][0]=-mat[1][0]/det;
    inv[1][1]=-mat[0][0]/det;
    return true;
  }

  public static float mat3Determinant(float[][] mat){
    return mat[0][0]*mat[1][1]*mat[2][2]
      +mat[0][1]*mat[1][2]*mat[2][0]
      +mat[0][2]*mat[1][0]*mat[2][1]
      -mat[0][0]*mat[2][1]*mat[1][2]
      -mat[0][1]*mat[1][0]*mat[2][2]
      -mat[0][2]*mat[1][1]*mat[2][0];
  }
  public static boolean mat3inv(float[][] mat, float[][] inv){

    float det=mat3Determinant(mat);

    if(Math.abs(det)
      //System.out.println("mat inv is not exist");
      return false;
    }


    inv[0][0]=(mat[1][1]*mat[2][2]-mat[1][2]*mat[2][1])/det;
    inv[0][1]=(mat[0][2]*mat[2][1]-mat[0][1]*mat[2][2])/det;
    inv[0][2]=(mat[0][1]*mat[1][2]-mat[0][2]*mat[1][1])/det;

    inv[1][0]=(mat[1][2]*mat[2][0]-mat[1][0]*mat[2][2])/det;
    inv[1][1]=(mat[0][0]*mat[2][2]-mat[0][2]*mat[2][0])/det;
    inv[1][2]=(mat[0][2]*mat[1][0]-mat[0][0]*mat[1][2])/det;

    inv[2][0]=(mat[1][0]*mat[2][1]-mat[1][1]*mat[2][0])/det;
    inv[2][1]=(mat[0][1]*mat[2][0]-mat[0][0]*mat[2][1])/det;
    inv[2][2]=(mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0])/det;
    return true;
  }

  public static float mat4Determinant(float[][] mat){
    return mat[0][0]*mat[1][1]*mat[2][2]*mat[3][3]
      + mat[0][0]*mat[1][2]*mat[2][3]*mat[3][1]
      + mat[0][0]*mat[1][3]*mat[2][1]*mat[3][2]
      + mat[0][1]*mat[1][0]*mat[2][3]*mat[3][2]
      + mat[0][1]*mat[1][2]*mat[2][0]*mat[3][3]
      + mat[0][1]*mat[1][3]*mat[2][2]*mat[3][0]
      + mat[0][2]*mat[1][0]*mat[2][1]*mat[3][3]
      + mat[0][2]*mat[1][1]*mat[2][3]*mat[3][0]
      + mat[0][2]*mat[1][3]*mat[2][0]*mat[3][1]
      + mat[0][3]*mat[1][0]*mat[2][2]*mat[3][1]
      + mat[0][3]*mat[1][1]*mat[2][0]*mat[3][2]
      + mat[0][3]*mat[1][2]*mat[2][1]*mat[3][0]
      - mat[0][0]*mat[1][1]*mat[2][3]*mat[3][2]
      - mat[0][0]*mat[1][2]*mat[2][1]*mat[3][3]
      - mat[0][0]*mat[1][3]*mat[2][2]*mat[3][1]
      - mat[0][1]*mat[1][0]*mat[2][2]*mat[3][3]
      - mat[0][1]*mat[1][2]*mat[2][3]*mat[3][0]
      - mat[0][1]*mat[1][3]*mat[2][0]*mat[3][2]
      - mat[0][2]*mat[1][0]*mat[2][3]*mat[3][1]
      - mat[0][2]*mat[1][1]*mat[2][0]*mat[3][3]
      - mat[0][2]*mat[1][3]*mat[2][1]*mat[3][0]
      - mat[0][3]*mat[1][0]*mat[2][1]*mat[3][2]
      - mat[0][3]*mat[1][1]*mat[2][2]*mat[3][0]
      - mat[0][3]*mat[1][2]*mat[2][0]*mat[3][1];
  }
  public static boolean mat4inv(float[][] mat, float[][] inv){
    float det=mat4Determinant(mat);
    if(Math.abs(det)
      //System.out.println("mat inv is not exist");
      return false;
    }
    inv[0][0] = (mat[1][1]*mat[2][2]*mat[3][3]
                 + mat[1][2]*mat[2][3]*mat[3][1]
                 + mat[1][3]*mat[2][1]*mat[3][2]
                 - mat[1][1]*mat[2][3]*mat[3][2]
                 - mat[1][2]*mat[2][1]*mat[3][3]
                 - mat[1][3]*mat[2][2]*mat[3][1])/det;
    inv[0][1] = (mat[0][1]*mat[2][3]*mat[3][2]
                 + mat[0][2]*mat[2][1]*mat[3][3]
                 + mat[0][3]*mat[2][2]*mat[3][1]
                 - mat[0][1]*mat[2][2]*mat[3][3]
                 - mat[0][2]*mat[2][3]*mat[3][1]
                 - mat[0][3]*mat[2][1]*mat[3][2])/det;
    inv[0][2] = (mat[0][1]*mat[1][2]*mat[3][3]
                 + mat[0][2]*mat[1][3]*mat[3][1]
                 + mat[0][3]*mat[1][1]*mat[3][2]
                 - mat[0][1]*mat[1][3]*mat[3][2]
                 - mat[0][2]*mat[1][1]*mat[3][3]
                 - mat[0][3]*mat[1][2]*mat[3][1])/det;
    inv[0][3] = (mat[0][1]*mat[1][3]*mat[2][2]
                 + mat[0][2]*mat[1][1]*mat[2][3]
                 + mat[0][3]*mat[1][2]*mat[2][1]
                 - mat[0][1]*mat[1][2]*mat[2][3]
                 - mat[0][2]*mat[1][3]*mat[2][1]
                 - mat[0][3]*mat[1][1]*mat[2][2])/det;
    inv[1][0] = (mat[1][0]*mat[2][3]*mat[3][2]
                 + mat[1][2]*mat[2][0]*mat[3][3]
                 + mat[1][3]*mat[2][2]*mat[3][0]
                 - mat[1][0]*mat[2][2]*mat[3][3]
                 - mat[1][2]*mat[2][3]*mat[3][0]
                 - mat[1][3]*mat[2][0]*mat[3][2])/det;
    inv[1][1] = (mat[0][0]*mat[2][2]*mat[3][3]
                 + mat[0][2]*mat[2][3]*mat[3][0]
                 + mat[0][3]*mat[2][0]*mat[3][2]
                 - mat[0][0]*mat[2][3]*mat[3][2]
                 - mat[0][2]*mat[2][0]*mat[3][3]
                 - mat[0][3]*mat[2][2]*mat[3][0])/det;
    inv[1][2] = (mat[0][0]*mat[1][3]*mat[3][2]
                 + mat[0][2]*mat[1][0]*mat[3][3]
                 + mat[0][3]*mat[1][2]*mat[3][0]
                 - mat[0][0]*mat[1][2]*mat[3][3]
                 - mat[0][2]*mat[1][3]*mat[3][0]
                 - mat[0][3]*mat[1][0]*mat[3][2])/det;
    inv[1][3] = (mat[0][0]*mat[1][2]*mat[2][3]
                 + mat[0][2]*mat[1][3]*mat[2][0]
                 + mat[0][3]*mat[1][0]*mat[2][2]
                 - mat[0][0]*mat[1][3]*mat[2][2]
                 - mat[0][2]*mat[1][0]*mat[2][3]
                 - mat[0][3]*mat[1][2]*mat[2][0])/det;
    inv[2][0] = (mat[1][0]*mat[2][1]*mat[3][3]
                 + mat[1][1]*mat[2][3]*mat[3][0]
                 + mat[1][3]*mat[2][0]*mat[3][1]
                 - mat[1][0]*mat[2][3]*mat[3][1]
                 - mat[1][1]*mat[2][0]*mat[3][3]
                 - mat[1][3]*mat[2][1]*mat[3][0])/det;
    inv[2][1] = (mat[0][0]*mat[2][3]*mat[3][1]
                 + mat[0][1]*mat[2][0]*mat[3][3]
                 + mat[0][3]*mat[2][1]*mat[3][0]
                 - mat[0][0]*mat[2][1]*mat[3][3]
                 - mat[0][1]*mat[2][3]*mat[3][0]
                 - mat[0][3]*mat[2][0]*mat[3][1])/det;
    inv[2][2] = (mat[0][0]*mat[1][1]*mat[3][3]
                 + mat[0][1]*mat[1][3]*mat[3][0]
                 + mat[0][3]*mat[1][0]*mat[3][1]
                 - mat[0][0]*mat[1][3]*mat[3][1]
                 - mat[0][1]*mat[1][0]*mat[3][3]
                 - mat[0][3]*mat[1][1]*mat[3][0])/det;
    inv[2][3] = (mat[0][0]*mat[1][3]*mat[2][1]
                 + mat[0][1]*mat[1][0]*mat[2][3]
                 + mat[0][3]*mat[1][1]*mat[2][0]
                 - mat[0][0]*mat[1][1]*mat[2][3]
                 - mat[0][1]*mat[1][3]*mat[2][0]
                 - mat[0][3]*mat[1][0]*mat[2][1])/det;
    inv[3][0] = (mat[1][0]*mat[2][2]*mat[3][1]
                 + mat[1][1]*mat[2][0]*mat[3][2]
                 + mat[1][2]*mat[2][1]*mat[3][0]
                 - mat[1][0]*mat[2][1]*mat[3][2]
                 - mat[1][1]*mat[2][2]*mat[3][0]
                 - mat[1][2]*mat[2][0]*mat[3][1])/det;
    inv[3][1] = (mat[0][0]*mat[2][1]*mat[3][2]
                 + mat[0][1]*mat[2][2]*mat[3][0]
                 + mat[0][2]*mat[2][0]*mat[3][1]
                 - mat[0][0]*mat[2][2]*mat[3][1]
                 - mat[0][1]*mat[2][0]*mat[3][2]
                 - mat[0][2]*mat[2][1]*mat[3][0])/det;
    inv[3][2] = (mat[0][0]*mat[1][2]*mat[3][1]
                 + mat[0][1]*mat[1][0]*mat[3][2]
                 + mat[0][2]*mat[1][1]*mat[3][0]
                 - mat[0][0]*mat[1][1]*mat[3][2]
                 - mat[0][1]*mat[1][2]*mat[3][0]
                 - mat[0][2]*mat[1][0]*mat[3][1])/det;
    inv[3][3] = (mat[0][0]*mat[1][1]*mat[2][2]
                 + mat[0][1]*mat[1][2]*mat[2][0]
                 + mat[0][2]*mat[1][0]*mat[2][1]
                 - mat[0][0]*mat[1][2]*mat[2][1]
                 - mat[0][1]*mat[1][0]*mat[2][2]
                 - mat[0][2]*mat[1][1]*mat[2][0])/det;
    return true;
  }


0 件のコメント: