@pawells/math-extended 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/package.json +1 -1
  2. package/build/angles.spec.d.ts +0 -2
  3. package/build/angles.spec.d.ts.map +0 -1
  4. package/build/angles.spec.js +0 -147
  5. package/build/angles.spec.js.map +0 -1
  6. package/build/clamp.spec.d.ts +0 -2
  7. package/build/clamp.spec.d.ts.map +0 -1
  8. package/build/clamp.spec.js +0 -19
  9. package/build/clamp.spec.js.map +0 -1
  10. package/build/documentation-validation.spec.d.ts +0 -11
  11. package/build/documentation-validation.spec.d.ts.map +0 -1
  12. package/build/documentation-validation.spec.js +0 -401
  13. package/build/documentation-validation.spec.js.map +0 -1
  14. package/build/interpolation.spec.d.ts +0 -2
  15. package/build/interpolation.spec.d.ts.map +0 -1
  16. package/build/interpolation.spec.js +0 -480
  17. package/build/interpolation.spec.js.map +0 -1
  18. package/build/matrices/arithmetic.spec.d.ts +0 -2
  19. package/build/matrices/arithmetic.spec.d.ts.map +0 -1
  20. package/build/matrices/arithmetic.spec.js +0 -915
  21. package/build/matrices/arithmetic.spec.js.map +0 -1
  22. package/build/matrices/asserts.spec.d.ts +0 -2
  23. package/build/matrices/asserts.spec.d.ts.map +0 -1
  24. package/build/matrices/asserts.spec.js +0 -565
  25. package/build/matrices/asserts.spec.js.map +0 -1
  26. package/build/matrices/core.spec.d.ts +0 -2
  27. package/build/matrices/core.spec.d.ts.map +0 -1
  28. package/build/matrices/core.spec.js +0 -634
  29. package/build/matrices/core.spec.js.map +0 -1
  30. package/build/matrices/decompositions.spec.d.ts +0 -2
  31. package/build/matrices/decompositions.spec.d.ts.map +0 -1
  32. package/build/matrices/decompositions.spec.js +0 -195
  33. package/build/matrices/decompositions.spec.js.map +0 -1
  34. package/build/matrices/linear-algebra.spec.d.ts +0 -2
  35. package/build/matrices/linear-algebra.spec.d.ts.map +0 -1
  36. package/build/matrices/linear-algebra.spec.js +0 -355
  37. package/build/matrices/linear-algebra.spec.js.map +0 -1
  38. package/build/matrices/normalization.spec.d.ts +0 -2
  39. package/build/matrices/normalization.spec.d.ts.map +0 -1
  40. package/build/matrices/normalization.spec.js +0 -335
  41. package/build/matrices/normalization.spec.js.map +0 -1
  42. package/build/matrices/transformations.spec.d.ts +0 -2
  43. package/build/matrices/transformations.spec.d.ts.map +0 -1
  44. package/build/matrices/transformations.spec.js +0 -755
  45. package/build/matrices/transformations.spec.js.map +0 -1
  46. package/build/quaternions/asserts.spec.d.ts +0 -2
  47. package/build/quaternions/asserts.spec.d.ts.map +0 -1
  48. package/build/quaternions/asserts.spec.js +0 -320
  49. package/build/quaternions/asserts.spec.js.map +0 -1
  50. package/build/quaternions/conversions.spec.d.ts +0 -2
  51. package/build/quaternions/conversions.spec.d.ts.map +0 -1
  52. package/build/quaternions/conversions.spec.js +0 -344
  53. package/build/quaternions/conversions.spec.js.map +0 -1
  54. package/build/quaternions/core.spec.d.ts +0 -2
  55. package/build/quaternions/core.spec.d.ts.map +0 -1
  56. package/build/quaternions/core.spec.js +0 -294
  57. package/build/quaternions/core.spec.js.map +0 -1
  58. package/build/quaternions/interpolation.spec.d.ts +0 -2
  59. package/build/quaternions/interpolation.spec.d.ts.map +0 -1
  60. package/build/quaternions/interpolation.spec.js +0 -64
  61. package/build/quaternions/interpolation.spec.js.map +0 -1
  62. package/build/quaternions/predefined.spec.d.ts +0 -2
  63. package/build/quaternions/predefined.spec.d.ts.map +0 -1
  64. package/build/quaternions/predefined.spec.js +0 -35
  65. package/build/quaternions/predefined.spec.js.map +0 -1
  66. package/build/random.spec.d.ts +0 -2
  67. package/build/random.spec.d.ts.map +0 -1
  68. package/build/random.spec.js +0 -267
  69. package/build/random.spec.js.map +0 -1
  70. package/build/vectors/asserts.spec.d.ts +0 -2
  71. package/build/vectors/asserts.spec.d.ts.map +0 -1
  72. package/build/vectors/asserts.spec.js +0 -260
  73. package/build/vectors/asserts.spec.js.map +0 -1
  74. package/build/vectors/core.spec.d.ts +0 -2
  75. package/build/vectors/core.spec.d.ts.map +0 -1
  76. package/build/vectors/core.spec.js +0 -343
  77. package/build/vectors/core.spec.js.map +0 -1
  78. package/build/vectors/interpolation.spec.d.ts +0 -2
  79. package/build/vectors/interpolation.spec.d.ts.map +0 -1
  80. package/build/vectors/interpolation.spec.js +0 -378
  81. package/build/vectors/interpolation.spec.js.map +0 -1
  82. package/build/vectors/predefined.spec.d.ts +0 -2
  83. package/build/vectors/predefined.spec.d.ts.map +0 -1
  84. package/build/vectors/predefined.spec.js +0 -333
  85. package/build/vectors/predefined.spec.js.map +0 -1
