mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-21 19:41:23 +01:00
Fixed Dependency
This commit is contained in:
parent
957f62317b
commit
c93022b395
1 changed files with 1 additions and 103 deletions
104
libs/lineclip.js
104
libs/lineclip.js
|
|
@ -1,103 +1 @@
|
|||
'use strict';
|
||||
// lineclip by mourner, https://github.com/mapbox/lineclip
|
||||
// Cohen-Sutherland line clippign algorithm, adapted to efficiently
|
||||
// handle polylines rather than just segments
|
||||
function lineclip(points, bbox, result) {
|
||||
var len = points.length,
|
||||
codeA = bitCode(points[0], bbox),
|
||||
part = [],
|
||||
i, a, b, codeB, lastCode;
|
||||
if (!result) result = [];
|
||||
|
||||
for (i = 1; i < len; i++) {
|
||||
a = points[i - 1];
|
||||
b = points[i];
|
||||
codeB = lastCode = bitCode(b, bbox);
|
||||
|
||||
while (true) {
|
||||
if (!(codeA | codeB)) { // accept
|
||||
part.push(a);
|
||||
|
||||
if (codeB !== lastCode) { // segment went outside
|
||||
part.push(b);
|
||||
if (i < len - 1) { // start a new line
|
||||
result.push(part);
|
||||
part = [];
|
||||
}
|
||||
} else if (i === len - 1) {
|
||||
part.push(b);
|
||||
}
|
||||
break;
|
||||
|
||||
} else if (codeA & codeB) { // trivial reject
|
||||
break;
|
||||
} else if (codeA) { // a outside, intersect with clip edge
|
||||
a = intersect(a, b, codeA, bbox);
|
||||
codeA = bitCode(a, bbox);
|
||||
} else { // b outside
|
||||
b = intersect(a, b, codeB, bbox);
|
||||
codeB = bitCode(b, bbox);
|
||||
}
|
||||
}
|
||||
codeA = lastCode;
|
||||
}
|
||||
|
||||
if (part.length) result.push(part);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Sutherland-Hodgeman polygon clipping algorithm
|
||||
function polygonclip(points, bbox, secure = 0) {
|
||||
var result, edge, prev, prevInside, inter, i, p, inside;
|
||||
|
||||
// clip against each side of the clip rectangle
|
||||
for (edge = 1; edge <= 8; edge *= 2) {
|
||||
result = [];
|
||||
prev = points[points.length-1];
|
||||
prevInside = !(bitCode(prev, bbox) & edge);
|
||||
|
||||
for (i = 0; i < points.length; i++) {
|
||||
p = points[i];
|
||||
inside = !(bitCode(p, bbox) & edge);
|
||||
inter = inside !== prevInside; // segment goes through the clip window
|
||||
|
||||
const pi = intersect(prev, p, edge, bbox);
|
||||
if (inter) result.push(pi); // add an intersection point
|
||||
if (secure && inter) result.push(pi, pi); // add additional intersection points to secure correct d3 curve
|
||||
if (inside) result.push(p); // add a point if it's inside
|
||||
|
||||
prev = p;
|
||||
prevInside = inside;
|
||||
}
|
||||
points = result;
|
||||
if (!points.length) break;
|
||||
}
|
||||
//result.forEach(p => debug.append("circle").attr("cx", p[0]).attr("cy", p[1]).attr("r", .6).attr("fill", "red"));
|
||||
return result;
|
||||
}
|
||||
|
||||
// intersect a segment against one of the 4 lines that make up the bbox
|
||||
function intersect(a, b, edge, bbox) {
|
||||
return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
|
||||
edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
|
||||
edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
|
||||
edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : null; // left
|
||||
}
|
||||
|
||||
// bit code reflects the point position relative to the bbox:
|
||||
// left mid right
|
||||
// top 1001 1000 1010
|
||||
// mid 0001 0000 0010
|
||||
// bottom 0101 0100 0110
|
||||
function bitCode(p, bbox) {
|
||||
var code = 0;
|
||||
|
||||
if (p[0] < bbox[0]) code |= 1; // left
|
||||
else if (p[0] > bbox[2]) code |= 2; // right
|
||||
|
||||
if (p[1] < bbox[1]) code |= 4; // bottom
|
||||
else if (p[1] > bbox[3]) code |= 8; // top
|
||||
|
||||
return code;
|
||||
}
|
||||
"use strict";function lineclip(t,e,n){var r,i,o,u,s,h=t.length,c=bitCode(t[0],e),f=[];for(n||(n=[]),r=1;r<h;r++){for(i=t[r-1],u=s=bitCode(o=t[r],e);;){if(!(c|u)){f.push(i),u!==s?(f.push(o),r<h-1&&(n.push(f),f=[])):r===h-1&&f.push(o);break}if(c&u)break;c?c=bitCode(i=intersect(i,o,c,e),e):u=bitCode(o=intersect(i,o,u,e),e)}c=s}return f.length&&n.push(f),n}function polygonclip(t,e,n=0){var r,i,o,u,s,h,c,f;for(i=1;i<=8;i*=2){for(r=[],u=!(bitCode(o=t[t.length-1],e)&i),h=0;h<t.length;h++){s=(f=!(bitCode(c=t[h],e)&i))!==u;const l=intersect(o,c,i,e);s&&r.push(l),n&&s&&r.push(l,l),f&&r.push(c),o=c,u=f}if(!(t=r).length)break}return r}function intersect(t,e,n,r){return 8&n?[t[0]+(e[0]-t[0])*(r[3]-t[1])/(e[1]-t[1]),r[3]]:4&n?[t[0]+(e[0]-t[0])*(r[1]-t[1])/(e[1]-t[1]),r[1]]:2&n?[r[2],t[1]+(e[1]-t[1])*(r[2]-t[0])/(e[0]-t[0])]:1&n?[r[0],t[1]+(e[1]-t[1])*(r[0]-t[0])/(e[0]-t[0])]:null}function bitCode(t,e){var n=0;return t[0]<e[0]?n|=1:t[0]>e[2]&&(n|=2),t[1]<e[1]?n|=4:t[1]>e[3]&&(n|=8),n}
|
||||
Loading…
Add table
Add a link
Reference in a new issue