summaryrefslogtreecommitdiff
path: root/2026/games_submissions/ellg/vector.js
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-07-17 03:10:43 -0400
committerLLLL Colonq <llll@colonq>2026-07-17 03:10:43 -0400
commit07a36f2b38a5cba402ebc5158710f5a85f443456 (patch)
treef28855384eadc73f49cc1a707a73896f87bc5530 /2026/games_submissions/ellg/vector.js
parent951b316773265052fbc5fa546bbcf31bef277062 (diff)
Post-stream update
Diffstat (limited to '2026/games_submissions/ellg/vector.js')
-rw-r--r--2026/games_submissions/ellg/vector.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/2026/games_submissions/ellg/vector.js b/2026/games_submissions/ellg/vector.js
new file mode 100644
index 0000000..cf32d81
--- /dev/null
+++ b/2026/games_submissions/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)
+ }
+}