74 lines
1.7 KiB
JavaScript
74 lines
1.7 KiB
JavaScript
class Vector {
|
|
constructor(x, y, z) {
|
|
if (arguments.length === 1) {
|
|
z = x.z;
|
|
y = x.y;
|
|
x = x.x;
|
|
}
|
|
this.x = x;
|
|
this.y = y;
|
|
if (z !== undefined) {
|
|
this.z = z;
|
|
}
|
|
}
|
|
dist(other, y, z = 0) {
|
|
if (y !== undefined) other = { x: other, y, z };
|
|
let sum = 0;
|
|
sum += (this.x - other.x) ** 2;
|
|
sum += (this.y - other.y) ** 2;
|
|
let z1 = this.z ? this.z : 0;
|
|
let z2 = other.z ? other.z : 0;
|
|
sum += (z1 - z2) ** 2;
|
|
return sum ** 0.5;
|
|
}
|
|
normalize(f) {
|
|
let mag = this.dist(0, 0, 0);
|
|
return new Vector((f * this.x) / mag, (f * this.y) / mag, (f * this.z) / mag);
|
|
}
|
|
getAngle() {
|
|
return -Math.atan2(this.y, this.x);
|
|
}
|
|
reflect(other) {
|
|
let p = new Vector(other.x - this.x, other.y - this.y);
|
|
if (other.z !== undefined) {
|
|
p.z = other.z;
|
|
if (this.z !== undefined) {
|
|
p.z -= this.z;
|
|
}
|
|
}
|
|
return this.subtract(p);
|
|
}
|
|
add(other) {
|
|
let p = new Vector(this.x + other.x, this.y + other.y);
|
|
if (this.z !== undefined) {
|
|
p.z = this.z;
|
|
if (other.z !== undefined) {
|
|
p.z += other.z;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
subtract(other) {
|
|
let p = new Vector(this.x - other.x, this.y - other.y);
|
|
if (this.z !== undefined) {
|
|
p.z = this.z;
|
|
if (other.z !== undefined) {
|
|
p.z -= other.z;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
scale(f = 1) {
|
|
if (f === 0) {
|
|
return new Vector(0, 0, this.z === undefined ? undefined : 0);
|
|
}
|
|
let p = new Vector(this.x * f, this.y * f);
|
|
if (this.z !== undefined) {
|
|
p.z = this.z * f;
|
|
}
|
|
return p;
|
|
}
|
|
}
|
|
|
|
export { Vector };
|
|
|