aboutsummaryrefslogtreecommitdiff
path: root/src/model/vec2.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/vec2.ts')
-rw-r--r--src/model/vec2.ts73
1 files changed, 68 insertions, 5 deletions
diff --git a/src/model/vec2.ts b/src/model/vec2.ts
index 4bec53d..46ffc7e 100644
--- a/src/model/vec2.ts
+++ b/src/model/vec2.ts
@@ -1,15 +1,78 @@
+import * as Number from 'util/number'
+import * as Size from 'model/size'
+
export interface Vec2 {
x: number,
y: number,
}
-export function zero(): Vec2 {
- return {
- x: 0,
- y: 0,
- }
+export const zero: Vec2 = {
+ x: 0,
+ y: 0,
}
export function equals(v1: Vec2, v2: Vec2): boolean {
return v1.x === v2.x && v1.y === v2.y
}
+
+export function length(v: Vec2): number {
+ return Math.sqrt(v.x ** 2 + v.y ** 2)
+}
+
+export function normalize(v: Vec2): Vec2 {
+ if (v.x === 0 && v.y === 0) {
+ return zero
+ } else {
+ const im = 1 / length(v)
+ return {
+ x: v.x * im,
+ y: v.y * im
+ }
+ }
+}
+
+export function applyOnLength(f: (n: number) => number, v: Vec2): Vec2 {
+ return scale(normalize(v), f(length(v)))
+}
+
+export function sub(v1: Vec2, v2: Vec2): Vec2 {
+ return {
+ x: v1.x - v2.x,
+ y: v1.y - v2.y
+ }
+}
+
+export function div(v: Vec2, k: number): Vec2 {
+ return {
+ x: v.x / k,
+ y: v.y / k
+ }
+}
+
+export function add(v1: Vec2, v2: Vec2): Vec2 {
+ return {
+ x: v1.x + v2.x,
+ y: v1.y + v2.y
+ }
+}
+
+export function scale(v: Vec2, k: number): Vec2 {
+ return {
+ x: v.x * k,
+ y: v.y * k
+ }
+}
+
+export function clamp(v: Vec2, vMin: Vec2, vMax: Vec2): Vec2 {
+ return {
+ x: Number.clamp(v.x, vMin.x, vMax.x),
+ y: Number.clamp(v.y, vMin.y, vMax.y)
+ }
+}
+
+export function project(from: Size.Size, to: Size.Size, v: Vec2): Vec2 {
+ return {
+ x: v.x / from.width * to.width,
+ y: v.y / from.height * to.height
+ }
+}