Fantasy-Map-Generator/libs/lineclip.js
2020-10-10 14:27:11 -05:00

1 line
No EOL
1 KiB
JavaScript

"use strict";function lineclip(e,i,n){var t,l,o,r,p,u=e.length,c=bitCode(e[0],i),s=[];for(n||(n=[]),t=1;t<u;t++){for(l=e[t-1],r=p=bitCode(o=e[t],i);;){if(!(c|r)){s.push(l),r!==p?(s.push(o),t<u-1&&(n.push(s),s=[])):t===u-1&&s.push(o);break}if(c&r)break;c?c=bitCode(l=intersect(l,o,c,i),i):r=bitCode(o=intersect(l,o,r,i),i)}c=p}return s.length&&n.push(s),n}function polygonclip(e,i){var n,t,l,o,r,p,u;for(t=1;t<=8;t*=2){for(n=[],o=!(bitCode(l=e[e.length-1],i)&t),r=0;r<e.length;r++)(u=!(bitCode(p=e[r],i)&t))!==o&&n.push(intersect(l,p,t,i)),u&&n.push(p),l=p,o=u;if(!(e=n).length)break}return n}function intersect(e,i,n,t){return 8&n?[e[0]+(i[0]-e[0])*(t[3]-e[1])/(i[1]-e[1]),t[3]]:4&n?[e[0]+(i[0]-e[0])*(t[1]-e[1])/(i[1]-e[1]),t[1]]:2&n?[t[2],e[1]+(i[1]-e[1])*(t[2]-e[0])/(i[0]-e[0])]:1&n?[t[0],e[1]+(i[1]-e[1])*(t[0]-e[0])/(i[0]-e[0])]:null}function bitCode(e,i){var n=0;return e[0]<i[0]?n|=1:e[0]>i[2]&&(n|=2),e[1]<i[1]?n|=4:e[1]>i[3]&&(n|=8),n}module.exports=lineclip,lineclip.polyline=lineclip,lineclip.polygon=polygonclip;