@pawells/math-extended 1.0.1

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/build/angles.d.ts +31 -0
  4. package/build/angles.d.ts.map +1 -0
  5. package/build/angles.js +85 -0
  6. package/build/angles.js.map +1 -0
  7. package/build/angles.spec.d.ts +2 -0
  8. package/build/angles.spec.d.ts.map +1 -0
  9. package/build/angles.spec.js +147 -0
  10. package/build/angles.spec.js.map +1 -0
  11. package/build/clamp.d.ts +17 -0
  12. package/build/clamp.d.ts.map +1 -0
  13. package/build/clamp.js +19 -0
  14. package/build/clamp.js.map +1 -0
  15. package/build/clamp.spec.d.ts +2 -0
  16. package/build/clamp.spec.d.ts.map +1 -0
  17. package/build/clamp.spec.js +19 -0
  18. package/build/clamp.spec.js.map +1 -0
  19. package/build/documentation-validation.spec.d.ts +11 -0
  20. package/build/documentation-validation.spec.d.ts.map +1 -0
  21. package/build/documentation-validation.spec.js +401 -0
  22. package/build/documentation-validation.spec.js.map +1 -0
  23. package/build/index.d.ts +8 -0
  24. package/build/index.d.ts.map +1 -0
  25. package/build/index.js +8 -0
  26. package/build/index.js.map +1 -0
  27. package/build/interpolation.d.ts +175 -0
  28. package/build/interpolation.d.ts.map +1 -0
  29. package/build/interpolation.js +369 -0
  30. package/build/interpolation.js.map +1 -0
  31. package/build/interpolation.spec.d.ts +2 -0
  32. package/build/interpolation.spec.d.ts.map +1 -0
  33. package/build/interpolation.spec.js +480 -0
  34. package/build/interpolation.spec.js.map +1 -0
  35. package/build/matrices/arithmetic.d.ts +411 -0
  36. package/build/matrices/arithmetic.d.ts.map +1 -0
  37. package/build/matrices/arithmetic.js +954 -0
  38. package/build/matrices/arithmetic.js.map +1 -0
  39. package/build/matrices/arithmetic.spec.d.ts +2 -0
  40. package/build/matrices/arithmetic.spec.d.ts.map +1 -0
  41. package/build/matrices/arithmetic.spec.js +915 -0
  42. package/build/matrices/arithmetic.spec.js.map +1 -0
  43. package/build/matrices/asserts.d.ts +306 -0
  44. package/build/matrices/asserts.d.ts.map +1 -0
  45. package/build/matrices/asserts.js +396 -0
  46. package/build/matrices/asserts.js.map +1 -0
  47. package/build/matrices/asserts.spec.d.ts +2 -0
  48. package/build/matrices/asserts.spec.d.ts.map +1 -0
  49. package/build/matrices/asserts.spec.js +565 -0
  50. package/build/matrices/asserts.spec.js.map +1 -0
  51. package/build/matrices/core.d.ts +168 -0
  52. package/build/matrices/core.d.ts.map +1 -0
  53. package/build/matrices/core.js +457 -0
  54. package/build/matrices/core.js.map +1 -0
  55. package/build/matrices/core.spec.d.ts +2 -0
  56. package/build/matrices/core.spec.d.ts.map +1 -0
  57. package/build/matrices/core.spec.js +634 -0
  58. package/build/matrices/core.spec.js.map +1 -0
  59. package/build/matrices/decompositions.d.ts +326 -0
  60. package/build/matrices/decompositions.d.ts.map +1 -0
  61. package/build/matrices/decompositions.js +816 -0
  62. package/build/matrices/decompositions.js.map +1 -0
  63. package/build/matrices/decompositions.spec.d.ts +2 -0
  64. package/build/matrices/decompositions.spec.d.ts.map +1 -0
  65. package/build/matrices/decompositions.spec.js +195 -0
  66. package/build/matrices/decompositions.spec.js.map +1 -0
  67. package/build/matrices/index.d.ts +9 -0
  68. package/build/matrices/index.d.ts.map +1 -0
  69. package/build/matrices/index.js +9 -0
  70. package/build/matrices/index.js.map +1 -0
  71. package/build/matrices/linear-algebra.d.ts +64 -0
  72. package/build/matrices/linear-algebra.d.ts.map +1 -0
  73. package/build/matrices/linear-algebra.js +253 -0
  74. package/build/matrices/linear-algebra.js.map +1 -0
  75. package/build/matrices/linear-algebra.spec.d.ts +2 -0
  76. package/build/matrices/linear-algebra.spec.d.ts.map +1 -0
  77. package/build/matrices/linear-algebra.spec.js +355 -0
  78. package/build/matrices/linear-algebra.spec.js.map +1 -0
  79. package/build/matrices/normalization.d.ts +62 -0
  80. package/build/matrices/normalization.d.ts.map +1 -0
  81. package/build/matrices/normalization.js +167 -0
  82. package/build/matrices/normalization.js.map +1 -0
  83. package/build/matrices/normalization.spec.d.ts +2 -0
  84. package/build/matrices/normalization.spec.d.ts.map +1 -0
  85. package/build/matrices/normalization.spec.js +335 -0
  86. package/build/matrices/normalization.spec.js.map +1 -0
  87. package/build/matrices/transformations.d.ts +484 -0
  88. package/build/matrices/transformations.d.ts.map +1 -0
  89. package/build/matrices/transformations.js +592 -0
  90. package/build/matrices/transformations.js.map +1 -0
  91. package/build/matrices/transformations.spec.d.ts +2 -0
  92. package/build/matrices/transformations.spec.d.ts.map +1 -0
  93. package/build/matrices/transformations.spec.js +755 -0
  94. package/build/matrices/transformations.spec.js.map +1 -0
  95. package/build/matrices/types.d.ts +134 -0
  96. package/build/matrices/types.d.ts.map +1 -0
  97. package/build/matrices/types.js +6 -0
  98. package/build/matrices/types.js.map +1 -0
  99. package/build/quaternions/asserts.d.ts +77 -0
  100. package/build/quaternions/asserts.d.ts.map +1 -0
  101. package/build/quaternions/asserts.js +175 -0
  102. package/build/quaternions/asserts.js.map +1 -0
  103. package/build/quaternions/asserts.spec.d.ts +2 -0
  104. package/build/quaternions/asserts.spec.d.ts.map +1 -0
  105. package/build/quaternions/asserts.spec.js +320 -0
  106. package/build/quaternions/asserts.spec.js.map +1 -0
  107. package/build/quaternions/conversions.d.ts +73 -0
  108. package/build/quaternions/conversions.d.ts.map +1 -0
  109. package/build/quaternions/conversions.js +179 -0
  110. package/build/quaternions/conversions.js.map +1 -0
  111. package/build/quaternions/conversions.spec.d.ts +2 -0
  112. package/build/quaternions/conversions.spec.d.ts.map +1 -0
  113. package/build/quaternions/conversions.spec.js +344 -0
  114. package/build/quaternions/conversions.spec.js.map +1 -0
  115. package/build/quaternions/core.d.ts +203 -0
  116. package/build/quaternions/core.d.ts.map +1 -0
  117. package/build/quaternions/core.js +374 -0
  118. package/build/quaternions/core.js.map +1 -0
  119. package/build/quaternions/core.spec.d.ts +2 -0
  120. package/build/quaternions/core.spec.d.ts.map +1 -0
  121. package/build/quaternions/core.spec.js +294 -0
  122. package/build/quaternions/core.spec.js.map +1 -0
  123. package/build/quaternions/index.d.ts +7 -0
  124. package/build/quaternions/index.d.ts.map +1 -0
  125. package/build/quaternions/index.js +7 -0
  126. package/build/quaternions/index.js.map +1 -0
  127. package/build/quaternions/interpolation.d.ts +54 -0
  128. package/build/quaternions/interpolation.d.ts.map +1 -0
  129. package/build/quaternions/interpolation.js +201 -0
  130. package/build/quaternions/interpolation.js.map +1 -0
  131. package/build/quaternions/interpolation.spec.d.ts +2 -0
  132. package/build/quaternions/interpolation.spec.d.ts.map +1 -0
  133. package/build/quaternions/interpolation.spec.js +64 -0
  134. package/build/quaternions/interpolation.spec.js.map +1 -0
  135. package/build/quaternions/predefined.d.ts +36 -0
  136. package/build/quaternions/predefined.d.ts.map +1 -0
  137. package/build/quaternions/predefined.js +42 -0
  138. package/build/quaternions/predefined.js.map +1 -0
  139. package/build/quaternions/predefined.spec.d.ts +2 -0
  140. package/build/quaternions/predefined.spec.d.ts.map +1 -0
  141. package/build/quaternions/predefined.spec.js +35 -0
  142. package/build/quaternions/predefined.spec.js.map +1 -0
  143. package/build/quaternions/types.d.ts +55 -0
  144. package/build/quaternions/types.d.ts.map +1 -0
  145. package/build/quaternions/types.js +7 -0
  146. package/build/quaternions/types.js.map +1 -0
  147. package/build/random.d.ts +66 -0
  148. package/build/random.d.ts.map +1 -0
  149. package/build/random.js +115 -0
  150. package/build/random.js.map +1 -0
  151. package/build/random.spec.d.ts +2 -0
  152. package/build/random.spec.d.ts.map +1 -0
  153. package/build/random.spec.js +267 -0
  154. package/build/random.spec.js.map +1 -0
  155. package/build/vectors/asserts.d.ts +182 -0
  156. package/build/vectors/asserts.d.ts.map +1 -0
  157. package/build/vectors/asserts.js +285 -0
  158. package/build/vectors/asserts.js.map +1 -0
  159. package/build/vectors/asserts.spec.d.ts +2 -0
  160. package/build/vectors/asserts.spec.d.ts.map +1 -0
  161. package/build/vectors/asserts.spec.js +260 -0
  162. package/build/vectors/asserts.spec.js.map +1 -0
  163. package/build/vectors/core.d.ts +507 -0
  164. package/build/vectors/core.d.ts.map +1 -0
  165. package/build/vectors/core.js +825 -0
  166. package/build/vectors/core.js.map +1 -0
  167. package/build/vectors/core.spec.d.ts +2 -0
  168. package/build/vectors/core.spec.d.ts.map +1 -0
  169. package/build/vectors/core.spec.js +343 -0
  170. package/build/vectors/core.spec.js.map +1 -0
  171. package/build/vectors/index.d.ts +6 -0
  172. package/build/vectors/index.d.ts.map +1 -0
  173. package/build/vectors/index.js +6 -0
  174. package/build/vectors/index.js.map +1 -0
  175. package/build/vectors/interpolation.d.ts +404 -0
  176. package/build/vectors/interpolation.d.ts.map +1 -0
  177. package/build/vectors/interpolation.js +585 -0
  178. package/build/vectors/interpolation.js.map +1 -0
  179. package/build/vectors/interpolation.spec.d.ts +2 -0
  180. package/build/vectors/interpolation.spec.d.ts.map +1 -0
  181. package/build/vectors/interpolation.spec.js +378 -0
  182. package/build/vectors/interpolation.spec.js.map +1 -0
  183. package/build/vectors/predefined.d.ts +191 -0
  184. package/build/vectors/predefined.d.ts.map +1 -0
  185. package/build/vectors/predefined.js +191 -0
  186. package/build/vectors/predefined.js.map +1 -0
  187. package/build/vectors/predefined.spec.d.ts +2 -0
  188. package/build/vectors/predefined.spec.d.ts.map +1 -0
  189. package/build/vectors/predefined.spec.js +333 -0
  190. package/build/vectors/predefined.spec.js.map +1 -0
  191. package/build/vectors/types.d.ts +62 -0
  192. package/build/vectors/types.d.ts.map +1 -0
  193. package/build/vectors/types.js +6 -0
  194. package/build/vectors/types.js.map +1 -0
  195. package/package.json +75 -0