@@ -1,294 +0,0 @@
1
- import { QuaternionIdentity, QuaternionClone, QuaternionEquals, QuaternionMagnitude, QuaternionNormalize, QuaternionConjugate, QuaternionInverse, QuaternionMultiply, QuaternionFromAxisAngle, QuaternionFromAxisAngleVector, QuaternionToAxisAngle, QuaternionFromEuler, QuaternionToEuler, QuaternionRotateVector, QuaternionSLERP } from './core.js';
2
- import { QuaternionError } from './asserts.js';
3
- describe('Quaternion Core Functions', () => {
4
- describe('QuaternionIdentity', () => {
5
- test('should return identity quaternion', () => {
6
- const identity = QuaternionIdentity();
7
- expect(identity).toEqual([0, 0, 0, 1]);
8
- });
9
- });
10
- describe('QuaternionClone', () => {
11
- test('should create a deep copy of quaternion', () => {
12
- const original = [1, 2, 3, 4];
13
- const cloned = QuaternionClone(original);
14
- expect(cloned).toEqual(original);
15
- expect(cloned).not.toBe(original);
16
- // Verify independence
17
- cloned[0] = 999;
18
- expect(original[0]).toBe(1);
19
- });
20
- test('should throw for invalid quaternion', () => {
21
- expect(() => QuaternionClone([1, 2, 3])).toThrow(QuaternionError);
22
- });
23
- });
24
- describe('QuaternionEquals', () => {
25
- test('should return true for identical quaternions', () => {
26
- const q1 = [0, 0, 0, 1];
27
- const q2 = [0, 0, 0, 1];
28
- expect(QuaternionEquals(q1, q2)).toBe(true);
29
- });
30
- test('should return false for different quaternions', () => {
31
- const q1 = [0, 0, 0, 1];
32
- const q2 = [1, 0, 0, 0];
33
- expect(QuaternionEquals(q1, q2)).toBe(false);
34
- });
35
- test('should handle tolerance', () => {
36
- const q1 = [0.000001, 0, 0, 1];
37
- const q2 = [0, 0, 0, 1];
38
- expect(QuaternionEquals(q1, q2, 1e-7)).toBe(false);
39
- expect(QuaternionEquals(q1, q2, 1e-5)).toBe(true);
40
- });
41
- test('should detect equivalent rotations when checkEquivalence is true', () => {
42
- const q1 = [0, 0, 0, 1];
43
- const q2 = [0, 0, 0, -1]; // Same rotation, opposite quaternion
44
- expect(QuaternionEquals(q1, q2, 1e-6, false)).toBe(false);
45
- expect(QuaternionEquals(q1, q2, 1e-6, true)).toBe(true);
46
- });
47
- });
48
- describe('QuaternionMagnitude', () => {
49
- test('should calculate magnitude correctly', () => {
50
- const q = [1, 2, 2, 0];
51
- const magnitude = QuaternionMagnitude(q);
52
- expect(magnitude).toBeCloseTo(3, 6);
53
- });
54
- test('should return 1 for unit quaternions', () => {
55
- const q = [0, 0, 0, 1];
56
- expect(QuaternionMagnitude(q)).toBeCloseTo(1, 6);
57
- });
58
- });
59
- describe('QuaternionNormalize', () => {
60
- test('should normalize quaternion to unit length', () => {
61
- const q = [1, 1, 1, 1];
62
- const normalized = QuaternionNormalize(q);
63
- expect(QuaternionMagnitude(normalized)).toBeCloseTo(1, 6);
64
- });
65
- test('should preserve identity quaternion', () => {
66
- const identity = QuaternionIdentity();
67
- const normalized = QuaternionNormalize(identity);
68
- expect(normalized).toEqual(identity);
69
- });
70
- });
71
- describe('QuaternionConjugate', () => {
72
- test('should negate x, y, z components', () => {
73
- const q = [1, 2, 3, 4];
74
- const conjugate = QuaternionConjugate(q);
75
- expect(conjugate).toEqual([-1, -2, -3, 4]);
76
- });
77
- test('should preserve identity quaternion', () => {
78
- const identity = QuaternionIdentity();
79
- const conjugate = QuaternionConjugate(identity);
80
- // Check values are effectively zero (handles -0 vs 0)
81
- expect(Math.abs(conjugate[0])).toBeCloseTo(0, 6);
82
- expect(Math.abs(conjugate[1])).toBeCloseTo(0, 6);
83
- expect(Math.abs(conjugate[2])).toBeCloseTo(0, 6);
84
- expect(conjugate[3]).toBe(1);
85
- });
86
- });
87
- describe('QuaternionInverse', () => {
88
- test('should calculate inverse correctly for unit quaternion', () => {
89
- const q = [0, 0, 0.7071067811865476, 0.7071067811865476]; // 90° around Z (properly normalized)
90
- const inverse = QuaternionInverse(q);
91
- const conjugate = QuaternionConjugate(q);
92
- // For unit quaternions, inverse equals conjugate
93
- expect(inverse[0]).toBeCloseTo(conjugate[0], 6);
94
- expect(inverse[1]).toBeCloseTo(conjugate[1], 6);
95
- expect(inverse[2]).toBeCloseTo(conjugate[2], 6);
96
- expect(inverse[3]).toBeCloseTo(conjugate[3], 6);
97
- });
98
- test('should satisfy q * q^-1 = identity', () => {
99
- const q = [0.5, 0.5, 0.5, 0.5];
100
- const inverse = QuaternionInverse(q);
101
- const product = QuaternionMultiply(q, inverse);
102
- const identity = QuaternionIdentity();
103
- expect(product[0]).toBeCloseTo(identity[0], 6);
104
- expect(product[1]).toBeCloseTo(identity[1], 6);
105
- expect(product[2]).toBeCloseTo(identity[2], 6);
106
- expect(product[3]).toBeCloseTo(identity[3], 6);
107
- });
108
- test('should throw for zero quaternion', () => {
109
- const zero = [0, 0, 0, 0];
110
- expect(() => QuaternionInverse(zero)).toThrow();
111
- });
112
- });
113
- describe('QuaternionMultiply', () => {
114
- test('should multiply quaternions correctly', () => {
115
- const q1 = [0, 0, 0, 1]; // Identity
116
- const q2 = [1, 0, 0, 0]; // 180° around X
117
- const product = QuaternionMultiply(q1, q2);
118
- expect(product).toEqual([1, 0, 0, 0]);
119
- });
120
- test('should be non-commutative', () => {
121
- const q1 = [0.7071067811865476, 0, 0, 0.7071067811865476]; // 90° around X
122
- const q2 = [0, 0.7071067811865476, 0, 0.7071067811865476]; // 90° around Y
123
- const product1 = QuaternionMultiply(q1, q2);
124
- const product2 = QuaternionMultiply(q2, q1);
125
- expect(QuaternionEquals(product1, product2)).toBe(false);
126
- });
127
- test('should preserve magnitude for unit quaternions', () => {
128
- const q1 = QuaternionNormalize([1, 1, 0, 1]);
129
- const q2 = QuaternionNormalize([0, 1, 1, 1]);
130
- const product = QuaternionMultiply(q1, q2);
131
- expect(QuaternionMagnitude(product)).toBeCloseTo(1, 6);
132
- });
133
- });
134
- describe('QuaternionFromAxisAngle', () => {
135
- test('should create quaternion from axis-angle', () => {
136
- const axis = [0, 0, 1]; // Z-axis
137
- const angle = Math.PI / 2; // 90 degrees
138
- const q = QuaternionFromAxisAngle(axis, angle);
139
- expect(q[0]).toBeCloseTo(0, 6);
140
- expect(q[1]).toBeCloseTo(0, 6);
141
- expect(q[2]).toBeCloseTo(0.7071067811865476, 6);
142
- expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
143
- });
144
- test('should handle zero angle', () => {
145
- const axis = [1, 0, 0];
146
- const angle = 0;
147
- const q = QuaternionFromAxisAngle(axis, angle);
148
- expect(q).toEqual([0, 0, 0, 1]); // Identity
149
- });
150
- test('should normalize axis automatically', () => {
151
- const unnormalizedAxis = [2, 0, 0]; // Will be normalized to [1, 0, 0]
152
- const angle = Math.PI;
153
- const q = QuaternionFromAxisAngle(unnormalizedAxis, angle);
154
- expect(q[0]).toBeCloseTo(1, 6);
155
- expect(q[1]).toBeCloseTo(0, 6);
156
- expect(q[2]).toBeCloseTo(0, 6);
157
- expect(q[3]).toBeCloseTo(0, 6);
158
- });
159
- });
160
- describe('QuaternionFromAxisAngleVector', () => {
161
- test('should create quaternion from 4-component axis-angle', () => {
162
- const axisAngle = [0, 0, 1, Math.PI / 2]; // 90° around Z
163
- const q = QuaternionFromAxisAngleVector(axisAngle);
164
- expect(q[0]).toBeCloseTo(0, 6);
165
- expect(q[1]).toBeCloseTo(0, 6);
166
- expect(q[2]).toBeCloseTo(0.7071067811865476, 6);
167
- expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
168
- });
169
- });
170
- describe('QuaternionToAxisAngle', () => {
171
- test('should convert quaternion to axis-angle', () => {
172
- const q = [0, 0, 0.7071067811865476, 0.7071067811865476]; // 90° around Z (properly normalized)
173
- const axisAngle = QuaternionToAxisAngle(q);
174
- expect(axisAngle[0]).toBeCloseTo(0, 6);
175
- expect(axisAngle[1]).toBeCloseTo(0, 6);
176
- expect(axisAngle[2]).toBeCloseTo(1, 6);
177
- expect(axisAngle[3]).toBeCloseTo(Math.PI / 2, 6);
178
- });
179
- test('should handle identity quaternion', () => {
180
- const identity = QuaternionIdentity();
181
- const axisAngle = QuaternionToAxisAngle(identity);
182
- expect(axisAngle[3]).toBeCloseTo(0, 6); // Zero angle
183
- });
184
- });
185
- describe('QuaternionFromEuler', () => {
186
- test('should create quaternion from Euler angles', () => {
187
- const euler = [0, Math.PI / 2, 0]; // 90° pitch
188
- const q = QuaternionFromEuler(euler);
189
- // Should be roughly [0, sin(45°), 0, cos(45°)]
190
- expect(q[0]).toBeCloseTo(0, 6);
191
- expect(q[1]).toBeCloseTo(0.7071067811865476, 6);
192
- expect(q[2]).toBeCloseTo(0, 6);
193
- expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
194
- });
195
- test('should handle zero angles', () => {
196
- const euler = [0, 0, 0];
197
- const q = QuaternionFromEuler(euler);
198
- expect(q).toEqual([0, 0, 0, 1]); // Identity
199
- });
200
- });
201
- describe('QuaternionToEuler', () => {
202
- test('should convert quaternion to Euler angles', () => {
203
- const q = [0, 0.7071067811865476, 0, 0.7071067811865476]; // 90° around Y (properly normalized)
204
- const euler = QuaternionToEuler(q);
205
- // Note: Due to Euler angle ambiguity, multiple representations are valid
206
- // The key is that converting back should give the same rotation
207
- const backToQuaternion = QuaternionFromEuler(euler);
208
- // Test that rotating a vector gives the same result
209
- const testVector = [1, 0, 0];
210
- const rotated1 = QuaternionRotateVector(q, testVector);
211
- const rotated2 = QuaternionRotateVector(backToQuaternion, testVector);
212
- expect(rotated1[0]).toBeCloseTo(rotated2[0], 6);
213
- expect(rotated1[1]).toBeCloseTo(rotated2[1], 6);
214
- expect(rotated1[2]).toBeCloseTo(rotated2[2], 6);
215
- });
216
- test('should handle identity quaternion', () => {
217
- const identity = QuaternionIdentity();
218
- const euler = QuaternionToEuler(identity);
219
- expect(euler).toEqual([0, 0, 0]);
220
- });
221
- });
222
- describe('QuaternionRotateVector', () => {
223
- test('should rotate vector correctly', () => {
224
- const q = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2); // 90° around Z
225
- const vector = [1, 0, 0]; // Point along X-axis
226
- const rotated = QuaternionRotateVector(q, vector);
227
- // Should point along Y-axis after 90° Z rotation
228
- expect(rotated[0]).toBeCloseTo(0, 6);
229
- expect(rotated[1]).toBeCloseTo(1, 6);
230
- expect(rotated[2]).toBeCloseTo(0, 6);
231
- });
232
- test('should preserve vector length', () => {
233
- const q = QuaternionFromAxisAngle([1, 1, 1], Math.PI / 3); // 60° around diagonal
234
- const vector = [3, 4, 5];
235
- const rotated = QuaternionRotateVector(q, vector);
236
- const originalLength = Math.sqrt((3 * 3) + (4 * 4) + (5 * 5));
237
- const rotatedLength = Math.sqrt((rotated[0] * rotated[0]) + (rotated[1] * rotated[1]) + (rotated[2] * rotated[2]));
238
- expect(rotatedLength).toBeCloseTo(originalLength, 6);
239
- });
240
- test('should not change vector with identity quaternion', () => {
241
- const identity = QuaternionIdentity();
242
- const vector = [1, 2, 3];
243
- const rotated = QuaternionRotateVector(identity, vector);
244
- expect(rotated).toEqual(vector);
245
- });
246
- });
247
- describe('QuaternionSLERP', () => {
248
- test('should interpolate between quaternions', () => {
249
- const q1 = QuaternionIdentity();
250
- const q2 = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2); // 90° around Z
251
- const halfway = QuaternionSLERP(q1, q2, 0.5);
252
- // Should be roughly 45° rotation
253
- expect(QuaternionMagnitude(halfway)).toBeCloseTo(1, 6);
254
- expect(halfway[2]).toBeCloseTo(Math.sin(Math.PI / 8), 6); // sin(45°/2)
255
- expect(halfway[3]).toBeCloseTo(Math.cos(Math.PI / 8), 6); // cos(45°/2)
256
- });
257
- test('should return start quaternion at t=0', () => {
258
- const q1 = [1, 0, 0, 0];
259
- const q2 = [0, 1, 0, 0];
260
- const result = QuaternionSLERP(q1, q2, 0);
261
- expect(result[0]).toBeCloseTo(q1[0], 6);
262
- expect(result[1]).toBeCloseTo(q1[1], 6);
263
- expect(result[2]).toBeCloseTo(q1[2], 6);
264
- expect(result[3]).toBeCloseTo(q1[3], 6);
265
- });
266
- test('should return end quaternion at t=1', () => {
267
- const q1 = [1, 0, 0, 0];
268
- const q2 = [0, 1, 0, 0];
269
- const result = QuaternionSLERP(q1, q2, 1);
270
- expect(result[0]).toBeCloseTo(q2[0], 6);
271
- expect(result[1]).toBeCloseTo(q2[1], 6);
272
- expect(result[2]).toBeCloseTo(q2[2], 6);
273
- expect(result[3]).toBeCloseTo(q2[3], 6);
274
- });
275
- test('should handle very close quaternions', () => {
276
- const q1 = [0, 0, 0, 1];
277
- const q2 = [0.0001, 0, 0, 0.99999999];
278
- const normalized = QuaternionNormalize(q2);
279
- const result = QuaternionSLERP(q1, normalized, 0.5);
280
- expect(QuaternionMagnitude(result)).toBeCloseTo(1, 6);
281
- });
282
- test('should clamp t to [0, 1] range', () => {
283
- const q1 = QuaternionIdentity();
284
- const q2 = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2);
285
- const resultBelow = QuaternionSLERP(q1, q2, -0.5);
286
- const resultAt0 = QuaternionSLERP(q1, q2, 0);
287
- expect(QuaternionEquals(resultBelow, resultAt0)).toBe(true);
288
- const resultAbove = QuaternionSLERP(q1, q2, 1.5);
289
- const resultAt1 = QuaternionSLERP(q1, q2, 1);
290
- expect(QuaternionEquals(resultAbove, resultAt1)).toBe(true);
291
- });
292
- });
293
- });
294
- //# sourceMappingURL=core.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.spec.js","sourceRoot":"","sources":["../../src/quaternions/core.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=interpolation.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpolation.spec.d.ts","sourceRoot":"","sources":["../../src/quaternions/interpolation.spec.ts"],"names":[],"mappings":""}
@@ -1,64 +0,0 @@
1
- import { QuaternionNLERP, QuaternionSQUAD, QuaternionCreatePath } from './interpolation.js';
2
- import { QuaternionIdentity, QuaternionFromAxisAngle, QuaternionEquals } from './core.js';
3
- const TOLERANCE = 1e-6;
4
- describe('Quaternion Interpolation', () => {
5
- test('QuaternionNLERP: returns start and end for t=0 and t=1', () => {
6
- const a = QuaternionIdentity();
7
- const b = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2);
8
- expect(QuaternionEquals(QuaternionNLERP(a, b, 0), a, TOLERANCE, true)).toBe(true);
9
- expect(QuaternionEquals(QuaternionNLERP(a, b, 1), b, TOLERANCE, true)).toBe(true);
10
- });
11
- test('QuaternionNLERP: interpolates halfway', () => {
12
- const a = QuaternionIdentity();
13
- const b = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2);
14
- const result = QuaternionNLERP(a, b, 0.5);
15
- // Should be normalized and between a and b
16
- expect(Math.abs(result[3])).toBeLessThan(1);
17
- expect(Math.abs(result[3])).toBeGreaterThan(0.7);
18
- });
19
- test('QuaternionNLERP: handles double-cover (q and -q)', () => {
20
- const a = QuaternionIdentity();
21
- const b = [0, 0, 0, -1];
22
- const result = QuaternionNLERP(a, b, 0.5);
23
- // Should interpolate along the shortest path (equivalent to a)
24
- expect(QuaternionEquals(result, a, TOLERANCE, true)).toBe(true);
25
- });
26
- test('QuaternionSQUAD: smooth interpolation between four quaternions', () => {
27
- const q0 = QuaternionFromAxisAngle([1, 0, 0], 0);
28
- const q1 = QuaternionFromAxisAngle([1, 0, 0], Math.PI / 4);
29
- const q2 = QuaternionFromAxisAngle([1, 0, 0], Math.PI / 2);
30
- const q3 = QuaternionFromAxisAngle([1, 0, 0], (3 * Math.PI) / 4);
31
- const result = QuaternionSQUAD(q0, q1, q2, q3, 0.5);
32
- // Should be between q1 and q2
33
- expect(result[3]).toBeLessThan(q1[3]);
34
- expect(result[3]).toBeGreaterThan(q2[3]);
35
- });
36
- test('QuaternionCreatePath: slerp path returns endpoints for t=0 and t=1', () => {
37
- const q1 = QuaternionIdentity();
38
- const q2 = QuaternionFromAxisAngle([0, 1, 0], Math.PI / 2);
39
- const path = [q1, q2];
40
- const interp = QuaternionCreatePath(path, 'slerp');
41
- expect(QuaternionEquals(interp(0), q1, TOLERANCE, true)).toBe(true);
42
- expect(QuaternionEquals(interp(1), q2, TOLERANCE, true)).toBe(true);
43
- });
44
- test('QuaternionCreatePath: nlerp and squad produce valid quaternions', () => {
45
- const q1 = QuaternionIdentity();
46
- const q2 = QuaternionFromAxisAngle([0, 1, 0], Math.PI / 2);
47
- const q3 = QuaternionFromAxisAngle([0, 1, 0], Math.PI);
48
- const path = [q1, q2, q3];
49
- const nlerpInterp = QuaternionCreatePath(path, 'nlerp');
50
- const squadInterp = QuaternionCreatePath(path, 'squad');
51
- const nlerpResult = nlerpInterp(0.5);
52
- const squadResult = squadInterp(0.5);
53
- // Should be normalized
54
- const nlerpMag = Math.sqrt(nlerpResult.reduce((s, v) => s + (v * v), 0));
55
- const squadMag = Math.sqrt(squadResult.reduce((s, v) => s + (v * v), 0));
56
- expect(Math.abs(nlerpMag - 1)).toBeLessThan(TOLERANCE);
57
- expect(Math.abs(squadMag - 1)).toBeLessThan(TOLERANCE);
58
- });
59
- test('QuaternionCreatePath: throws for <2 quaternions', () => {
60
- expect(() => QuaternionCreatePath([], 'slerp')).toThrow();
61
- expect(() => QuaternionCreatePath([[0, 0, 0, 1]], 'slerp')).toThrow();
62
- });
63
- });
64
- //# sourceMappingURL=interpolation.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpolation.spec.js","sourceRoot":"","sources":["../../src/quaternions/interpolation.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=predefined.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"predefined.spec.d.ts","sourceRoot":"","sources":["../../src/quaternions/predefined.spec.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { QuaternionRotationX, QuaternionRotationY, QuaternionRotationZ, } from './predefined.js';
2
- import { QuaternionIdentity, QuaternionEquals, QuaternionFromAxisAngle } from './core.js';
3
- const TOLERANCE = 1e-6;
4
- describe('Predefined Quaternions', () => {
5
- test('QuaternionIdentity returns [0,0,0,1]', () => {
6
- expect(QuaternionIdentity()).toEqual([0, 0, 0, 1]);
7
- expect(QuaternionEquals(QuaternionIdentity(), QuaternionIdentity(), TOLERANCE, true)).toBe(true);
8
- });
9
- test('QuaternionRotationX returns correct quaternion for 90°', () => {
10
- const angle = Math.PI / 2;
11
- const expected = QuaternionFromAxisAngle([1, 0, 0], angle);
12
- expect(QuaternionEquals(QuaternionRotationX(angle), expected, TOLERANCE, true)).toBe(true);
13
- });
14
- test('QuaternionRotationY returns correct quaternion for 90°', () => {
15
- const angle = Math.PI / 2;
16
- const expected = QuaternionFromAxisAngle([0, 1, 0], angle);
17
- expect(QuaternionEquals(QuaternionRotationY(angle), expected, TOLERANCE, true)).toBe(true);
18
- });
19
- test('QuaternionRotationZ returns correct quaternion for 90°', () => {
20
- const angle = Math.PI / 2;
21
- const expected = QuaternionFromAxisAngle([0, 0, 1], angle);
22
- expect(QuaternionEquals(QuaternionRotationZ(angle), expected, TOLERANCE, true)).toBe(true);
23
- });
24
- test('QuaternionRotationX/Y/Z are normalized', () => {
25
- const angle = Math.PI / 3;
26
- const qx = QuaternionRotationX(angle);
27
- const qy = QuaternionRotationY(angle);
28
- const qz = QuaternionRotationZ(angle);
29
- const mag = (q) => Math.sqrt(q.reduce((s, v) => s + (v * v), 0));
30
- expect(Math.abs(mag(qx) - 1)).toBeLessThan(TOLERANCE);
31
- expect(Math.abs(mag(qy) - 1)).toBeLessThan(TOLERANCE);
32
- expect(Math.abs(mag(qz) - 1)).toBeLessThan(TOLERANCE);
33
- });
34
- });
35
- //# sourceMappingURL=predefined.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"predefined.spec.js","sourceRoot":"","sources":["../../src/quaternions/predefined.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=random.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random.spec.d.ts","sourceRoot":"","sources":["../src/random.spec.ts"],"names":[],"mappings":""}