vec2 = {
let vec2 = Object.assign({}, glmatrix.vec2);
let mat3 = glmatrix.mat3;
vec2.orient = function (a, b, c) {
return Math.sign(
mat3.determinant([1, a[0], a[1], 1, b[0], b[1], 1, c[0], c[1]])
);
};
vec2.segmentsIntersect = function (a, b, c, d) {
return (
vec2.orient(a, b, c) != vec2.orient(a, b, d) &&
vec2.orient(c, d, a) != vec2.orient(c, d, b)
);
};
vec2.lineIntersection = function (
out,
[x1, y1],
[x2, y2],
[x3, y3],
[x4, y4]
) {
const D = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
const a = x1 * y2 - y1 * x2,
b = x3 * y4 - y3 * x4;
out[0] = (a * (x3 - x4) - (x1 - x2) * b) / D;
out[1] = (a * (y3 - y4) - (y1 - y2) * b) / D;
return out;
};
vec2.orthoProj = function (out, u, v) {
const vnorm = vec2.normalize([], v);
return vec2.scale([], vnorm, vec2.dot(vnorm, u));
};
vec2.distSegment = function (p, a, b) {
const v = vec2.sub([], b, a);
const u = vec2.sub([], p, a);
const vlen = vec2.len(v);
const vnorm = vec2.scale([], v, 1 / vlen);
const projSize = vec2.dot(vnorm, u);
if (projSize > vlen) return vec2.dist(p, b);
if (projSize < 0) return vec2.dist(p, a);
return vec2.len(vec2.sub([], p, vec2.lerp([], a, b, projSize / vlen)));
};
return vec2;
}