4 package jp.sfjp.mikutoga.math;
6 import org.junit.After;
7 import org.junit.AfterClass;
8 import org.junit.Before;
9 import org.junit.BeforeClass;
10 import org.junit.Test;
11 import static org.junit.Assert.*;
16 public strictfp class MkQuatTest {
18 private static final double RAD_90DEG = StrictMath.PI / 2.0;
19 private static final double RAD_60DEG = StrictMath.PI / 3.0;
20 private static final double RAD_45DEG = StrictMath.PI / 4.0;
21 private static final double RAD_30DEG = StrictMath.PI / 6.0;
22 private static final double RAD_15DEG = StrictMath.PI / 12.0;
23 private static final double EPSILON = StrictMath.ulp(1.0);
29 public static void setUpClass() {
33 public static void tearDownClass() {
41 public void tearDown() {
44 private void assert0UlpEquals(double expected, double x){
45 assertUlpEquals(expected, x, 0);
49 private void assertUlpEquals(double expected, double x, int ulpNum){
50 double ulp = StrictMath.ulp(expected);
51 double delta = ulp * ulpNum;
53 assertEquals(expected, x, delta);
59 * Test of constructor, of class MkQuat.
62 public void testCons() {
63 System.out.println("constructor");
68 assert0UlpEquals(0.0, qq.getQ1());
69 assert0UlpEquals(0.0, qq.getQ2());
70 assert0UlpEquals(0.0, qq.getQ3());
71 assert0UlpEquals(1.0, qq.getQW());
74 assert0UlpEquals(2.0, qq.getQ1());
75 assert0UlpEquals(0.0, qq.getQ2());
76 assert0UlpEquals(0.0, qq.getQ3());
77 assert0UlpEquals(1.0, qq.getQW());
80 assert0UlpEquals(2.0, qq.getQ1());
81 assert0UlpEquals(3.0, qq.getQ2());
82 assert0UlpEquals(0.0, qq.getQ3());
83 assert0UlpEquals(1.0, qq.getQW());
86 assert0UlpEquals(2.0, qq.getQ1());
87 assert0UlpEquals(3.0, qq.getQ2());
88 assert0UlpEquals(4.0, qq.getQ3());
89 assert0UlpEquals(1.0, qq.getQW());
92 assert0UlpEquals(2.0, qq.getQ1());
93 assert0UlpEquals(3.0, qq.getQ2());
94 assert0UlpEquals(4.0, qq.getQ3());
95 assert0UlpEquals(5.0, qq.getQW());
97 qq.setQ123W(6.0, 7.0, 8.0, 9.0);
98 assert0UlpEquals(6.0, qq.getQ1());
99 assert0UlpEquals(7.0, qq.getQ2());
100 assert0UlpEquals(8.0, qq.getQ3());
101 assert0UlpEquals(9.0, qq.getQW());
103 qq = new MkQuat(0.1, 0.2, 0.3, 0.4);
104 assert0UlpEquals(0.1, qq.getQ1());
105 assert0UlpEquals(0.2, qq.getQ2());
106 assert0UlpEquals(0.3, qq.getQ3());
107 assert0UlpEquals(0.4, qq.getQW());
109 MkQuat qqx = new MkQuat(1.0, 2.0, 3.0, 4.0);
110 qq = new MkQuat(qqx);
111 assert0UlpEquals(1.0, qq.getQ1());
112 assert0UlpEquals(2.0, qq.getQ2());
113 assert0UlpEquals(3.0, qq.getQ3());
114 assert0UlpEquals(4.0, qq.getQW());
120 * Test of mul method, of class MkQuat.
123 public void testMul() {
124 System.out.println("mul");
130 result = new MkQuat();
132 qqa = new MkQuat(1.0, 2.0, 3.0, 4.0);
133 qqb = new MkQuat(5.0, 6.0, 7.0, 8.0);
134 MkQuat.mul(qqa, qqb, result);
135 assert0UlpEquals(24.0, result.getQ1());
136 assert0UlpEquals(48.0, result.getQ2());
137 assert0UlpEquals(48.0, result.getQ3());
138 assert0UlpEquals(-6.0, result.getQW());
140 qqa = new MkQuat(1.0, 2.0, 3.0, 4.0);
141 qqb = new MkQuat(6.0, 7.0, 8.0, 9.0);
142 MkQuat.mul(qqa, qqb, result);
143 assert0UlpEquals(28.0, result.getQ1());
144 assert0UlpEquals(56.0, result.getQ2());
145 assert0UlpEquals(54.0, result.getQ3());
146 assert0UlpEquals(-8.0, result.getQW());
152 * Test of conjugate method, of class MkQuat.
155 public void testConjugate() {
156 System.out.println("conjugate");
161 qq = new MkQuat(1.0, 2.0, 3.0, 4.0);
162 result = new MkQuat();
163 MkQuat.conjugate(qq, result);
164 assert0UlpEquals(-1.0, result.getQ1());
165 assert0UlpEquals(-2.0, result.getQ2());
166 assert0UlpEquals(-3.0, result.getQ3());
167 assert0UlpEquals(4.0, result.getQW());
173 * Test of normalize method, of class MkQuat.
176 public void testNormalize() {
177 System.out.println("normalize");
183 result = new MkQuat();
184 MkQuat.normalize(qq, result);
185 assert0UlpEquals(0.0, result.getQ1());
186 assert0UlpEquals(0.0, result.getQ2());
187 assert0UlpEquals(0.0, result.getQ3());
188 assert0UlpEquals(1.0, result.getQW());
190 qq = new MkQuat(2.0, 2.0, 2.0, 2.0);
191 MkQuat.normalize(qq, result);
192 assertUlpEquals(0.5, result.getQ1(), 0);
193 assertUlpEquals(0.5, result.getQ2(), 0);
194 assertUlpEquals(0.5, result.getQ3(), 0);
195 assertUlpEquals(0.5, result.getQW(), 0);
201 * Test of inverse method, of class MkQuat.
204 public void testInverse() {
205 System.out.println("inverse");
211 result = new MkQuat();
212 MkQuat.inverse(qq, result);
213 assert0UlpEquals(0.0, result.getQ1());
214 assert0UlpEquals(0.0, result.getQ2());
215 assert0UlpEquals(0.0, result.getQ3());
216 assert0UlpEquals(1.0, result.getQW());
218 qq = new MkQuat(2.0, 2.0, 2.0, 2.0);
219 MkQuat.inverse(qq, result);
220 assertUlpEquals(-0.125, result.getQ1(), 0);
221 assertUlpEquals(-0.125, result.getQ2(), 0);
222 assertUlpEquals(-0.125, result.getQ3(), 0);
223 assertUlpEquals(0.125, result.getQW(), 0);
229 * Test of abs method, of class MkQuat.
232 public void testAbs() {
233 System.out.println("abs");
238 assert0UlpEquals(1.0, qq.abs());
240 qq = new MkQuat(0.0, 0.0, 0.0, 0.0);
241 assert0UlpEquals(0.0, qq.abs());
243 qq = new MkQuat(1.0, 2.0, 0.0, 2.0);
244 assertUlpEquals(3.0, qq.abs(), 0);
246 qq = new MkQuat(2.0, 2.0, 2.0, 2.0);
247 assertUlpEquals(4.0, qq.abs(), 0);
253 * Test of setPos3D method, of class MkQuat.
256 public void testReadPos3D_3args() {
257 System.out.println("readPos3D");
261 qq = new MkQuat(9, 9, 9, 9);
262 qq.setPos3D(1.0, 2.0, 3.0);
263 assert0UlpEquals(1.0, qq.getQ1());
264 assert0UlpEquals(2.0, qq.getQ2());
265 assert0UlpEquals(3.0, qq.getQ3());
266 assert0UlpEquals(0.0, qq.getQW());
272 * Test of setPos3D method, of class MkQuat.
275 public void testReadPos3D_MkPos3D() {
276 System.out.println("readPos3D");
281 qq = new MkQuat(9, 9, 9, 9);
282 pos = new MkPos3D(1.0, 2.0, 3.0);
284 assert0UlpEquals(1.0, qq.getQ1());
285 assert0UlpEquals(2.0, qq.getQ2());
286 assert0UlpEquals(3.0, qq.getQ3());
287 assert0UlpEquals(0.0, qq.getQW());
293 * Test of setEulerYXZ method, of class MkQuat.
296 public void testReadEulerYXZ_3args() {
297 System.out.println("readEulerYXZ");
301 qq = new MkQuat(9, 9, 9, 9);
302 qq.setEulerYXZ(0.0, 0.0, 0.0);
303 assert0UlpEquals(0.0, qq.getQ1());
304 assert0UlpEquals(0.0, qq.getQ2());
305 assert0UlpEquals(0.0, qq.getQ3());
306 assert0UlpEquals(1.0, qq.getQW());
312 * Test of setEulerYXZ method, of class MkQuat.
315 public void testReadEulerYXZ_EulerYXZ() {
316 System.out.println("readEulerYXZ");
321 qq = new MkQuat(9, 9, 9, 9);
322 yxz = new EulerYXZ();
324 assert0UlpEquals(0.0, qq.getQ1());
325 assert0UlpEquals(0.0, qq.getQ2());
326 assert0UlpEquals(0.0, qq.getQ3());
327 assert0UlpEquals(1.0, qq.getQW());
333 * Test of toEulerYXZ method, of class MkQuat.
336 public void testToEulerYXZ_EulerYXZ_double() {
337 System.out.println("toEulerYXZ");
344 qq.setEulerYXZ(1.0, 2.0, 3.0);
346 qq.toEulerYXZ(eu, 0.0);
347 assertUlpEquals(1.0, eu.getXRot(), 1);
348 assertUlpEquals(2.0, eu.getYRot(), 2);
349 assertUlpEquals(3.0, eu.getZRot(), 0);
351 qq.setEulerYXZ(RAD_90DEG, 0.0, 0.0);
352 qq.toEulerYXZ(eu, 0.0);
353 assert0UlpEquals(RAD_90DEG, eu.getXRot());
354 assert0UlpEquals(0.0, eu.getYRot());
355 assert0UlpEquals(0.0, eu.getZRot());
357 qq.setEulerYXZ(RAD_90DEG, RAD_30DEG, 0.0);
358 qq.toEulerYXZ(eu, 0.0);
359 assert0UlpEquals(RAD_90DEG, eu.getXRot());
360 assert0UlpEquals(0.0, eu.getYRot());
361 assertUlpEquals(-RAD_30DEG, eu.getZRot(), 1);
363 qq.toEulerYXZ(eu, RAD_15DEG);
364 assert0UlpEquals(RAD_90DEG, eu.getXRot());
365 assert0UlpEquals(RAD_15DEG, eu.getYRot());
366 assertUlpEquals(-RAD_15DEG, eu.getZRot(), 2);
368 qq.setEulerYXZ(RAD_90DEG, RAD_45DEG, 0.0);
369 qq.toEulerYXZ(eu, 0.0);
370 assert0UlpEquals(RAD_90DEG, eu.getXRot());
371 assert0UlpEquals(0.0, eu.getYRot());
372 assert0UlpEquals(-RAD_45DEG, eu.getZRot());
374 qq.setEulerYXZ(RAD_90DEG, RAD_45DEG, RAD_45DEG);
375 qq.toEulerYXZ(eu, 0.0);
376 assertEquals(RAD_90DEG, eu.getXRot(), 1E-7);
377 assert0UlpEquals(0.0, eu.getYRot());
378 assertEquals(0.0, eu.getZRot(), EPSILON);
380 qq.setEulerYXZ(RAD_90DEG, RAD_30DEG, RAD_60DEG);
381 qq.toEulerYXZ(eu, 0.0);
382 assert0UlpEquals(RAD_90DEG, eu.getXRot());
383 assert0UlpEquals(0.0, eu.getYRot());
384 assert0UlpEquals(RAD_30DEG, eu.getZRot());
386 qq.setEulerYXZ(RAD_30DEG, RAD_45DEG, RAD_45DEG);
387 qq.toEulerYXZ(eu, 0.0);
388 assertUlpEquals(RAD_30DEG, eu.getXRot(), 1);
389 assertUlpEquals(RAD_45DEG, eu.getYRot(), 1);
390 assertUlpEquals(RAD_45DEG, eu.getZRot(), 1);
396 * Test of toEulerYXZ method, of class MkQuat.
399 public void testToEulerYXZ_EulerYXZ() {
400 System.out.println("toEulerYXZ");
407 qq.setEulerYXZ(1.0, 2.0, 3.0);
410 assertUlpEquals(1.0, eu.getXRot(), 1);
411 assertUlpEquals(2.0, eu.getYRot(), 2);
412 assertUlpEquals(3.0, eu.getZRot(), 0);
414 qq.setEulerYXZ(StrictMath.PI, 0.0, 0.0);
416 assertEquals(0.0, eu.getXRot(), EPSILON);
417 assert0UlpEquals(StrictMath.PI, eu.getYRot());
418 assert0UlpEquals(StrictMath.PI, eu.getZRot());
424 * Test of rotatePos method, of class MkQuat.
427 public void testRotatePos() {
428 System.out.println("rotatePos");
436 pos = new MkPos3D(1.0, 1.0, 1.0);
437 result = new MkPos3D();
439 qq.setEulerYXZ(0.0, RAD_90DEG, 0.0);
440 qq.rotatePos(pos, result);
441 assertUlpEquals(1.0, result.getXpos(), 0);
442 assertUlpEquals(1.0, result.getYpos(), 0);
443 assertUlpEquals(-1.0, result.getZpos(), 2);
445 qq.setEulerYXZ(RAD_90DEG, 0.0, 0.0);
446 qq.rotatePos(pos, result);
447 assertUlpEquals(1.0, result.getXpos(), 0);
448 assertUlpEquals(-1.0, result.getYpos(), 2);
449 assertUlpEquals(1.0, result.getZpos(), 0);
451 qq.setEulerYXZ(0.0, 0.0, RAD_90DEG);
452 qq.rotatePos(pos, result);
453 assertUlpEquals(-1.0, result.getXpos(), 2);
454 assertUlpEquals(1.0, result.getYpos(), 0);
455 assertUlpEquals(1.0, result.getZpos(), 0);
457 qq.setEulerYXZ(RAD_90DEG, RAD_90DEG, 0.0);
458 qq.rotatePos(pos, result);
459 assertUlpEquals(1.0, result.getXpos(), 2);
460 assertUlpEquals(-1.0, result.getYpos(), 1);
461 assertUlpEquals(-1.0, result.getZpos(), 1);
463 qq.setEulerYXZ(0.0, RAD_90DEG, RAD_90DEG);
464 qq.rotatePos(pos, result);
465 assertUlpEquals(1.0, result.getXpos(), 1);
466 assertUlpEquals(1.0, result.getYpos(), 1);
467 assertUlpEquals(1.0, result.getZpos(), 0);
469 qq.setEulerYXZ(RAD_90DEG, 0.0, RAD_90DEG);
470 qq.rotatePos(pos, result);
471 assertUlpEquals(-1.0, result.getXpos(), 1);
472 assertUlpEquals(-1.0, result.getYpos(), 1);
473 assertUlpEquals(1.0, result.getZpos(), 2);
475 pos = new MkPos3D(1.0, 2.0, 3.0);
477 qq.setEulerYXZ(0.0, RAD_90DEG, 0.0);
478 qq.rotatePos(pos, result);
479 assertUlpEquals(3.0, result.getXpos(), 0);
480 assertUlpEquals(2.0, result.getYpos(), 0);
481 assertUlpEquals(-1.0, result.getZpos(), 3);
483 qq.setEulerYXZ(RAD_90DEG, 0.0, 0.0);
484 qq.rotatePos(pos, result);
485 assertUlpEquals(1.0, result.getXpos(), 0);
486 assertUlpEquals(-3.0, result.getYpos(), 0);
487 assertUlpEquals(2.0, result.getZpos(), 2);
489 qq.setEulerYXZ(0.0, 0.0, RAD_90DEG);
490 qq.rotatePos(pos, result);
491 assertUlpEquals(-2.0, result.getXpos(), 0);
492 assertUlpEquals(1.0, result.getYpos(), 2);
493 assertUlpEquals(3.0, result.getZpos(), 0);
499 * Test of toString method, of class MkQuat.
502 public void testToString() {
503 System.out.println("toString");
507 qq = new MkQuat(-0.0, Double.MIN_NORMAL, Double.MAX_EXPONENT, StrictMath.PI);
508 assertEquals("q1=-0.0 q2=2.2250738585072014E-308 q3=1023.0 w=3.141592653589793", qq.toString());