--- title: Sutherland-Hodgman polygon clipping --- # Sutherland-Hodgman polygon clipping --- ## Solutions
Solution 1 (Click to Show/Hide) ```javascript function clip(subjectPolygon, clipPolygon) { var cp1, cp2, s, e, i, j; var inside = function(p) { return (cp2[0] - cp1[0]) * (p[1] - cp1[1]) > (cp2[1] - cp1[1]) * (p[0] - cp1[0]); }; var intersection = function() { var dc = [cp1[0] - cp2[0], cp1[1] - cp2[1]], dp = [s[0] - e[0], s[1] - e[1]], n1 = cp1[0] * cp2[1] - cp1[1] * cp2[0], n2 = s[0] * e[1] - s[1] * e[0], n3 = 1.0 / (dc[0] * dp[1] - dc[1] * dp[0]); return [(n1 * dp[0] - n2 * dc[0]) * n3, (n1 * dp[1] - n2 * dc[1]) * n3]; }; var outputList = subjectPolygon; cp1 = clipPolygon[clipPolygon.length - 1]; for (j in clipPolygon) { var cp2 = clipPolygon[j]; var inputList = outputList; outputList = []; s = inputList[inputList.length - 1]; //last on the input list for (i in inputList) { var e = inputList[i]; if (inside(e)) { if (!inside(s)) { outputList.push(intersection()); } outputList.push(e); } else if (inside(s)) { outputList.push(intersection()); } s = e; } cp1 = cp2; } return outputList.map(e => e.map(f => Math.round(f * 1000) / 1000)); } ```