Webpage for Games
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

90 lines
1.6 KiB

export class Vector {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y
}
static fromAngle(angle: number) {
return new Vector(Math.cos(angle), Math.sin(angle))
}
static sub(v1: Vector, v2: Vector) {
return new Vector(v1.x - v2.x, v1.y - v2.y)
}
static div(v1: Vector, divider: number): Vector {
return new Vector(v1.x / divider, v1.y / divider)
}
add(other: Vector): Vector {
this.x += other.x;
this.y += other.y;
return this
}
mult(scalar: number): Vector {
this.x *= scalar;
this.y *= scalar;
return this
}
addMag(length: number): Vector {
this.setMag(this.mag() + length);
return this
}
setMag(length: number): Vector {
let mag = this.mag();
this.x /= mag;
this.y /= mag;
this.x *= length;
this.y *= length;
return this
}
rotate(rad: number): Vector {
let r = this.rotated(rad);
this.x = r.x;
this.y = r.y;
return this
}
copy(): Vector {
return new Vector(this.x, this.y)
}
heading(): number {
let r = this.rotated(Math.PI / -2);
return Math.atan2(r.x, -r.y)
}
mag() {
return Math.sqrt(this.x * this.x + this.y * this.y)
}
serialized(): Serialized.Vector {
return {
x: this.x,
y: this.y
};
}
private rotated(rad: number): Vector {
let x = Math.cos(rad) * this.x - Math.sin(rad) * this.y,
y = Math.sin(rad) * this.x + Math.cos(rad) * this.y;
return new Vector(x, y)
}
}
export let p = {
createVector: (x: number, y: number): Vector => {
return new Vector(x, y)
},
dist: (x1: number, y1: number, x2: number, y2: number): number => {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))
}
};