1
+ import { Vector2 } from './vector2' ;
2
+ import { Vector3 } from './vector3' ;
1
3
2
4
export interface Vector {
3
5
'x' : number ;
@@ -20,11 +22,16 @@ export class Vector {
20
22
return this . compareAxes ( '<=' , 0 ) ;
21
23
}
22
24
23
- //true if vector is equal to (scalar;scalar)
25
+ //true if vector2 is equal to (scalar;scalar)
24
26
public isEqualTo ( scalar : number ) : boolean {
25
27
return this . compareAxes ( '!==' , scalar ) ;
26
28
}
27
29
30
+ //true if vector2 is equal to (0;0)
31
+ public isOrigin ( ) : boolean {
32
+ return this . compareAxes ( '!==' , 0 ) ;
33
+ }
34
+
28
35
public toArray ( ) : number [ ] {
29
36
let array = [ ] ;
30
37
for ( const axis in this ) {
@@ -46,7 +53,7 @@ export class Vector {
46
53
// '(x = ' + this.x + '; y = ' + this.y + '; z = ' + this.z + ')';
47
54
}
48
55
49
- public origin ( ) : Vector {
56
+ public origin ( ) : Vector2 | Vector3 {
50
57
return this . updateAxes ( '=' , 0.0 ) ;
51
58
}
52
59
@@ -65,109 +72,109 @@ export class Vector {
65
72
return squaredMagnitude ;
66
73
}
67
74
68
- public getDistance ( v : Vector , square : boolean = false ) : number {
75
+ public getDistance ( v : Vector2 | Vector3 , square : boolean = false ) : number {
69
76
this . subtract ( v ) ;
70
77
const magnitude = this . getMagnitude ( square ) ;
71
78
this . add ( v ) ;
72
79
return magnitude ;
73
80
}
74
81
75
- public add ( v : Vector ) : Vector {
82
+ public add ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
76
83
return this . updateAxesByVector ( '+=' , v , null ) ;
77
84
}
78
85
79
- public addScaledVector ( v : Vector , scalar : number ) : Vector {
86
+ public addScaledVector ( v : Vector2 | Vector3 , scalar : number ) : Vector2 | Vector3 {
80
87
return this . updateAxesByVector ( '+=' , v , scalar ) ;
81
88
}
82
89
83
- public addScalar ( scalar : number ) : Vector {
90
+ public addScalar ( scalar : number ) : Vector2 | Vector3 {
84
91
return this . updateAxes ( '+=' , scalar ) ;
85
92
}
86
93
87
- public subtract ( v : Vector ) : Vector {
94
+ public subtract ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
88
95
return this . updateAxesByVector ( '-=' , v , null ) ;
89
96
}
90
97
91
- public subtractScaledVector ( v : Vector , scalar : number ) : Vector {
98
+ public subtractScaledVector ( v : Vector2 | Vector3 , scalar : number ) : Vector2 | Vector3 {
92
99
return this . updateAxesByVector ( '-=' , v , scalar ) ;
93
100
}
94
101
95
- public subtractScalar ( scalar : number ) : Vector {
102
+ public subtractScalar ( scalar : number ) : Vector2 | Vector3 {
96
103
return this . updateAxes ( '-=' , scalar ) ;
97
104
}
98
105
99
106
//component product
100
- public multiply ( v : Vector ) : Vector {
107
+ public multiply ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
101
108
return this . updateAxesByVector ( '*=' , v , null ) ;
102
109
}
103
110
104
- public multiplyScaledVector ( v : Vector , scalar : number ) : Vector {
111
+ public multiplyScaledVector ( v : Vector2 | Vector3 , scalar : number ) : Vector2 | Vector3 {
105
112
return this . updateAxesByVector ( '*=' , v , scalar ) ;
106
113
}
107
114
108
- public scale ( scalar : number ) : Vector {
115
+ public scale ( scalar : number ) : Vector2 | Vector3 {
109
116
return this . updateAxes ( '*=' , scalar ) ;
110
117
}
111
118
112
- public divide ( v : Vector ) : Vector {
119
+ public divide ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
113
120
return this . updateAxesByVector ( '/=' , v , null ) ;
114
121
}
115
122
116
- public divideScaledVector ( v : Vector , scalar : number ) : Vector {
123
+ public divideScaledVector ( v : Vector2 | Vector3 , scalar : number ) : Vector2 | Vector3 {
117
124
return this . updateAxesByVector ( '/=' , v , scalar ) ;
118
125
}
119
126
120
- public halve ( ) : Vector {
127
+ public halve ( ) : Vector2 | Vector3 {
121
128
return this . updateAxes ( '*=' , 0.5 ) ;
122
129
}
123
130
124
- public max ( v : Vector ) : Vector {
131
+ public max ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
125
132
return this . updateAxesWithMathByVector ( v , 'max' ) ;
126
133
}
127
134
128
- public min ( v : Vector ) : Vector {
135
+ public min ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
129
136
return this . updateAxesWithMathByVector ( v , 'min' ) ;
130
137
}
131
138
132
- public maxScalar ( scalar : number ) : Vector {
139
+ public maxScalar ( scalar : number ) : Vector2 | Vector3 {
133
140
return this . updateAxesWithMath ( scalar , 'max' ) ;
134
141
}
135
142
136
- public minScalar ( scalar : number ) : Vector {
143
+ public minScalar ( scalar : number ) : Vector2 | Vector3 {
137
144
return this . updateAxesWithMath ( scalar , 'min' ) ;
138
145
}
139
146
140
- public normalize ( ) : Vector {
147
+ public normalize ( ) : Vector2 | Vector3 {
141
148
let length = this . getMagnitude ( ) ;
142
149
if ( length && length != 1 ) {
143
150
this . scale ( 1 / length ) ;
144
151
}
145
- return this ;
152
+ return this as unknown as Vector2 | Vector3 ;
146
153
}
147
154
148
- public absolute ( a ?: 'x' | 'y' | 'z' ) : Vector {
155
+ public absolute ( a ?: 'x' | 'y' | 'z' ) : Vector2 | Vector3 {
149
156
for ( const axis in this ) {
150
157
if ( this . hasOwnProperty ( axis ) ) {
151
158
if ( ! a || a === axis ) {
152
159
( this [ axis ] as number ) = Math . abs ( this [ axis ] ) ;
153
160
}
154
161
}
155
162
}
156
- return this ;
163
+ return this as unknown as Vector2 | Vector3 ;
157
164
}
158
165
159
- public opposite ( a ?: 'x' | 'y' | 'z' ) : Vector {
166
+ public opposite ( a ?: 'x' | 'y' | 'z' ) : Vector2 | Vector3 {
160
167
for ( const axis in this ) {
161
168
if ( this . hasOwnProperty ( axis ) ) {
162
169
if ( ! a || a === axis ) {
163
170
( this [ axis ] as number ) = - this [ axis ] ;
164
171
}
165
172
}
166
173
}
167
- return this ;
174
+ return this as unknown as Vector2 | Vector3 ;
168
175
}
169
176
170
- public dotProduct ( v : Vector ) : number { //scalar product
177
+ public dotProduct ( v : Vector2 | Vector3 ) : number { //scalar product
171
178
let dotProduct = 0 ;
172
179
for ( const axis in this ) {
173
180
if ( this . hasOwnProperty ( axis ) && v . hasOwnProperty ( axis ) ) {
@@ -190,7 +197,7 @@ export class Vector {
190
197
}
191
198
}
192
199
193
- protected copy ( v : Vector ) : Vector {
200
+ protected copy ( v : Vector2 | Vector3 ) : Vector2 | Vector3 {
194
201
return this . updateAxesByVector ( '=' , v , null ) ;
195
202
}
196
203
@@ -205,40 +212,40 @@ export class Vector {
205
212
return true ;
206
213
}
207
214
208
- protected updateAxes ( operator : UpdateOperator , scalar : number ) : Vector {
215
+ protected updateAxes ( operator : UpdateOperator , scalar : number ) : Vector2 | Vector3 {
209
216
for ( const axis in this ) {
210
217
if ( this . hasOwnProperty ( axis ) ) {
211
218
this [ operator ] ( axis , scalar ) ;
212
219
}
213
220
}
214
- return this ;
221
+ return this as unknown as Vector2 | Vector3 ;
215
222
}
216
223
217
- private updateAxesByVector ( operator : UpdateOperator , vector : Vector , scalar : number | null ) : Vector {
224
+ private updateAxesByVector ( operator : UpdateOperator , vector : Vector2 | Vector3 , scalar : number | null ) : Vector2 | Vector3 {
218
225
for ( const axis in this ) {
219
226
if ( this . hasOwnProperty ( axis ) && vector . hasOwnProperty ( axis ) ) {
220
227
this [ operator ] ( axis , vector [ axis ] * ( scalar ?? 1.0 ) ) ;
221
228
}
222
229
}
223
- return this ;
230
+ return this as unknown as Vector2 | Vector3 ;
224
231
}
225
232
226
- private updateAxesWithMath ( scalar : number , operator : 'max' | 'min' ) : Vector {
233
+ private updateAxesWithMath ( scalar : number , operator : 'max' | 'min' ) : Vector2 | Vector3 {
227
234
for ( const axis in this ) {
228
235
if ( this . hasOwnProperty ( axis ) ) {
229
236
( this [ axis ] as number ) = Math [ operator ] ( this [ axis ] , scalar ) ;
230
237
}
231
238
}
232
- return this ;
239
+ return this as unknown as Vector2 | Vector3 ;
233
240
}
234
241
235
- private updateAxesWithMathByVector ( v : Vector , operator : 'max' | 'min' ) : Vector {
242
+ private updateAxesWithMathByVector ( v : Vector2 | Vector3 , operator : 'max' | 'min' ) : Vector2 | Vector3 {
236
243
for ( const axis in this ) {
237
244
if ( this . hasOwnProperty ( axis ) && v . hasOwnProperty ( axis ) ) {
238
245
( this [ axis ] as number ) = Math [ operator ] ( this [ axis ] , v [ axis ] ) ;
239
246
}
240
247
}
241
- return this ;
248
+ return this as unknown as Vector2 | Vector3 ;
242
249
}
243
250
244
251
private '<=' ( axis : Extract < keyof this, string > , value : number ) : boolean {
0 commit comments