function projectCollisions(polygons) {
let npoly = polygons.length;
let newPolygons = [];
let pairs = sap(polygons, [1, 0]);
for (let i = 0; i < npoly; i++) {
let a = polygons[i];
for (let j of pairs[i]) {
let b = polygons[j];
let hit = gjk(a, b);
if (hit) {
let { p, q, n } = epa(a, b, ...hit);
let ptsA = supportEdge(a, n);
console.assert(ptsA.length > 0);
let ptsB = supportEdge(b, [-n[0], -n[1]]);
console.assert(ptsB.length > 0);
let center = centerOfMass(ptsA.concat(ptsB));
let [ha, hb, hc] = halfSpace(center, n);
let acopy = newPolygons[i] || a.slice();
acopy.forEach((pt, i) => {
if (ha * pt[0] + hb * pt[1] + hc > 0)
acopy[i] = projectPointLine(pt, ha, hb, hc);
});
newPolygons[i] = acopy;
let bcopy = newPolygons[j] || b.slice();
bcopy.forEach((pt, i) => {
if (ha * pt[0] + hb * pt[1] + hc < 0)
bcopy[i] = projectPointLine(pt, ha, hb, hc);
});
newPolygons[j] = bcopy;
}
}
}
return newPolygons;
}