@@ -0,0 +1,294 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.spec.js","sourceRoot":"","sources":["../../src/quaternions/core.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './asserts.js';
2
+ export * from './conversions.js';
3
+ export * from './core.js';
4
+ export * from './interpolation.js';
5
+ export * from './predefined.js';
6
+ export * from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/quaternions/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './asserts.js';
2
+ export * from './conversions.js';
3
+ export * from './core.js';
4
+ export * from './interpolation.js';
5
+ export * from './predefined.js';
6
+ export * from './types.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/quaternions/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Advanced interpolation utilities for quaternions.
3
+ * Provides specialized interpolation methods for smooth rotation animations.
4
+ */
5
+ import { TQuaternion } from './types.js';
6
+ /**
7
+ * Performs normalized linear interpolation (NLERP) between two quaternions.
8
+ * NLERP is faster than SLERP but doesn't maintain constant angular velocity.
9
+ * Good for cases where performance is more important than perfect interpolation.
10
+ *
11
+ * @param a - Start quaternion
12
+ * @param b - End quaternion
13
+ * @param t - Interpolation parameter (0 = a, 1 = b)
14
+ * @returns Interpolated and normalized quaternion
15
+ *
16
+ * @example
17
+ * const q1 = [0, 0, 0, 1];
18
+ * const q2 = [0, 0, 0.707, 0.707];
19
+ * const interpolated = QuaternionNLERP(q1, q2, 0.5);
20
+ */
21
+ export declare function QuaternionNLERP(a: TQuaternion, b: TQuaternion, t: number): TQuaternion;
22
+ /**
23
+ * Performs spherical quadrangle interpolation (SQUAD) for smooth interpolation
24
+ * through multiple quaternions. This is useful for creating smooth animation paths.
25
+ *
26
+ * @param q0 - Previous quaternion (for tangent calculation)
27
+ * @param q1 - Start quaternion
28
+ * @param q2 - End quaternion
29
+ * @param q3 - Next quaternion (for tangent calculation)
30
+ * @param t - Interpolation parameter (0 = q1, 1 = q2)
31
+ * @returns Smoothly interpolated quaternion
32
+ *
33
+ * @example
34
+ * // Create a smooth path through multiple rotations
35
+ * const path = [q0, q1, q2, q3]; // Array of quaternions
36
+ * const smooth = QuaternionSQUAD(path[0], path[1], path[2], path[3], 0.5);
37
+ */
38
+ export declare function QuaternionSQUAD(q0: TQuaternion, q1: TQuaternion, q2: TQuaternion, q3: TQuaternion, t: number): TQuaternion;
39
+ /**
40
+ * Creates a smooth interpolation path through multiple quaternions.
41
+ * Returns a function that can be called with a parameter t ∈ [0, 1] to get
42
+ * interpolated quaternions along the path.
43
+ *
44
+ * @param quaternions - Array of quaternions defining the path
45
+ * @param method - Interpolation method ('slerp' | 'nlerp' | 'squad')
46
+ * @returns Function that takes t ∈ [0, 1] and returns interpolated quaternion
47
+ *
48
+ * @example
49
+ * const path = [q1, q2, q3, q4];
50
+ * const interpolator = QuaternionCreatePath(path, 'slerp');
51
+ * const halfway = interpolator(0.5); // Interpolated quaternion at 50% along path
52
+ */
53
+ export declare function QuaternionCreatePath(quaternions: TQuaternion[], method?: 'slerp' | 'nlerp' | 'squad'): (t: number) => TQuaternion;
54
+ //# sourceMappingURL=interpolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.d.ts","sourceRoot":"","sources":["../../src/quaternions/interpolation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAoBtF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB1H;AAkFD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,WAAW,EAAE,EAC1B,MAAM,GAAE,OAAO,GAAG,OAAO,GAAG,OAAiB,GAC3C,CAAC,CAAC,EAAE,MAAM,KAAK,WAAW,CAkD5B"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Advanced interpolation utilities for quaternions.
3
+ * Provides specialized interpolation methods for smooth rotation animations.
4
+ */
5
+ import { AssertArray, AssertNumber } from '@pawells/typescript-common';
6
+ import { AssertNormalizedQuaternion } from './asserts.js';
7
+ import { QuaternionSLERP, QuaternionNormalize, QuaternionMultiply, QuaternionInverse } from './core.js';
8
+ import { Clamp } from '../clamp.js';
9
+ const QUATERNION_LOG_TOLERANCE = 1e-6;
10
+ /**
11
+ * Performs normalized linear interpolation (NLERP) between two quaternions.
12
+ * NLERP is faster than SLERP but doesn't maintain constant angular velocity.
13
+ * Good for cases where performance is more important than perfect interpolation.
14
+ *
15
+ * @param a - Start quaternion
16
+ * @param b - End quaternion
17
+ * @param t - Interpolation parameter (0 = a, 1 = b)
18
+ * @returns Interpolated and normalized quaternion
19
+ *
20
+ * @example
21
+ * const q1 = [0, 0, 0, 1];
22
+ * const q2 = [0, 0, 0.707, 0.707];
23
+ * const interpolated = QuaternionNLERP(q1, q2, 0.5);
24
+ */
25
+ export function QuaternionNLERP(a, b, t) {
26
+ AssertNormalizedQuaternion(a);
27
+ AssertNormalizedQuaternion(b);
28
+ const clampedT = Clamp(t, 0, 1); // Ensure t is within [0, 1]
29
+ // Choose the shorter path (handle double-cover property)
30
+ let bToUse = b;
31
+ const dot = (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]) + (a[3] * b[3]);
32
+ if (dot < 0)
33
+ bToUse = [-b[0], -b[1], -b[2], -b[3]];
34
+ // Linear interpolation
35
+ const result = [
36
+ a[0] + (clampedT * (bToUse[0] - a[0])),
37
+ a[1] + (clampedT * (bToUse[1] - a[1])),
38
+ a[2] + (clampedT * (bToUse[2] - a[2])),
39
+ a[3] + (clampedT * (bToUse[3] - a[3])),
40
+ ];
41
+ return QuaternionNormalize(result);
42
+ }
43
+ /**
44
+ * Performs spherical quadrangle interpolation (SQUAD) for smooth interpolation
45
+ * through multiple quaternions. This is useful for creating smooth animation paths.
46
+ *
47
+ * @param q0 - Previous quaternion (for tangent calculation)
48
+ * @param q1 - Start quaternion
49
+ * @param q2 - End quaternion
50
+ * @param q3 - Next quaternion (for tangent calculation)
51
+ * @param t - Interpolation parameter (0 = q1, 1 = q2)
52
+ * @returns Smoothly interpolated quaternion
53
+ *
54
+ * @example
55
+ * // Create a smooth path through multiple rotations
56
+ * const path = [q0, q1, q2, q3]; // Array of quaternions
57
+ * const smooth = QuaternionSQUAD(path[0], path[1], path[2], path[3], 0.5);
58
+ */
59
+ export function QuaternionSQUAD(q0, q1, q2, q3, t) {
60
+ AssertNormalizedQuaternion(q0);
61
+ AssertNormalizedQuaternion(q1);
62
+ AssertNormalizedQuaternion(q2);
63
+ AssertNormalizedQuaternion(q3);
64
+ AssertNumber(t, { gte: 0, lte: 1 });
65
+ // Calculate intermediate control points
66
+ const s1 = quaternionSquadControlPoint(q0, q1, q2);
67
+ const s2 = quaternionSquadControlPoint(q1, q2, q3);
68
+ // Interpolate using two SLERP operations
69
+ const slerp1 = QuaternionSLERP(q1, q2, t);
70
+ const slerp2 = QuaternionSLERP(s1, s2, t);
71
+ // Final SLERP between the two results
72
+ return QuaternionSLERP(slerp1, slerp2, 2 * t * (1 - t));
73
+ }
74
+ /**
75
+ * Calculates a control point for SQUAD interpolation.
76
+ * This is an internal helper function for smooth quaternion interpolation.
77
+ *
78
+ * @param q0 - Previous quaternion
79
+ * @param q1 - Current quaternion
80
+ * @param q2 - Next quaternion
81
+ * @returns Control point quaternion for smooth interpolation
82
+ */
83
+ function quaternionSquadControlPoint(q0, q1, q2) {
84
+ // Calculate logarithms for smooth interpolation
85
+ const q1Inv = QuaternionInverse(q1);
86
+ const log1 = quaternionLog(QuaternionMultiply(q1Inv, q0));
87
+ const log2 = quaternionLog(QuaternionMultiply(q1Inv, q2));
88
+ // Calculate the control point
89
+ const logSum = [
90
+ log1[0] + log2[0],
91
+ log1[1] + log2[1],
92
+ log1[2] + log2[2],
93
+ log1[3] + log2[3],
94
+ ];
95
+ const scaledLog = [
96
+ logSum[0] * -0.25,
97
+ logSum[1] * -0.25,
98
+ logSum[2] * -0.25,
99
+ logSum[3] * -0.25,
100
+ ];
101
+ return QuaternionMultiply(q1, quaternionExp(scaledLog));
102
+ }
103
+ /**
104
+ * Calculates the natural logarithm of a quaternion.
105
+ * Used internally for advanced interpolation methods.
106
+ *
107
+ * @param quaternion - The quaternion to calculate logarithm for
108
+ * @returns The logarithmic quaternion
109
+ */
110
+ function quaternionLog(quaternion) {
111
+ AssertNormalizedQuaternion(quaternion);
112
+ const [x, y, z, w] = quaternion;
113
+ const vectorLength = Math.sqrt((x * x) + (y * y) + (z * z));
114
+ if (vectorLength < QUATERNION_LOG_TOLERANCE)
115
+ return [0, 0, 0, 0];
116
+ const angle = Math.atan2(vectorLength, w);
117
+ const scale = angle / vectorLength;
118
+ return [x * scale, y * scale, z * scale, 0];
119
+ }
120
+ /**
121
+ * Calculates the exponential of a quaternion.
122
+ * Used internally for advanced interpolation methods.
123
+ *
124
+ * @param quaternion - The quaternion to exponentiate
125
+ * @returns The exponential quaternion
126
+ */
127
+ function quaternionExp(quaternion) {
128
+ const [x, y, z, w] = quaternion;
129
+ const vectorLength = Math.sqrt((x * x) + (y * y) + (z * z));
130
+ if (vectorLength < QUATERNION_LOG_TOLERANCE)
131
+ return [0, 0, 0, 1];
132
+ const expW = Math.exp(w);
133
+ const cosV = Math.cos(vectorLength);
134
+ const sinV = Math.sin(vectorLength);
135
+ const scale = expW * sinV / vectorLength;
136
+ return [
137
+ x * scale,
138
+ y * scale,
139
+ z * scale,
140
+ expW * cosV,
141
+ ];
142
+ }
143
+ /**
144
+ * Creates a smooth interpolation path through multiple quaternions.
145
+ * Returns a function that can be called with a parameter t ∈ [0, 1] to get
146
+ * interpolated quaternions along the path.
147
+ *
148
+ * @param quaternions - Array of quaternions defining the path
149
+ * @param method - Interpolation method ('slerp' | 'nlerp' | 'squad')
150
+ * @returns Function that takes t ∈ [0, 1] and returns interpolated quaternion
151
+ *
152
+ * @example
153
+ * const path = [q1, q2, q3, q4];
154
+ * const interpolator = QuaternionCreatePath(path, 'slerp');
155
+ * const halfway = interpolator(0.5); // Interpolated quaternion at 50% along path
156
+ */
157
+ export function QuaternionCreatePath(quaternions, method = 'slerp') {
158
+ AssertArray(quaternions, { minSize: 2 });
159
+ // Validate all quaternions
160
+ for (const q of quaternions) {
161
+ AssertNormalizedQuaternion(q);
162
+ }
163
+ return (t) => {
164
+ AssertNumber(t, { gte: 0, lte: 1 });
165
+ const [firstQuaternion] = quaternions;
166
+ const lastQuaternion = quaternions[quaternions.length - 1];
167
+ if (t === 0 && firstQuaternion)
168
+ return firstQuaternion;
169
+ if (t === 1 && lastQuaternion)
170
+ return lastQuaternion;
171
+ // Calculate which segment we're in
172
+ const segments = quaternions.length - 1;
173
+ const segmentLength = 1 / segments;
174
+ const segmentIndex = Math.floor(t / segmentLength);
175
+ const segmentT = (t - (segmentIndex * segmentLength)) / segmentLength;
176
+ const currentIndex = Math.min(segmentIndex, segments - 1);
177
+ const nextIndex = Math.min(currentIndex + 1, quaternions.length - 1);
178
+ const q1 = quaternions[currentIndex];
179
+ const q2 = quaternions[nextIndex];
180
+ // Ensure we have valid quaternions
181
+ if (!q1 || !q2)
182
+ throw new Error('Invalid quaternion path calculation');
183
+ switch (method) {
184
+ case 'nlerp':
185
+ return QuaternionNLERP(q1, q2, segmentT);
186
+ case 'squad': {
187
+ // For SQUAD, we need additional quaternions for tangent calculation
188
+ const q0 = quaternions[Math.max(0, currentIndex - 1)];
189
+ const q3 = quaternions[Math.min(quaternions.length - 1, nextIndex + 1)];
190
+ // Ensure we have valid quaternions
191
+ if (!q0 || !q3)
192
+ throw new Error('Invalid quaternion path calculation for SQUAD');
193
+ return QuaternionSQUAD(q0, q1, q2, q3, segmentT);
194
+ }
195
+ case 'slerp':
196
+ default:
197
+ return QuaternionSLERP(q1, q2, segmentT);
198
+ }
199
+ };
200
+ }
201
+ //# sourceMappingURL=interpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../../src/quaternions/interpolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interpolation.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.spec.d.ts","sourceRoot":"","sources":["../../src/quaternions/interpolation.spec.ts"],"names":[],"mappings":""}