diff options
| author | LLLL Colonq <llll@colonq> | 2026-08-04 04:35:44 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-08-04 04:35:44 -0400 |
| commit | 3c7796f066647090ed8436778bdfe25f11844c05 (patch) | |
| tree | 0644a101004d91af4fcdc2f51fcc2e03f7f255ce /2026/games/ellg/vector.js | |
| parent | a75221ab93f59d688f90cd83f0284ff98951fcfa (diff) | |
Prepare for upload
Diffstat (limited to '2026/games/ellg/vector.js')
| -rw-r--r-- | 2026/games/ellg/vector.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/2026/games/ellg/vector.js b/2026/games/ellg/vector.js new file mode 100644 index 0000000..cf32d81 --- /dev/null +++ b/2026/games/ellg/vector.js @@ -0,0 +1,64 @@ +export class Vector { + static of([x, y]) { + return new Vector(x, y) + } + + constructor(x, y) { + this.x = x + this.y = y + } + + add(val) { + return new Vector(this.x + val.x, this.y + val.y) + } + + subtract(val) { + return new Vector(this.x - val.x, this.y - val.y) + } + + multiply(scalar) { + return new Vector(this.x * scalar, this.y * scalar) + } + + divide(scalar) { + return new Vector(this.x / scalar, this.y / scalar) + } + + dot(other) { + return this.x * other.x + this.y * other.y + } + + cross(other) { + return this.x * other.y - other.x * this.y + } + + hadamard(other) { + return new Vector(this.x * other.x, this.y * other.y) + } + + length() { + return Math.sqrt(this.x ** 2 + this.y ** 2) + } + + distance(other) { + return this.subtract(other).length() + } + + normalize() { + const length = this.length() + if (length === 0) { + return new Vector(0, 0) + } + return new Vector(this.x / length, this.y / length) + } + + rotateByRadians(radians) { + const cos = Math.cos(radians) + const sin = Math.sin(radians) + return new Vector(this.x * cos - this.y * sin, this.x * sin + this.y * cos) + } + + rotateByDegrees(degrees) { + return this.rotateByRadians((degrees * Math.PI) / 180) + } +} |
