summaryrefslogtreecommitdiff
path: root/2026/games_submissions/crm148/vec2.js
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-08-26 23:47:59 -0400
committerLLLL Colonq <llll@colonq>2026-08-26 23:47:59 -0400
commit0d2d8cd897e94bd94e0b3ae7c6ce9aa580a44a0a (patch)
treee9039d1c3aedca515d6cb499451d4b73aca4f5fd /2026/games_submissions/crm148/vec2.js
parent242943e5b023ce40eb3be826c418a478d4672f78 (diff)
Add a_tension_span
Diffstat (limited to '2026/games_submissions/crm148/vec2.js')
-rw-r--r--2026/games_submissions/crm148/vec2.js61
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);
+ }
+}