diff options
| author | LLLL Colonq <llll@colonq> | 2026-08-26 23:47:59 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-08-26 23:47:59 -0400 |
| commit | 0d2d8cd897e94bd94e0b3ae7c6ce9aa580a44a0a (patch) | |
| tree | e9039d1c3aedca515d6cb499451d4b73aca4f5fd /2026/games_submissions/crm148/vec2.js | |
| parent | 242943e5b023ce40eb3be826c418a478d4672f78 (diff) | |
Add a_tension_span
Diffstat (limited to '2026/games_submissions/crm148/vec2.js')
| -rw-r--r-- | 2026/games_submissions/crm148/vec2.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/2026/games_submissions/crm148/vec2.js b/2026/games_submissions/crm148/vec2.js new file mode 100644 index 0000000..230dad9 --- /dev/null +++ b/2026/games_submissions/crm148/vec2.js @@ -0,0 +1,61 @@ + +export default class Vec2 { + constructor(x, y) { + this.x = x; + this.y = y; + } + + static zero() { + return new Vec2(0, 0); + } + + static fromHeading(radians) { + return new Vec2(Math.cos(radians), Math.sin(radians)); + } + + static fromHeadingLength(radians, length) { + return Vec2.fromHeading(radians).scale(length); + } + + length() { + return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); + } + + heading() { + return Math.atan2(this.y, this.x); + } + + scale(factor) { + this.x *= factor; + this.y *= factor; + return this; + } + + scaled(factor) { + return new Vec2(this.x * factor, this.y * factor); + } + + ofLength(newLength) { + return this.normalized().scale(newLength); + } + + add(v2) { + return new Vec2(this.x + v2.x, this.y + v2.y); + } + + sub(v2) { + return new Vec2(this.x - v2.x, this.y - v2.y); + } + + normalize() { + var len = this.length(); + this.x = this.x / len; + this.y = this.y / len; + return this; + } + + normalized() { + var len = this.length(); + return new Vec2(this.x / len, this.y / len); + } +} |
