function lineJoin(context, p0, p1, p2, p3, width) {
const u12 = perp(p1, p2);
const r = width / 2;
let a = [p1[0] + u12[0] * r, p1[1] + u12[1] * r];
let b = [p2[0] + u12[0] * r, p2[1] + u12[1] * r];
let c = [p2[0] - u12[0] * r, p2[1] - u12[1] * r];
let d = [p1[0] - u12[0] * r, p1[1] - u12[1] * r];
if (p0) {
const u01 = perp(p0, p1);
const e = [p1[0] + u01[0] + u12[0], p1[1] + u01[1] + u12[1]];
a = lineIntersect(p1, e, a, b);
d = lineIntersect(p1, e, d, c);
}
if (p3) {
const u23 = perp(p2, p3);
const e = [p2[0] + u23[0] + u12[0], p2[1] + u23[1] + u12[1]];
b = lineIntersect(p2, e, a, b);
c = lineIntersect(p2, e, d, c);
}
context.moveTo(...a);
context.lineTo(...b);
context.lineTo(...c);
context.lineTo(...d);
context.closePath();
}