117 lines
2.3 KiB
TypeScript
Raw Permalink Normal View History

2023-05-21 15:53:32 +08:00
import { Vec2 } from "cc";
export class Vector2 {
x = 0;
y = 0;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
plus(vector: Vector2) {
return new Vector2(this.x + vector.x, this.y + vector.y);
}
minus(vector: Vector2) {
return new Vector2(this.x - vector.x, this.y - vector.y);
}
multiply(vector: Vector2) {
return this.x * vector.x + this.y * vector.y;
}
scale(k: number) {
return new Vector2(this.x * k, this.y * k);
}
copy(v: Vector2 | Vec2) {
this.x = v.x;
this.y = v.y;
return this;
}
clone() {
return new Vector2(this.x, this.y);
}
substract(out: Vector2, other: Vector2) {
out.x -= other.x;
out.y -= other.y;
return out;
}
lengthSqr() {
return this.x ** 2 + this.y ** 2;
}
}
export class Obstacle {
next: Obstacle;
previous: Obstacle;
direction: Vector2;
point: Vector2;
id: number;
convex: boolean;
}
export class Line {
point: Vector2;
direction: Vector2;
}
export class KeyValuePair<K, V> {
key: K;
value: V;
constructor(key: K, value: V) {
this.key = key;
this.value = value;
}
}
export class RVOMath {
static RVO_EPSILON = 0.00001;
static absSq(v: Vector2) {
return v.multiply(v);
};
static normalize(v: Vector2) {
return v.scale(1 / RVOMath.abs(v)); // v / abs(v)
};
static distSqPointLineSegment(vector1: Vector2, vector2: Vector2, vector3: Vector2) {
let aux1 = vector3.minus(vector1);
let aux2 = vector2.minus(vector1);
let r = aux1.multiply(aux2) / RVOMath.absSq(aux2);
if (r < 0) {
return RVOMath.absSq(aux1);
}
else if (r > 1) {
return RVOMath.absSq(vector3.minus(vector2));
}
else {
return RVOMath.absSq(vector3.minus(vector1.plus(aux2.scale(r))));
}
};
static sqr(p: number) {
return p * p;
};
static det(v1: Vector2, v2: Vector2) {
return v1.x * v2.y - v1.y * v2.x;
};
static abs(v: Vector2) {
return Math.sqrt(RVOMath.absSq(v));
};
static leftOf(a: Vector2, b: Vector2, c: Vector2) {
return RVOMath.det(a.minus(c), b.minus(a));
};
}