@math.gl/core 3.6.0-alpha.1 → 3.6.0-alpha.4

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 (188) hide show
  1. package/dist/classes/base/math-array.d.ts +61 -31
  2. package/dist/classes/base/math-array.d.ts.map +1 -1
  3. package/dist/classes/base/math-array.js +67 -65
  4. package/dist/classes/base/matrix.d.ts +12 -10
  5. package/dist/classes/base/matrix.d.ts.map +1 -1
  6. package/dist/classes/base/matrix.js +2 -10
  7. package/dist/classes/base/vector.d.ts +37 -25
  8. package/dist/classes/base/vector.d.ts.map +1 -1
  9. package/dist/classes/base/vector.js +17 -24
  10. package/dist/classes/euler.d.ts +59 -55
  11. package/dist/classes/euler.d.ts.map +1 -1
  12. package/dist/classes/euler.js +57 -77
  13. package/dist/classes/matrix3.d.ts +58 -41
  14. package/dist/classes/matrix3.d.ts.map +1 -1
  15. package/dist/classes/matrix3.js +68 -59
  16. package/dist/classes/matrix4.d.ts +214 -90
  17. package/dist/classes/matrix4.d.ts.map +1 -1
  18. package/dist/classes/matrix4.js +252 -171
  19. package/dist/classes/pose.d.ts +29 -26
  20. package/dist/classes/pose.d.ts.map +1 -1
  21. package/dist/classes/pose.js +6 -23
  22. package/dist/classes/quaternion.d.ts +61 -40
  23. package/dist/classes/quaternion.d.ts.map +1 -1
  24. package/dist/classes/quaternion.js +49 -53
  25. package/dist/classes/spherical-coordinates.d.ts +45 -25
  26. package/dist/classes/spherical-coordinates.d.ts.map +1 -1
  27. package/dist/classes/spherical-coordinates.js +30 -24
  28. package/dist/classes/vector2.d.ts +51 -15
  29. package/dist/classes/vector2.d.ts.map +1 -1
  30. package/dist/classes/vector2.js +29 -23
  31. package/dist/classes/vector3.d.ts +47 -32
  32. package/dist/classes/vector3.d.ts.map +1 -1
  33. package/dist/classes/vector3.js +16 -30
  34. package/dist/classes/vector4.d.ts +37 -19
  35. package/dist/classes/vector4.d.ts.map +1 -1
  36. package/dist/classes/vector4.js +12 -24
  37. package/dist/es5/classes/base/math-array.js +248 -179
  38. package/dist/es5/classes/base/math-array.js.map +1 -1
  39. package/dist/es5/classes/base/matrix.js +74 -54
  40. package/dist/es5/classes/base/matrix.js.map +1 -1
  41. package/dist/es5/classes/base/vector.js +167 -121
  42. package/dist/es5/classes/base/vector.js.map +1 -1
  43. package/dist/es5/classes/euler.js +575 -480
  44. package/dist/es5/classes/euler.js.map +1 -1
  45. package/dist/es5/classes/matrix3.js +234 -158
  46. package/dist/es5/classes/matrix3.js.map +1 -1
  47. package/dist/es5/classes/matrix4.js +510 -417
  48. package/dist/es5/classes/matrix4.js.map +1 -1
  49. package/dist/es5/classes/pose.js +126 -101
  50. package/dist/es5/classes/pose.js.map +1 -1
  51. package/dist/es5/classes/quaternion.js +285 -213
  52. package/dist/es5/classes/quaternion.js.map +1 -1
  53. package/dist/es5/classes/spherical-coordinates.js +170 -125
  54. package/dist/es5/classes/spherical-coordinates.js.map +1 -1
  55. package/dist/es5/classes/vector2.js +118 -76
  56. package/dist/es5/classes/vector2.js.map +1 -1
  57. package/dist/es5/classes/vector3.js +171 -119
  58. package/dist/es5/classes/vector3.js.map +1 -1
  59. package/dist/es5/classes/vector4.js +141 -94
  60. package/dist/es5/classes/vector4.js.map +1 -1
  61. package/dist/es5/index.js +34 -34
  62. package/dist/es5/lib/common.js +56 -30
  63. package/dist/es5/lib/common.js.map +1 -1
  64. package/dist/es5/lib/gl-matrix-extras.js +14 -14
  65. package/dist/es5/lib/gl-matrix-extras.js.map +1 -1
  66. package/dist/es5/lib/gl-matrix.d.js +2 -0
  67. package/dist/es5/lib/gl-matrix.d.js.map +1 -0
  68. package/dist/es5/lib/validators.js +5 -3
  69. package/dist/es5/lib/validators.js.map +1 -1
  70. package/dist/esm/classes/base/math-array.js +45 -47
  71. package/dist/esm/classes/base/math-array.js.map +1 -1
  72. package/dist/esm/classes/base/matrix.js +0 -11
  73. package/dist/esm/classes/base/matrix.js.map +1 -1
  74. package/dist/esm/classes/base/vector.js +0 -10
  75. package/dist/esm/classes/base/vector.js.map +1 -1
  76. package/dist/esm/classes/euler.js +61 -48
  77. package/dist/esm/classes/euler.js.map +1 -1
  78. package/dist/esm/classes/matrix3.js +55 -33
  79. package/dist/esm/classes/matrix3.js.map +1 -1
  80. package/dist/esm/classes/matrix4.js +156 -136
  81. package/dist/esm/classes/matrix4.js.map +1 -1
  82. package/dist/esm/classes/pose.js +8 -4
  83. package/dist/esm/classes/pose.js.map +1 -1
  84. package/dist/esm/classes/quaternion.js +37 -27
  85. package/dist/esm/classes/quaternion.js.map +1 -1
  86. package/dist/esm/classes/spherical-coordinates.js +15 -5
  87. package/dist/esm/classes/spherical-coordinates.js.map +1 -1
  88. package/dist/esm/classes/vector2.js.map +1 -1
  89. package/dist/esm/classes/vector3.js +7 -2
  90. package/dist/esm/classes/vector3.js.map +1 -1
  91. package/dist/esm/classes/vector4.js +7 -2
  92. package/dist/esm/classes/vector4.js.map +1 -1
  93. package/dist/esm/lib/common.js +8 -8
  94. package/dist/esm/lib/common.js.map +1 -1
  95. package/dist/esm/lib/gl-matrix-extras.js.map +1 -1
  96. package/dist/esm/lib/gl-matrix.d.js +2 -0
  97. package/dist/esm/lib/gl-matrix.d.js.map +1 -0
  98. package/dist/esm/lib/validators.js.map +1 -1
  99. package/dist/lib/common.d.ts +14 -11
  100. package/dist/lib/common.d.ts.map +1 -1
  101. package/dist/lib/common.js +10 -23
  102. package/dist/lib/gl-matrix-extras.d.ts +6 -5
  103. package/dist/lib/gl-matrix-extras.d.ts.map +1 -1
  104. package/dist/lib/gl-matrix-extras.js +0 -1
  105. package/dist/lib/validators.d.ts +5 -4
  106. package/dist/lib/validators.d.ts.map +1 -1
  107. package/dist/lib/validators.js +0 -19
  108. package/package.json +5 -5
  109. package/src/classes/base/math-array.ts +265 -0
  110. package/src/classes/base/{matrix.js → matrix.ts} +15 -19
  111. package/src/classes/base/{vector.js → vector.ts} +47 -54
  112. package/src/classes/{euler.js → euler.ts} +121 -221
  113. package/src/classes/matrix3.ts +253 -0
  114. package/src/classes/matrix4.ts +668 -0
  115. package/src/classes/{pose.js → pose.ts} +52 -49
  116. package/src/classes/{quaternion.js → quaternion.ts} +107 -95
  117. package/src/classes/{spherical-coordinates.js → spherical-coordinates.ts} +84 -54
  118. package/src/classes/vector2.ts +127 -0
  119. package/src/classes/{vector3.js → vector3.ts} +43 -55
  120. package/src/classes/{vector4.js → vector4.ts} +44 -48
  121. package/src/lib/common.ts +58 -37
  122. package/src/lib/gl-matrix-extras.ts +26 -5
  123. package/src/lib/gl-matrix.d.ts +266 -0
  124. package/src/lib/validators.ts +10 -6
  125. package/dist/es5/classes/base/math-array.d.js +0 -46
  126. package/dist/es5/classes/base/math-array.d.js.map +0 -1
  127. package/dist/es5/classes/base/matrix.d.js +0 -15
  128. package/dist/es5/classes/base/matrix.d.js.map +0 -1
  129. package/dist/es5/classes/base/vector.d.js +0 -24
  130. package/dist/es5/classes/base/vector.d.js.map +0 -1
  131. package/dist/es5/classes/euler.d.js +0 -45
  132. package/dist/es5/classes/euler.d.js.map +0 -1
  133. package/dist/es5/classes/matrix3.d.js +0 -25
  134. package/dist/es5/classes/matrix3.d.js.map +0 -1
  135. package/dist/es5/classes/matrix4.d.js +0 -25
  136. package/dist/es5/classes/matrix4.d.js.map +0 -1
  137. package/dist/es5/classes/pose.d.js +0 -25
  138. package/dist/es5/classes/pose.d.js.map +0 -1
  139. package/dist/es5/classes/quaternion.d.js +0 -27
  140. package/dist/es5/classes/quaternion.d.js.map +0 -1
  141. package/dist/es5/classes/spherical-coordinates.d.js +0 -27
  142. package/dist/es5/classes/spherical-coordinates.d.js.map +0 -1
  143. package/dist/es5/classes/vector2.d.js +0 -18
  144. package/dist/es5/classes/vector2.d.js.map +0 -1
  145. package/dist/es5/classes/vector3.d.js +0 -24
  146. package/dist/es5/classes/vector3.d.js.map +0 -1
  147. package/dist/es5/classes/vector4.d.js +0 -25
  148. package/dist/es5/classes/vector4.d.js.map +0 -1
  149. package/dist/esm/classes/base/math-array.d.js +0 -36
  150. package/dist/esm/classes/base/math-array.d.js.map +0 -1
  151. package/dist/esm/classes/base/matrix.d.js +0 -3
  152. package/dist/esm/classes/base/matrix.d.js.map +0 -1
  153. package/dist/esm/classes/base/vector.d.js +0 -13
  154. package/dist/esm/classes/base/vector.d.js.map +0 -1
  155. package/dist/esm/classes/euler.d.js +0 -55
  156. package/dist/esm/classes/euler.d.js.map +0 -1
  157. package/dist/esm/classes/matrix3.d.js +0 -15
  158. package/dist/esm/classes/matrix3.d.js.map +0 -1
  159. package/dist/esm/classes/matrix4.d.js +0 -15
  160. package/dist/esm/classes/matrix4.d.js.map +0 -1
  161. package/dist/esm/classes/pose.d.js +0 -18
  162. package/dist/esm/classes/pose.d.js.map +0 -1
  163. package/dist/esm/classes/quaternion.d.js +0 -19
  164. package/dist/esm/classes/quaternion.d.js.map +0 -1
  165. package/dist/esm/classes/spherical-coordinates.d.js +0 -22
  166. package/dist/esm/classes/spherical-coordinates.d.js.map +0 -1
  167. package/dist/esm/classes/vector2.d.js +0 -6
  168. package/dist/esm/classes/vector2.d.js.map +0 -1
  169. package/dist/esm/classes/vector3.d.js +0 -13
  170. package/dist/esm/classes/vector3.d.js.map +0 -1
  171. package/dist/esm/classes/vector4.d.js +0 -15
  172. package/dist/esm/classes/vector4.d.js.map +0 -1
  173. package/src/classes/base/math-array.d.ts +0 -55
  174. package/src/classes/base/math-array.js +0 -250
  175. package/src/classes/base/matrix.d.ts +0 -15
  176. package/src/classes/base/vector.d.ts +0 -45
  177. package/src/classes/euler.d.ts +0 -92
  178. package/src/classes/matrix3.d.ts +0 -91
  179. package/src/classes/matrix3.js +0 -225
  180. package/src/classes/matrix4.d.ts +0 -161
  181. package/src/classes/matrix4.js +0 -530
  182. package/src/classes/pose.d.ts +0 -92
  183. package/src/classes/quaternion.d.ts +0 -107
  184. package/src/classes/spherical-coordinates.d.ts +0 -87
  185. package/src/classes/vector2.d.ts +0 -65
  186. package/src/classes/vector2.js +0 -122
  187. package/src/classes/vector3.d.ts +0 -65
  188. package/src/classes/vector4.d.ts +0 -34
