-
-
Notifications
You must be signed in to change notification settings - Fork 57
/
Vector3.ts
120 lines (99 loc) · 3.05 KB
/
Vector3.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Source: https://raw.githubusercontent.com/you21979/typescript-vector/master/vector3.ts
export interface IVec3 {
x: number;
y: number;
z: number;
}
export class Vector3 implements IVec3 {
public static create(v1: number | IVec3): Vector3 {
if (typeof v1 === 'number') {
return new Vector3(v1, v1, v1);
}
return new Vector3(v1.x, v1.y, v1.z);
}
public static clone(v1: IVec3): Vector3 {
return Vector3.create(v1);
}
public static add(v1: IVec3, v2: number | IVec3): Vector3 {
if (typeof v2 === 'number') {
return new Vector3(v1.x + v2, v1.y + v2, v1.z + v2);
}
return new Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}
public static subtract(v1: IVec3, v2: IVec3): Vector3 {
return new Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
}
public static multiply(v1: IVec3, v2: IVec3 | number): Vector3 {
if (typeof v2 === 'number') {
return new Vector3(v1.x * v2, v1.y * v2, v1.z * v2);
}
return new Vector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);
}
public static divide(v1: IVec3, v2: IVec3 | number): Vector3 {
if (typeof v2 === 'number') {
return new Vector3(v1.x / v2, v1.y / v2, v1.z / v2);
}
return new Vector3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);
}
public static dotProduct(v1: IVec3, v2: IVec3): number {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
public static crossProduct(v1: IVec3, v2: IVec3): Vector3 {
const x = v1.y * v2.z - v1.z * v2.y;
const y = v1.z * v2.x - v1.z * v2.z;
const z = v1.x * v2.y - v1.z * v2.x;
return new Vector3(x, y, z);
}
public static normalize(v: Vector3): Vector3 {
return Vector3.divide(v, v.Length);
}
constructor(public x: number, public y: number, public z: number) {}
public clone(): Vector3 {
return new Vector3(this.x, this.y, this.z);
}
/**
* The product of the Euclidean magnitudes of this and another Vector3.
*
* @param v Vector3 to find Euclidean magnitude between.
* @returns Euclidean magnitude with another vector.
*/
public distanceSquared(v: IVec3): number {
const w: Vector3 = this.subtract(v);
return Vector3.dotProduct(w, w);
}
/**
* The distance between two Vectors.
*
* @param v Vector3 to find distance between.
* @returns Distance between this and another vector.
*/
public distance(v: IVec3): number {
return Math.sqrt(this.distanceSquared(v));
}
public get normalize(): Vector3 {
return Vector3.normalize(this);
}
public crossProduct(v: IVec3): Vector3 {
return Vector3.crossProduct(this, v);
}
public add(v: number | IVec3): IVec3 {
return Vector3.add(this, v);
}
public subtract(v: IVec3): Vector3 {
return Vector3.subtract(this, v);
}
public multiply(v: number | IVec3): Vector3 {
return Vector3.multiply(this, v);
}
public divide(v: number | IVec3): IVec3 {
return Vector3.divide(this, v);
}
public replace(v: IVec3): void {
this.x = v.x;
this.y = v.y;
this.z = v.z;
}
public get Length(): number {
return this.distanceSquared(this);
}
}