function polygonClip(clip, subject) {
const closed = polygonClosed(subject);
const n = clip.length - polygonClosed(clip);
subject = subject.slice();
for (let i = 0, a = clip[n - 1], b, c, d; i < n; ++i) {
const input = subject.slice();
const m = input.length - closed;
subject.length = 0;
b = clip[i];
c = input[m - 1];
for (let j = 0; j < m; ++j) {
d = input[j];
if (lineOrient(d, a, b)) {
if (!lineOrient(c, a, b)) {
subject.push(lineIntersect(c, d, a, b));
}
subject.push(d);
} else if (lineOrient(c, a, b)) {
subject.push(lineIntersect(c, d, a, b));
}
c = d;
}
if (closed) subject.push(subject[0]);
a = b;
}
return subject.length ? subject : null;
}