@@ -0,0 +1,265 @@
1
+ // math.gl, MIT License
2
+ import {NumericArray} from '@math.gl/types';
3
+ import {ConfigurationOptions, config, formatValue, equals, isArray} from '../../lib/common';
4
+
5
+ /** Base class for vectors and matrices */
6
+ export default abstract class MathArray extends Array<number> {
7
+ /** Number of elements (values) in this array */
8
+ abstract get ELEMENTS(): number;
9
+
10
+ abstract copy(vector: Readonly<NumericArray>): this;
11
+
12
+ abstract fromObject(object: object): this;
13
+
14
+ // Common methods
15
+
16
+ /**
17
+ * Clone the current object
18
+ * @returns a new copy of this object
19
+ */
20
+ clone(): this {
21
+ // @ts-expect-error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
22
+ return new this.constructor().copy(this); // eslint-disable-line
23
+ }
24
+
25
+ fromArray(array: Readonly<NumericArray>, offset: number = 0): this {
26
+ for (let i = 0; i < this.ELEMENTS; ++i) {
27
+ this[i] = array[i + offset];
28
+ }
29
+ return this.check();
30
+ }
31
+
32
+ toArray<TypedArray>(targetArray: TypedArray, offset?: number): TypedArray;
33
+ toArray(targetArray?: number[], offset?: number): NumericArray;
34
+
35
+ toArray(targetArray: NumericArray = [], offset: number = 0): NumericArray {
36
+ for (let i = 0; i < this.ELEMENTS; ++i) {
37
+ targetArray[offset + i] = this[i];
38
+ }
39
+ return targetArray;
40
+ }
41
+
42
+ from(arrayOrObject: Readonly<NumericArray> | object): this {
43
+ return Array.isArray(arrayOrObject) ? this.copy(arrayOrObject) : this.fromObject(arrayOrObject);
44
+ }
45
+
46
+ to<T extends NumericArray | object>(arrayOrObject: T): T {
47
+ // @ts-ignore
48
+ if (arrayOrObject === this) {
49
+ return this;
50
+ }
51
+ // @ts-expect-error TS2339: Property 'toObject' does not exist on type 'MathArray'.
52
+ return isArray(arrayOrObject) ? this.toArray(arrayOrObject) : this.toObject(arrayOrObject);
53
+ }
54
+
55
+ toTarget(target: any): any {
56
+ return target ? this.to(target) : this;
57
+ }
58
+
59
+ /** @deprecated */
60
+ toFloat32Array(): Float32Array {
61
+ return new Float32Array(this);
62
+ }
63
+
64
+ toString(): string {
65
+ return this.formatString(config);
66
+ }
67
+
68
+ /** Formats string according to options */
69
+ formatString(opts: ConfigurationOptions): string {
70
+ let string = '';
71
+ for (let i = 0; i < this.ELEMENTS; ++i) {
72
+ string += (i > 0 ? ', ' : '') + formatValue(this[i], opts);
73
+ }
74
+ return `${opts.printTypes ? this.constructor.name : ''}[${string}]`;
75
+ }
76
+
77
+ equals(array: Readonly<NumericArray>): boolean {
78
+ if (!array || this.length !== array.length) {
79
+ return false;
80
+ }
81
+ for (let i = 0; i < this.ELEMENTS; ++i) {
82
+ if (!equals(this[i], array[i])) {
83
+ return false;
84
+ }
85
+ }
86
+ return true;
87
+ }
88
+
89
+ exactEquals(array: Readonly<NumericArray>): boolean {
90
+ if (!array || this.length !== array.length) {
91
+ return false;
92
+ }
93
+ for (let i = 0; i < this.ELEMENTS; ++i) {
94
+ if (this[i] !== array[i]) {
95
+ return false;
96
+ }
97
+ }
98
+ return true;
99
+ }
100
+
101
+ // Modifiers
102
+
103
+ /** Negates all values in this object */
104
+ negate(): this {
105
+ for (let i = 0; i < this.ELEMENTS; ++i) {
106
+ this[i] = -this[i];
107
+ }
108
+ return this.check();
109
+ }
110
+
111
+ /** Linearly interpolates between two values */
112
+ lerp(a: Readonly<NumericArray>, t: number): this;
113
+ lerp(a: Readonly<NumericArray>, b: Readonly<NumericArray>, t: number): this;
114
+
115
+ lerp(a: Readonly<NumericArray>, b: Readonly<NumericArray> | number, t?: number): this {
116
+ if (t === undefined) {
117
+ return this.lerp(this, a, b as number);
118
+ }
119
+ for (let i = 0; i < this.ELEMENTS; ++i) {
120
+ const ai = a[i];
121
+ this[i] = ai + t * (b[i] - ai);
122
+ }
123
+ return this.check();
124
+ }
125
+
126
+ /** Minimal */
127
+ min(vector: Readonly<NumericArray>): this {
128
+ for (let i = 0; i < this.ELEMENTS; ++i) {
129
+ this[i] = Math.min(vector[i], this[i]);
130
+ }
131
+ return this.check();
132
+ }
133
+
134
+ /** Maximal */
135
+ max(vector: Readonly<NumericArray>): this {
136
+ for (let i = 0; i < this.ELEMENTS; ++i) {
137
+ this[i] = Math.max(vector[i], this[i]);
138
+ }
139
+ return this.check();
140
+ }
141
+
142
+ clamp(minVector: Readonly<NumericArray>, maxVector: Readonly<NumericArray>): this {
143
+ for (let i = 0; i < this.ELEMENTS; ++i) {
144
+ this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);
145
+ }
146
+ return this.check();
147
+ }
148
+
149
+ add(...vectors: Readonly<NumericArray>[]): this {
150
+ for (const vector of vectors) {
151
+ for (let i = 0; i < this.ELEMENTS; ++i) {
152
+ this[i] += vector[i];
153
+ }
154
+ }
155
+ return this.check();
156
+ }
157
+
158
+ subtract(...vectors: Readonly<NumericArray>[]): this {
159
+ for (const vector of vectors) {
160
+ for (let i = 0; i < this.ELEMENTS; ++i) {
161
+ this[i] -= vector[i];
162
+ }
163
+ }
164
+ return this.check();
165
+ }
166
+
167
+ scale(scale: number | Readonly<NumericArray>): this {
168
+ if (typeof scale === 'number') {
169
+ for (let i = 0; i < this.ELEMENTS; ++i) {
170
+ this[i] *= scale;
171
+ }
172
+ } else {
173
+ for (let i = 0; i < this.ELEMENTS && i < scale.length; ++i) {
174
+ this[i] *= scale[i];
175
+ }
176
+ }
177
+ return this.check();
178
+ }
179
+
180
+ /**
181
+ * Multiplies all elements by `scale`
182
+ * Note: `Matrix4.multiplyByScalar` only scales its 3x3 "minor"
183
+ */
184
+ multiplyByScalar(scalar: number): this {
185
+ for (let i = 0; i < this.ELEMENTS; ++i) {
186
+ this[i] *= scalar;
187
+ }
188
+ return this.check();
189
+ }
190
+
191
+ // Debug checks
192
+
193
+ /** Throws an error if array length is incorrect or contains illegal values */
194
+ check(): this {
195
+ if (config.debug && !this.validate()) {
196
+ throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);
197
+ }
198
+ return this;
199
+ }
200
+
201
+ /** Returns false if the array length is incorrect or contains illegal values */
202
+ validate(): boolean {
203
+ let valid = this.length === this.ELEMENTS;
204
+ for (let i = 0; i < this.ELEMENTS; ++i) {
205
+ valid = valid && Number.isFinite(this[i]);
206
+ }
207
+ return valid;
208
+ }
209
+
210
+ // three.js compatibility
211
+
212
+ /** @deprecated */
213
+ sub(a: Readonly<NumericArray>): this {
214
+ return this.subtract(a);
215
+ }
216
+
217
+ /** @deprecated */
218
+ setScalar(a: number): this {
219
+ for (let i = 0; i < this.ELEMENTS; ++i) {
220
+ this[i] = a;
221
+ }
222
+ return this.check();
223
+ }
224
+
225
+ /** @deprecated */
226
+ addScalar(a: number): this {
227
+ for (let i = 0; i < this.ELEMENTS; ++i) {
228
+ this[i] += a;
229
+ }
230
+ return this.check();
231
+ }
232
+
233
+ /** @deprecated */
234
+ subScalar(a: number): this {
235
+ return this.addScalar(-a);
236
+ }
237
+
238
+ /** @deprecated */
239
+ multiplyScalar(scalar: number): this {
240
+ // Multiplies all elements
241
+ // `Matrix4.scale` only scales its 3x3 "minor"
242
+ for (let i = 0; i < this.ELEMENTS; ++i) {
243
+ this[i] *= scalar;
244
+ }
245
+ return this.check();
246
+ }
247
+
248
+ /** @deprecated */
249
+ divideScalar(a: number): this {
250
+ return this.multiplyByScalar(1 / a);
251
+ }
252
+
253
+ /** @deprecated */
254
+ clampScalar(min: number, max: number): this {
255
+ for (let i = 0; i < this.ELEMENTS; ++i) {
256
+ this[i] = Math.min(Math.max(this[i], min), max);
257
+ }
258
+ return this.check();
259
+ }
260
+
261
+ /** @deprecated */
262
+ get elements(): NumericArray {
263
+ return this;
264
+ }
265
+ }
@@ -1,32 +1,26 @@
1
+ // Copyright (c) 2017 Uber Technologies, Inc.
2
+ // MIT License
3
+ import {NumericArray} from '@math.gl/types';
1
4
  import MathArray from './math-array';
