Vector4D.qFromMatrix constructor

Vector4D.qFromMatrix(
  1. MatrixD mat
)

Implementation

factory Vector4D.qFromMatrix(MatrixD mat) {
  final fourWSquaredMinus1 = mat.m0  + mat.m5 + mat.m10;
  final fourXSquaredMinus1 = mat.m0  - mat.m5 - mat.m10;
  final fourYSquaredMinus1 = mat.m5  - mat.m0 - mat.m10;
  final fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5;

  int biggestIndex = 0;
  double fourBiggestSquaredMinus1 = fourWSquaredMinus1;
  if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) {
    fourBiggestSquaredMinus1 = fourXSquaredMinus1;
    biggestIndex = 1;
  }

  if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) {
    fourBiggestSquaredMinus1 = fourYSquaredMinus1;
    biggestIndex = 2;
  }

  if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) {
    fourBiggestSquaredMinus1 = fourZSquaredMinus1;
    biggestIndex = 3;
  }

  final biggestVal = math.sqrt(fourBiggestSquaredMinus1 + 1.0)*0.5;
  final mult = 0.25/biggestVal;

  return switch (biggestIndex) {
    0 => .vec4(
      biggestVal,
      (mat.m6 - mat.m9)*mult,
      (mat.m8 - mat.m2)*mult,
      (mat.m1 - mat.m4)*mult,
    ),
    1 => .vec4(
      biggestVal,
      (mat.m6 - mat.m9)*mult,
      (mat.m1 + mat.m4)*mult,
      (mat.m8 + mat.m2)*mult,
    ),
    2 => .vec4(
      biggestVal,
      (mat.m8 - mat.m2)*mult,
      (mat.m1 + mat.m4)*mult,
      (mat.m6 + mat.m9)*mult,
    ),
    3 => .vec4(
      biggestVal,
      (mat.m1 - mat.m4)*mult,
      (mat.m8 + mat.m2)*mult,
      (mat.m6 + mat.m9)*mult,
    ),
    _ => .zero(),
  };
}