50 lines
1.3 KiB
Markdown
50 lines
1.3 KiB
Markdown
![]() |
---
|
||
|
title: Sutherland-Hodgman polygon clipping
|
||
|
---
|
||
|
# Sutherland-Hodgman polygon clipping
|
||
|
|
||
|
---
|
||
|
## Solutions
|
||
|
|
||
|
<details><summary>Solution 1 (Click to Show/Hide)</summary>
|
||
|
|
||
|
```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));
|
||
|
}
|
||
|
```
|
||
|
|
||
|
</details>
|