2
5
  import {checkNumber} from '../../lib/validators';
3
6
  import {config} from '../../lib/common';
4
- import assert from '../../lib/assert';
5
7
 
6
- export default class Matrix extends MathArray {
7
- // Defined by derived class
8
- get ELEMENTS() {
9
- assert(false);
10
- return 0;
11
- }
12
-
13
- get RANK() {
14
- assert(false);
15
- return 0;
16
- }
8
+ /** Base class for matrices */
9
+ export default abstract class Matrix extends MathArray {
10
+ abstract get RANK(): number;
17
11
 
18
12
  // fromObject(object) {
19
13
  // const array = object.elements;
20
14
  // return this.fromRowMajor(array);
21
15
  // }
22
-
23
16
  // toObject(object) {
24
17
  // const array = object.elements;
25
18
  // this.toRowMajor(array);
26
19
  // return object;
27
20
  // }
28
21
 
29
- toString() {
22
+ // TODO better override formatString?
23
+ toString(): string {
30
24
  let string = '[';
31
25
  if (config.printRowMajor) {
32
26
  string += 'row-major:';
@@ -45,22 +39,24 @@ export default class Matrix extends MathArray {
45
39
  return string;
46
40
  }
47
41
 
48
- getElementIndex(row, col) {
42
+ getElementIndex(row: number, col: number): number {
49
43
  return col * this.RANK + row;
50
44
  }
51
45
 
52
46
  // By default assumes row major indices
53
- getElement(row, col) {
47
+ getElement(row: number, col: number): number {
54
48
  return this[col * this.RANK + row];
55
49
  }
56
50
 
57
51
  // By default assumes row major indices
58
- setElement(row, col, value) {
52
+ setElement(row: number, col: number, value: number): this {
59
53
  this[col * this.RANK + row] = checkNumber(value);
60
54
  return this;
61
55
  }
56
+ getColumn<NumArrayT>(columnIndex: number, result: NumArrayT): NumArrayT;
57
+ getColumn(columnIndex: number): number[];
62
58
 
63
- getColumn(columnIndex, result = new Array(this.RANK).fill(-0)) {
59
+ getColumn(columnIndex: number, result: number[] = new Array(this.RANK).fill(-0)): number[] {
64
60
  const firstIndex = columnIndex * this.RANK;
65
61
  for (let i = 0; i < this.RANK; ++i) {
66
62
  result[i] = this[firstIndex + i];
@@ -68,7 +64,7 @@ export default class Matrix extends MathArray {
68
64
  return result;
69
65
  }
70
66
 
71
- setColumn(columnIndex, columnVector) {
67
+ setColumn(columnIndex: number, columnVector: Readonly<NumericArray>): this {
72
68
  const firstIndex = columnIndex * this.RANK;
73
69
  for (let i = 0; i < this.RANK; ++i) {
74
70
  this[firstIndex + i] = columnVector[i];
@@ -1,46 +1,51 @@
1
+ // Copyright (c) 2017 Uber Technologies, Inc.
2
+ // MIT License
3
+ import {NumericArray} from '@math.gl/types';
1
4
  import MathArray from './math-array';
2
5
  import {checkNumber} from '../../lib/validators';
3
6
  import assert from '../../lib/assert';
4
7
 
5
- export default class Vector extends MathArray {
6
- get ELEMENTS() {
7
- assert(false);
8
- return 0;
9
- }
10
-
11
- // VIRTUAL METHODS
12
- copy(vector) {
13
- assert(false);
14
- return this;
15
- }
16
-
8
+ /** Base class for vectors with at least 2 elements */
9
+ export default abstract class Vector extends MathArray {
17
10
  // ACCESSORS
18
11
 
19
- get x() {
12
+ get x(): number {
20
13
  return this[0];
21
14
  }
22
- set x(value) {
15
+
16
+ set x(value: number) {
23
17
  this[0] = checkNumber(value);
24
18
  }
25
19
 
26
- get y() {
20
+ get y(): number {
27
21
  return this[1];
28
22
  }
29
- set y(value) {
23
+
24
+ set y(value: number) {
30
25
  this[1] = checkNumber(value);
31
26
  }
32
27
 
33
- // NOTE: `length` is a reserved word for Arrays, so we can't use `v.length()`
34
- // Offer `len` and `magnitude`
35
- len() {
28
+ /**
29
+ * Returns the length of the vector from the origin to the point described by this vector
30
+ *
31
+ * @note `length` is a reserved word for Arrays, so `v.length()` will return number of elements
32
+ * Instead we provide `len` and `magnitude`
33
+ */
34
+ len(): number {
36
35
  return Math.sqrt(this.lengthSquared());
37
36
  }
38
37
 
39
- magnitude() {
38
+ /**
39
+ * Returns the length of the vector from the origin to the point described by this vector
40
+ */
41
+ magnitude(): number {
40
42
  return this.len();
41
43
  }
42
44
 
43
- lengthSquared() {
45
+ /**
46
+ * Returns the squared length of the vector from the origin to the point described by this vector
47
+ */
48
+ lengthSquared(): number {
44
49
  let length = 0;
45
50
  for (let i = 0; i < this.ELEMENTS; ++i) {
46
51
  length += this[i] * this[i];
@@ -48,15 +53,18 @@ export default class Vector extends MathArray {
48
53
  return length;
49
54
  }
50
55
 
51
- magnitudeSquared() {
56
+ /**
57
+ * Returns the squared length of the vector from the origin to the point described by this vector
58
+ */
59
+ magnitudeSquared(): number {
52
60
  return this.lengthSquared();
53
61
  }
54
62
 
55
- distance(mathArray) {
63
+ distance(mathArray: Readonly<NumericArray>): number {
56
64
  return Math.sqrt(this.distanceSquared(mathArray));
57
65
  }
58
66
 
59
- distanceSquared(mathArray) {
67
+ distanceSquared(mathArray: Readonly<NumericArray>): number {
60
68
  let length = 0;
61
69
  for (let i = 0; i < this.ELEMENTS; ++i) {
62
70
  const dist = this[i] - mathArray[i];
@@ -65,7 +73,7 @@ export default class Vector extends MathArray {
65
73
  return checkNumber(length);
66
74
  }
67
75
 
68
- dot(mathArray) {
76
+ dot(mathArray: Readonly<NumericArray>): number {
69
77
  let product = 0;
70
78
  for (let i = 0; i < this.ELEMENTS; ++i) {
71
79
  product += this[i] * mathArray[i];
@@ -75,7 +83,7 @@ export default class Vector extends MathArray {
75
83
 
76
84
  // MODIFIERS
77
85
 
78
- normalize() {
86
+ normalize(): this {
79
87
  const length = this.magnitude();
80
88
  if (length !== 0) {
81
89
  for (let i = 0; i < this.ELEMENTS; ++i) {
@@ -85,21 +93,7 @@ export default class Vector extends MathArray {
85
93
  return this.check();
86
94
  }
87
95
 
88
- // negate() {
89
- // for (let i = 0; i < this.ELEMENTS; ++i) {
90
- // this[i] = -this[i];
91
- // }
92
- // return this.check();
93
- // }
94
-
95
- // inverse() {
96
- // for (let i = 0; i < this.ELEMENTS; ++i) {
97
- // this[i] = 1 / this[i];
98
- // }
99
- // return this.check();
100
- // }
101
-
102
- multiply(...vectors) {
96
+ multiply(...vectors: Readonly<NumericArray>[]): this {
103
97
  for (const vector of vectors) {
104
98
  for (let i = 0; i < this.ELEMENTS; ++i) {
105
99
  this[i] *= vector[i];
@@ -108,7 +102,7 @@ export default class Vector extends MathArray {
108
102
  return this.check();
109
103
  }
110
104
 
111
- divide(...vectors) {
105
+ divide(...vectors: Readonly<NumericArray>[]): this {
112
106
  for (const vector of vectors) {
113
107
  for (let i = 0; i < this.ELEMENTS; ++i) {
114
108
  this[i] /= vector[i];
@@ -118,43 +112,42 @@ export default class Vector extends MathArray {
118
112
  }
119
113
 
120
114
  // THREE.js compatibility
121
- lengthSq() {
115
+
116
+ lengthSq(): number {
122
117
  return this.lengthSquared();
123
118
  }
124
-
125
- distanceTo(vector) {
119
+ distanceTo(vector: Readonly<NumericArray>): number {
126
120
  return this.distance(vector);
127
121
  }
128
-
129
- distanceToSquared(vector) {
122
+ distanceToSquared(vector: Readonly<NumericArray>): number {
130
123
  return this.distanceSquared(vector);
131
124
  }
132
125
 
133
- getComponent(i) {
126
+ getComponent(i: number): number {
134
127
  assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');
135
128
  return checkNumber(this[i]);
136
129
  }
137
130
 
138
- setComponent(i, value) {
131
+ setComponent(i: number, value: number): this {
139
132
  assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');
140
133
  this[i] = value;
141
134
  return this.check();
142
135
  }
143
136
 
144
- addVectors(a, b) {
137
+ addVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {
145
138
  return this.copy(a).add(b);
146
139
  }
147
140
 
148
- subVectors(a, b) {
141
+ subVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {
149
142
  return this.copy(a).subtract(b);
150
143
  }
151
144
 
152
- multiplyVectors(a, b) {
145
+ multiplyVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {
153
146
  return this.copy(a).multiply(b);
154
147
  }
155
148
 
156
- addScaledVector(a, b) {
157
- // @ts-ignore error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
149
+ addScaledVector(a: Readonly<NumericArray>, b: number): this {
150
+ // @ts-expect-error error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
158
151
  return this.add(new this.constructor(a).multiplyScalar(b));
159
152
  }
160
153
  }