+ double xRad;
+ double yRad;
+ double zRad;
+
+ xRad = StrictMath.toRadians(95);
+ yRad = StrictMath.toRadians(0);
+ zRad = StrictMath.toRadians(0);
+ qq.setEulerYXZ(xRad, yRad, zRad);
+ qq.toEulerYXZ(eu, yRad);
+ assertUlpEquals(StrictMath.toRadians(85), eu.getXRot(), 1);
+ assertUlpEquals(StrictMath.toRadians(180), eu.getYRot(), 0);
+ assertUlpEquals(StrictMath.toRadians(180), eu.getZRot(), 0);
+
+ return;
+ }
+
+ /**
+ * Test of critical case, of class MkQuat.
+ */
+ @Test
+ public void testCritical() {
+ System.out.println("critical");
+
+ EulerYXZ eu;
+ MkQuat qq;
+ double xRad;
+ double yRad;
+ double zRad;
+
+ qq = new MkQuat();
+ eu = new EulerYXZ();
+
+ xRad = StrictMath.toRadians(89);
+ yRad = StrictMath.toRadians(80);
+ zRad = StrictMath.toRadians(41);
+ qq.setEulerYXZ(xRad, yRad, zRad);
+ qq.toEulerYXZ(eu, 0.0);
+ assertUlpEquals(xRad, eu.getXRot(), 164);
+ assertUlpEquals(yRad, eu.getYRot(), 143);
+ assertUlpEquals(zRad, eu.getZRot(), 211);
+
+ // ジンバルロック判定境界ケース
+ xRad = StrictMath.toRadians(90);
+ yRad = StrictMath.toRadians(6);
+ zRad = StrictMath.toRadians(7);
+ qq.setEulerYXZ(xRad, yRad, zRad);
+ qq.toEulerYXZ(eu, yRad);
+ assert0UlpEquals(xRad, eu.getXRot());
+ assert0UlpEquals(yRad, eu.getYRot());
+ assert0UlpEquals(zRad, eu.getZRot());
+
+ xRad = StrictMath.toRadians(89.999);
+ yRad = StrictMath.toRadians(89.999);
+ zRad = StrictMath.toRadians(89.999);
+ qq.setEulerYXZ(xRad, yRad, zRad);
+ qq.toEulerYXZ(eu, yRad);
+ assertUlpEquals(xRad, eu.getXRot(), 83029);
+ assertUlpEquals(yRad, eu.getYRot(), 80108);
+ assertUlpEquals(zRad, eu.getZRot(), 80108);
+