fernandez-polygon-decomposition
Version:
An algorithm to decompose polygons with holes from "A practical algorithm for decomposing polygonal domains into convex polygons by diagonals" by J Fernández
2 lines (1 loc) • 20.3 kB
JavaScript
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((n=n||self).fernandezPolygonDecomposition={})}(this,(function(n){"use strict";function r(n){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n})(n)}function e(n,r,e){return r in n?Object.defineProperty(n,r,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[r]=e,n}function t(n,r){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(n);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable}))),e.push.apply(e,t)}return e}function o(n){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?t(o,!0).forEach((function(r){e(n,r,o[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(o)):t(o).forEach((function(r){Object.defineProperty(n,r,Object.getOwnPropertyDescriptor(o,r))}))}return n}function i(n,r){if(null==n)return{};var e,t,o=function(n,r){if(null==n)return{};var e,t,o={},i=Object.keys(n);for(t=0;t<i.length;t++)e=i[t],r.indexOf(e)>=0||(o[e]=n[e]);return o}(n,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);for(t=0;t<i.length;t++)e=i[t],r.indexOf(e)>=0||Object.prototype.propertyIsEnumerable.call(n,e)&&(o[e]=n[e])}return o}function u(n,r){return function(n){if(Array.isArray(n))return n}(n)||function(n,r){if(!(Symbol.iterator in Object(n)||"[object Arguments]"===Object.prototype.toString.call(n)))return;var e=[],t=!0,o=!1,i=void 0;try{for(var u,f=n[Symbol.iterator]();!(t=(u=f.next()).done)&&(e.push(u.value),!r||e.length!==r);t=!0);}catch(n){o=!0,i=n}finally{try{t||null==f.return||f.return()}finally{if(o)throw i}}return e}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function f(n){return function(n){if(Array.isArray(n)){for(var r=0,e=new Array(n.length);r<n.length;r++)e[r]=n[r];return e}}(n)||function(n){if(Symbol.iterator in Object(n)||"[object Arguments]"===Object.prototype.toString.call(n))return Array.from(n)}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var a=function(n,r){var e=0|n.length,t=0|r.length;if(1===e&&1===t)return function(n,r){var e=n+r,t=e-n,o=n-(e-t)+(r-t);if(o)return[o,e];return[e]}(n[0],-r[0]);var o,i,u=new Array(e+t),f=0,a=0,l=0,c=Math.abs,h=n[a],g=c(h),v=-r[l],y=c(v);g<y?(i=h,(a+=1)<e&&(h=n[a],g=c(h))):(i=v,(l+=1)<t&&(v=-r[l],y=c(v)));a<e&&g<y||l>=t?(o=h,(a+=1)<e&&(h=n[a],g=c(h))):(o=v,(l+=1)<t&&(v=-r[l],y=c(v)));var s,d,x=o+i,p=x-o,b=i-p,m=b,w=x;for(;a<e&&l<t;)g<y?(o=h,(a+=1)<e&&(h=n[a],g=c(h))):(o=v,(l+=1)<t&&(v=-r[l],y=c(v))),(b=(i=m)-(p=(x=o+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s;for(;a<e;)(b=(i=m)-(p=(x=(o=h)+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s,(a+=1)<e&&(h=n[a]);for(;l<t;)(b=(i=m)-(p=(x=(o=v)+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s,(l+=1)<t&&(v=-r[l]);m&&(u[f++]=m);w&&(u[f++]=w);f||(u[f++]=0);return u.length=f,u};var l=function(n,r){var e=a(n,r);return e[e.length-1]};var c=function(n){for(var r=n.length,e=n[n.length-1],t=r,o=r-2;o>=0;--o){var i=e,u=n[o];(a=u-((e=i+u)-i))&&(n[--t]=e,e=a)}var f=0;for(o=t;o<r;++o){var a;i=n[o];(a=(u=e)-((e=i+u)-i))&&(n[f++]=a)}return n[f++]=e,n.length=f,n};var h=function(n,r,e){var t=n*r,o=g*n,i=o-(o-n),u=n-i,f=g*r,a=f-(f-r),l=r-a,c=u*l-(t-i*a-u*a-i*l);if(e)return e[0]=c,e[1]=t,e;return[c,t]},g=+(Math.pow(2,27)+1);var v=function(n,r){var e=0|n.length,t=0|r.length;if(1===e&&1===t)return function(n,r){var e=n+r,t=e-n,o=n-(e-t)+(r-t);if(o)return[o,e];return[e]}(n[0],r[0]);var o,i,u=new Array(e+t),f=0,a=0,l=0,c=Math.abs,h=n[a],g=c(h),v=r[l],y=c(v);g<y?(i=h,(a+=1)<e&&(h=n[a],g=c(h))):(i=v,(l+=1)<t&&(v=r[l],y=c(v)));a<e&&g<y||l>=t?(o=h,(a+=1)<e&&(h=n[a],g=c(h))):(o=v,(l+=1)<t&&(v=r[l],y=c(v)));var s,d,x=o+i,p=x-o,b=i-p,m=b,w=x;for(;a<e&&l<t;)g<y?(o=h,(a+=1)<e&&(h=n[a],g=c(h))):(o=v,(l+=1)<t&&(v=r[l],y=c(v))),(b=(i=m)-(p=(x=o+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s;for(;a<e;)(b=(i=m)-(p=(x=(o=h)+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s,(a+=1)<e&&(h=n[a]);for(;l<t;)(b=(i=m)-(p=(x=(o=v)+i)-o))&&(u[f++]=b),m=w-((s=w+x)-(d=s-w))+(x-d),w=s,(l+=1)<t&&(v=r[l]);m&&(u[f++]=m);w&&(u[f++]=w);f||(u[f++]=0);return u.length=f,u};var y=function(n,r,e){var t=n+r,o=t-n,i=r-o,u=n-(t-o);if(e)return e[0]=u+i,e[1]=t,e;return[u+i,t]};var s=function(n,r){var e=n.length;if(1===e){var t=h(n[0],r);return t[0]?t:[t[1]]}var o=new Array(2*e),i=[.1,.1],u=[.1,.1],f=0;h(n[0],r,i),i[0]&&(o[f++]=i[0]);for(var a=1;a<e;++a){h(n[a],r,u);var l=i[1];y(l,u[0],i),i[0]&&(o[f++]=i[0]);var c=u[1],g=i[1],v=c+g,s=g-(v-c);i[1]=v,s&&(o[f++]=s)}i[1]&&(o[f++]=i[1]);0===f&&(o[f++]=0);return o.length=f,o};var d=function(n,r){return n(r={exports:{}},r.exports),r.exports}((function(n){var r=5;function e(n,r){for(var e=new Array(n.length-1),t=1;t<n.length;++t)for(var o=e[t-1]=new Array(n.length-1),i=0,u=0;i<n.length;++i)i!==r&&(o[u++]=n[t][i]);return e}function t(n){if(1===n.length)return n[0];if(2===n.length)return["sum(",n[0],",",n[1],")"].join("");var r=n.length>>1;return["sum(",t(n.slice(0,r)),",",t(n.slice(r)),")"].join("")}function o(n){if(2===n.length)return[["sum(prod(",n[0][0],",",n[1][1],"),prod(-",n[0][1],",",n[1][0],"))"].join("")];for(var r=[],i=0;i<n.length;++i)r.push(["scale(",t(o(e(n,i))),",",(u=i,1&u?"-":""),n[0][i],")"].join(""));return r;var u}function i(n){for(var r=[],i=[],u=function(n){for(var r=new Array(n),e=0;e<n;++e){r[e]=new Array(n);for(var t=0;t<n;++t)r[e][t]=["m",t,"[",n-e-1,"]"].join("")}return r}(n),f=[],l=0;l<n;++l)0==(1&l)?r.push.apply(r,o(e(u,l))):i.push.apply(i,o(e(u,l))),f.push("m"+l);var c=t(r),g=t(i),y="orientation"+n+"Exact",d=["function ",y,"(",f.join(),"){var p=",c,",n=",g,",d=sub(p,n);return d[d.length-1];};return ",y].join("");return new Function("sum","prod","scale","sub",d)(v,h,s,a)}var u=i(3),f=i(4),l=[function(){return 0},function(){return 0},function(n,r){return r[0]-n[0]},function(n,r,e){var t,o=(n[1]-e[1])*(r[0]-e[0]),i=(n[0]-e[0])*(r[1]-e[1]),f=o-i;if(o>0){if(i<=0)return f;t=o+i}else{if(!(o<0))return f;if(i>=0)return f;t=-(o+i)}var a=33306690738754716e-32*t;return f>=a||f<=-a?f:u(n,r,e)},function(n,r,e,t){var o=n[0]-t[0],i=r[0]-t[0],u=e[0]-t[0],a=n[1]-t[1],l=r[1]-t[1],c=e[1]-t[1],h=n[2]-t[2],g=r[2]-t[2],v=e[2]-t[2],y=i*c,s=u*l,d=u*a,x=o*c,p=o*l,b=i*a,m=h*(y-s)+g*(d-x)+v*(p-b),w=7771561172376103e-31*((Math.abs(y)+Math.abs(s))*Math.abs(h)+(Math.abs(d)+Math.abs(x))*Math.abs(g)+(Math.abs(p)+Math.abs(b))*Math.abs(v));return m>w||-m>w?m:f(n,r,e,t)}];function c(n){var r=l[n.length];return r||(r=l[n.length]=i(n.length)),r.apply(void 0,n)}!function(){for(;l.length<=r;)l.push(i(l.length));for(var e=[],t=["slow"],o=0;o<=r;++o)e.push("a"+o),t.push("o"+o);var u=["function getOrientation(",e.join(),"){switch(arguments.length){case 0:case 1:return 0;"];for(o=2;o<=r;++o)u.push("case ",o,":return o",o,"(",e.slice(0,o).join(),");");u.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation"),t.push(u.join(""));var f=Function.apply(void 0,t);for(n.exports=f.apply(void 0,[c].concat(l)),o=0;o<=r;++o)n.exports[o]=l[o]}()})),x=function(n,r){if(1===n.length)return s(r,n[0]);if(1===r.length)return s(n,r[0]);if(0===n.length||0===r.length)return[0];var e=[0];if(n.length<r.length)for(var t=0;t<n.length;++t)e=v(e,s(r,n[t]));else for(t=0;t<r.length;++t)e=v(e,s(n,r[t]));return e};var p=1e-8,b=!0;function m(n,r){if(void 0===n.id||void 0===r.id)throw new Error("A vertex must be defined by an unique id.");return n.id===r.id}function w(n,r){if(void 0===n.id||void 0===r.id)throw new Error("A vertex must be defined by an unique id.");return(n.originalId||n.id)===(r.originalId||r.id)}function j(n,r){return n.x===r.x&&n.y===r.y}function E(n,r){return(n.x-r.x)*(n.x-r.x)+(n.y-r.y)*(n.y-r.y)}function O(n){if(!N(n))throw new Error("The isClockwiseOrdered method only works with simple polygons");for(var r=n.length,e=0,t=n[0],o=1;o<r;o++){var i=n[o];(i.y<t.y||i.y===t.y&&i.x>t.x)&&(t=i,e=o)}return P(n[(e-1+r)%r],t,n[(e+1)%r])>0}function P(n,r,e){if(b){var t=d([n.x,n.y],[r.x,r.y],[e.x,e.y]);return 0===t?t:-t}return(r.x-n.x)*(e.y-n.y)-(r.y-n.y)*(e.x-n.x)}function S(n,r,e){return P(r,e,n)}var k=100,I=101;function M(n,r){return b?0!==function(n,r){var e=r[0];if(e.x===n.x&&e.y===n.y)return k;for(var t=r.length,o=0,i=0;i<t;i++){var u=r[i],f=r[(i+1)%t];if(f.y===n.y){if(f.x===n.x)return k;if(u.y===n.y&&f.x>n.x==u.x<n.x)return I}if(u.y<n.y!=f.y<n.y)if(u.x>=n.x)if(f.x>n.x)o+=f.y>u.y?1:-1;else{var c=a(x(a([u.x],[n.x]),a([f.y],[n.y])),x(a([f.x],[n.x]),a([u.y],[n.y]))),h=l(c,[0]);if(0===h)return I;h>0==f.y>u.y&&(o+=f.y>u.y?1:-1)}else if(f.x>n.x){var g=a(x(a([u.x],[n.x]),a([f.y],[n.y])),x(a([f.x],[n.x]),a([u.y],[n.y]))),v=l(g,[0]);if(0===v)return I;v>0==f.y>u.y&&(o+=f.y>u.y?1:-1)}}return o}(n,r):0!==function(n,r){var e=r[0];if(e.x===n.x&&e.y===n.y)return k;for(var t=r.length,o=0,i=0;i<t;i++){var u=r[i],f=r[(i+1)%t];if(f.y===n.y){if(f.x===n.x)return k;if(u.y===n.y&&f.x>n.x==u.x<n.x)return I}if(u.y<n.y!=f.y<n.y)if(u.x>=n.x)if(f.x>n.x)o+=f.y>u.y?1:-1;else{var a=(u.x-n.x)*(f.y-n.y)-(f.x-n.x)*(u.y-n.y);if(0===a)return I;a>0==f.y>u.y&&(o+=f.y>u.y?1:-1)}else if(f.x>n.x){var l=(u.x-n.x)*(f.y-n.y)-(f.x-n.x)*(u.y-n.y);if(0===l)return I;l>0==f.y>u.y&&(o+=f.y>u.y?1:-1)}}return o}(n,r)}function A(n,r){var e=r.length;return r.every((function(t,o){var i=r[(o+1)%e];return P(t,n,i)<=0}))}function L(n,r){return r.some((function(r){return M(r,n)}))}function D(n,r){var e=r.length,t=r.findIndex((function(r){return m(n,r)}));if(-1===t)throw new Error("could not find vertex");return r[(t+1)%e]}function C(n,r){var e=r.length,t=r.findIndex((function(r){return m(n,r)}));if(-1===t)throw new Error("could not find vertex");return r[(t-1+e)%e]}function R(n,r){return r.some((function(r){return j(r,n)}))}function H(n){var r=n.length;return n.filter((function(e,t){return P(n[(t-1+r)%r],e,n[(t+1)%r])<0}))}function T(n){for(var r=[],e=n.length,t=0;t<e;t++)r.push({a:n[t],b:n[(t+1)%e]});return r}function q(n,r){for(var e=r.length,t=r.findIndex((function(r){return m(n,r)})),o=(t+1)%e;o!==t;){if(P(r[(o-1+e)%e],r[o],r[(o+1)%e])<0)return r[o];o=(o+1)%e}return P(r[(o-1+e)%e],r[o],r[(o+1)%e])<0?r[o]:null}function F(n,r){var e=n.findIndex((function(n){return m(n,r[0])})),t=n.findIndex((function(n){return m(n,r[r.length-1])}));return e<t?[].concat(f(n.slice(0,e)),[n[e]],f(n.slice(t))):f(n.slice(t,e+1))}function _(n){var r=n.length;return n.every((function(e,t){return P(n[(t-1+r)%r],e,n[(t+1)%r])>=0}))}function z(n){var r=c(f(n));return r[r.length-1]}function J(n,r){if(b)return function(n,r){var e=n.a,t=e.x,o=e.y,i=n.b,u=i.x,f=i.y,c=r.a,h=c.x,g=c.y,v=r.b,y=v.x,s=v.y,d=a([s],[g]),p=a([u],[t]),b=a([y],[h]),m=a([f],[o]),w=a([o],[g]),j=a([t],[h]),E=a(x(d,p),x(b,m)),O=l(E,[0]);if(0===O)return null;var P,S,k,I,M=a(x(b,w),x(d,j)),A=a(x(p,w),x(m,j));O>0?(P=l(M,[0]),S=l(M,E),k=l(A,[0]),I=l(A,E)):(P=l([0],M),S=l(E,M),k=l([0],A),I=l(E,A));var L=z(E);return{x:t+z(x(M,p))/L,y:o+z(x(M,m))/L,insideSegment1:P>0&&S<0,onEdgeSegment1:0===P||0===S,insideSegment2:k>0&&I<0,onEdgeSegment2:0===k||0===I}}(n,r);var e=n.a,t=e.x,o=e.y,i=n.b,u=i.x,f=i.y,c=r.a,h=c.x,g=c.y,v=r.b,y=v.x,s=v.y,d=(s-g)*(u-t)-(y-h)*(f-o);if(Math.abs(d)<p)return null;var m=((y-h)*(o-g)-(s-g)*(t-h))/d,w=((u-t)*(o-g)-(f-o)*(t-h))/d;return{x:t+m*(u-t),y:o+m*(f-o),insideSegment1:m>0&&m<1,onEdgeSegment1:0===m||1===m,insideSegment2:w>0&&w<1,onEdgeSegment2:0===w||1===w}}function N(n){if(n.length<3)return!0;for(var r=[],e=0;e<n.length-1;e++)r.push({a:n[e],b:n[e+1]});return r.push({a:n[n.length-1],b:n[0]}),!r.some((function(n){return r.some((function(r){if(n===r)return!1;var e=J(n,r);if(null===e)return!1;var t=e.insideSegment1,o=e.insideSegment2;return t&&o}))}))}function V(n,r){var e=n.length;return[].concat(f(n.slice(e-r)),f(n.slice(0,e-r)))}function B(n,r){var e=n.map((function(n,e){return[e,r.findIndex((function(r){return w(n,r)}))]})).filter((function(n){var r=u(n,2);r[0];return r[1]>-1})),t=n.length;if(2!==e.length)throw new Error("sharedVertices length should be 2 : ".concat(JSON.stringify(e)));return(e[0][0]+1)%t===e[1][0]?[].concat(f(V(n,t-e[1][0])),f(V(r,r.length-e[0][1]).slice(1,-1))):[].concat(f(V(n,t-e[0][0])),f(V(r,r.length-e[1][1]).slice(1,-1)))}function G(n,r){if(n.length<2)return n;var e=new Map,t=new Map;if(n.forEach((function(n){e.set(n,!0),t.set(n,n)})),r.length+1!==n.length)throw new Error("wtf ? LLE + 1 !== polygons.length ("+(r.length+1)+", "+n.length+")");for(var o=function(n){var o=r[n],i=o.i2,u=o.j2,f=o.rightPolygon,a=o.leftPolygon,l=t.get(a),c=t.get(f),h=l.length,g=c.length,v=c[(c.findIndex((function(n){return w(n,i)}))+g-1)%g],y=l[(l.findIndex((function(n){return w(n,i)}))+1)%h],s=l[(l.findIndex((function(n){return w(n,u)}))+h-1)%h],d=c[(c.findIndex((function(n){return w(n,u)}))+1)%g];if(P(v,i,y)>=0&&P(s,u,d)>=0){var x=B(l,c);if(!_(x))throw new Error("mergePolygons is not convex !");e.set(l,!1),e.set(c,!1),e.set(x,!0),t.set(x,x);var p=!0,b=!1,m=void 0;try{for(var j,E=t.keys()[Symbol.iterator]();!(p=(j=E.next()).done);p=!0){var O=j.value;t.get(O)!==l&&t.get(O)!==c||t.set(O,x)}}catch(n){b=!0,m=n}finally{try{p||null==E.return||E.return()}finally{if(b)throw m}}}},i=0;i<r.length;i++)o(i);return f(e.entries()).filter((function(n){var r=u(n,2);r[0];return r[1]})).map((function(n){return u(n,1)[0]}))}function K(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=n.length;return n.filter((function(r,t){return!j(r,n[(t+1)%e])})).map((function(n,e){return o({},n,{id:e+r})}))}function Q(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n[0];if(n.length<4)return{convexPolygon:f(n),end:!0};var t=q(e,n);if(null===t)return{convexPolygon:f(n),end:!0};var o=t,i=function(){var r=function(n,r){if(n.length<4)return{L:f(n),end:!0};var e=f(r);e.length<1&&e.push(n[0]),e.length<2&&e.push(D(e[0],n));for(var t=e[0],o=e[1],i=t,u=o,a=D(u,n);e.length<n.length&&P(i,u,a)>=0&&P(u,a,t)>=0&&P(a,t,o)>=0;)e.push(a),i=u,a=D(u=a,n);if(n.length===e.length)return{L:e,end:!0};if(e.length<2)return{L:e,end:!0};for(var l=function(){var r=H(F(n,e)).filter((function(n){return!R(n,e)})).filter((function(n){return A(n,e)}));if(0===r.length)return"break";var t=e[0],o=e.length,i=e[o-1];e=e.slice(0,-1),r.forEach((function(n){var r=Math.sign(S(i,t,n));0!==r&&(e=e.filter((function(e){return Math.sign(S(e,t,n))!==r})))}))};e.length>2;){if("break"===l())break}return{L:e,end:!1}}(n,[o]),e=r.L;return r.end?{v:{convexPolygon:e,end:!0}}:e.length>2&&H(n).some((function(n){return m(n,e[0])||m(n,e[e.length-1])}))?{v:{convexPolygon:e,end:!1}}:void(o=q(o,n))};do{var u=i();if("object"===r(u))return u.v}while(!m(o,t));o=t;var a=function(){var r=function(n,r){if(n.length<4)return{L:f(n),end:!0};var e=f(r);e.length<1&&e.unshift(n[0]),e.length<2&&e.unshift(C(e[0],n));for(var t=e[e.length-1],o=e[e.length-2],i=e[1],u=e[0],a=C(u,n);e.length<n.length&&P(i,u,a)<=0&&P(u,a,t)<=0&&P(a,t,o)<=0;)e.unshift(a),i=u,a=C(u=a,n);if(n.length===e.length)return{L:e,end:!0};if(e.length<2)return{L:e,end:!0};for(var l=function(){var r=H(F(n,e)).filter((function(n){return!R(n,e)})).filter((function(n){return A(n,e)}));if(0===r.length)return"break";var t=e[e.length-1],o=e[0];e=e.slice(1),r.forEach((function(n){var r=Math.sign(S(o,t,n));0!==r&&(e=e.filter((function(e){return Math.sign(S(e,t,n))!==r})))}))};e.length>2;){if("break"===l())break}return{L:e,end:!1}}(n,[o]),e=r.L;return r.end?{v:{convexPolygon:e,end:!0}}:e.length>2&&H(n).some((function(n){return m(n,e[0])||m(n,e[e.length-1])}))?{v:{convexPolygon:e,end:!1}}:void(o=function(n,r){for(var e=r.length,t=r.findIndex((function(r){return m(n,r)})),o=(t-1+e)%e;o!==t;){if(P(r[(o-1+e)%e],r[o],r[(o+1)%e])<0)return r[o];o=(o-1+e)%e}return P(r[(o-1+e)%e],r[o],r[(o+1)%e])<0?r[o]:null}(o,n))};do{var l=a();if("object"===r(l))return l.v}while(!m(o,t));throw new Error("ERROR MP5Procedure 3")}var U=function(n,r){for(var e=r.length,t=0;t<e;t++){var o=J(n,{a:r[(t-1+e)%e],b:r[t]});if(null!==o){var i=o.insideSegment1,u=o.insideSegment2,f=o.onEdgeSegment1,a=o.onEdgeSegment2;if((i||f)&&(u||a))return!0}}return!1},W=function(n,r){for(var e=[],t=r.length,o=0;o<t;o++){var i={a:r[(o-1+t)%t],b:r[o]},u=J(n,i);if(null!==u){var f=u.x,a=u.y,l=u.insideSegment1,c=u.insideSegment2,h=u.onEdgeSegment1,g=u.onEdgeSegment2;(l||h)&&(c||g)&&e.push({x:f,y:a,edge:i,hole:r})}}return e},X=function(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return[].concat(f(n.slice(r)),f(n.slice(0,r)))},Y=function(n,r,e){for(var t=function(r,e){return E(n.a,r)-E(n.a,e)},o=[],i=e.length,u=0;u<i;u++){var a;(a=o).push.apply(a,f(W(n,e[u])))}for(var l=n.b.id;o.length>0;){var c=o.sort(t)[0],h=Object.values(c.edge).filter((function(n){return A(n,r)})).sort(t)[0];if(h.id===l)return n;n={a:n.a,b:h,hole:c.hole},l=h.id,o=[];for(var g=0;g<i;g++){var v;(v=o).push.apply(v,f(W(n,e[g])))}}return n};function Z(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!Array.isArray(n))throw new Error("absHol can only take an array of points {x, y} as input");if(n.length<=2)return[n];if(!O(n))throw new Error("absHol can only work with clockwise ordered vertices");if(!r.every((function(r){return e=n,r.every((function(n){return M(n,e)}));var e})))throw new Error("One or more holes are not totally inside the polygon !");var e=K(n,1),t=e.length+1,u=function(n,r,e){for(var t=[],u=[],a=[],l=f(n),c=function(){for(var n=Q(l),c=n.convexPolygon,h=n.end,g={a:c[0],b:c[c.length-1],hole:null},v=r.length,y=!1,s=[],d=0;d<v;d++){var x=r[d];!y&&U(g,x)&&(y=!0,g.hole=x),L(c,x)&&s.push(x)}if(y||s.length>0){y||(g={a:c[0],b:s[0][0],hole:s[0]});var p=Y(g,c,s),b=p.hole,j=i(p,["hole"]);u.push(j),r=r.filter((function(n){return n!==b}));var E=c[0],O=++e,P=++e,S=X(b,b.findIndex((function(n){return m(n,j.b)}))+1).reverse(),k=l.findIndex((function(n){return m(n,E)}));l=[].concat(f(l.slice(0,k+1)),f(S),[o({},S[0],{id:O,originalId:S[0].id.originalId||S[0].id}),o({},E,{id:P,originalId:E.originalId||E.id})],f(l.slice(k+1)))}else{if(a.push(c),T(c).forEach((function(n){for(var r=0;r<t.length;r++){var e=t[r],o=e.i2,i=e.j2;if(w(o,n.b)&&w(i,n.a)){t[r].leftPolygon=c;break}}})),h)return"break";t.push({i2:g.b,j2:g.a,rightPolygon:c}),l=F(l,c)}};;){if("break"===c())break}return{LPCP:a,trueDiagonals:u,LLE:t}}(e,r.map((function(n){var r=K(n,t);return t+=r.length,r})),t),a=u.LPCP,l=u.trueDiagonals,c=G(a,u.LLE).filter((function(n){return!function(n){var r=n.length;return n.every((function(e,t){return 0===P(n[(t-1+r)%r],e,n[(t+1)%r])}))}(n)}));return l.forEach((function(n){for(var r,e,t,o,i,u,f=n.a,a=n.b,l=0;l<c.length;l++){for(var h=c[l],g=h.length,v=T(h),y=function(n){var l=v[n],c=l.a,y=l.b;return w(f,c)&&w(a,y)?(t=h[(h.findIndex((function(n){return w(n,c)}))+g-1)%g],u=h[(h.findIndex((function(n){return w(n,y)}))+1)%g],e=h,"break"):w(f,y)&&w(a,c)?(o=h[(h.findIndex((function(n){return w(n,y)}))+1)%g],i=h[(h.findIndex((function(n){return w(n,c)}))+g-1)%g],r=h,"break"):void 0},s=0;s<v.length;s++){if("break"===y(s))break}if(e&&r){P(t,f,o)>=0&&P(i,a,u)>=0&&(c=c.filter((function(n){return n!==e&&n!==r})).concat([B(r,e)]));break}}})),c.map((function(n){return n.map((function(n){return{x:n.x,y:n.y}}))}))}n.MP5=function(n){if(!Array.isArray(n))throw new Error("MP5 can only take an array of points {x, y} as input");if(n.length<=2)return[n];if(!O(n))throw new Error("MP5 can only work with clockwise ordered polygon");for(var r=[],e=[],t=K(n),o=function(){var n=Q(t),o=n.convexPolygon,i=n.end,u={a:o[0],b:o[o.length-1]};if(r.push(o),T(o).forEach((function(n){for(var r=0;r<e.length;r++){var t=e[r],i=t.i2,u=t.j2;if(m(i,n.b)&&m(u,n.a)){e[r].leftPolygon=o;break}}})),i)return"break";e.push({i2:u.b,j2:u.a,rightPolygon:o}),t=F(t,o)};;){if("break"===o())break}return G(r,e).map((function(n){return n.map((function(n){return{x:n.x,y:n.y}}))}))},n.absHol=Z,n.decompose=Z,n.getRobustness=function(){return b},n.isClockwiseOrdered=O,n.isConvex=_,n.isSimple=N,n.orderClockwise=function(n){return O(n)?f(n):f(n).reverse()},n.setRobustness=function(n){b=n},Object.defineProperty(n,"__esModule",{value:!0})}));