'use strict';function segment_intersect(a,c){if(a[0]===a[2]&&a[1]===a[3]||c[0]===c[2]&&c[1]===c[3])return!1;const e=(c[3]-c[1])*(a[2]-a[0])-(c[2]-c[0])*(a[3]-a[1]);if(0===e)return!1;let f=((c[2]-c[0])*(a[1]-c[1])-(c[3]-c[1])*(a[0]-c[0]))/e;c=((a[2]-a[0])*(a[1]-c[1])-(a[3]-a[1])*(a[0]-c[0]))/e;if(0>f||1c||1c)&&(e.push(a[h+0]),e.push(a[h+1]))}return e} function offset_points(a,c){var e=[];a=sort_polygon(a);a=convert_xy(a);for(var f=0;fg&&(g+=a.length);var h=(f+1)%a.length,n=[a[f].x-a[g].x,a[f].y-a[g].y],l=Math.sqrt(n[0]*n[0]+n[1]*n[1]);n=[n[0]/l,n[1]/l];n=[n[0]*c,n[1]*c];var m=[-n[1],n[0]];n=a[g].x+m[0];g=a[g].y+m[1];l=a[f].x+m[0];m=a[f].y+m[1];var p=[a[h].x-a[f].x,a[h].y-a[f].y],q=Math.sqrt(p[0]*p[0]+p[1]*p[1]);p=[p[0]/q,p[1]/q];p=[p[0]*c,p[1]*c];var r=[-p[1],p[0]];p=a[f].x+r[0];q=a[f].y+r[1];var t=a[h].x+r[0];h=a[h].y+ r[1];h=((t-p)*(g-q)-(h-q)*(n-p))/((h-q)*(l-n)-(t-p)*(m-g));n+=h*(l-n);h=g+h*(m-g);isNaN(n)||isNaN(h)||(e.push(n),e.push(h))}return e}function remove_duplicates(a,c=1E11){for(var e=[],f=null,g=null,h=Math.round(a[0]*c)/c,n=Math.round(a[1]*c)/c,l=0;lleftSide(a.vertices[(c+a.vertices.length-1)%a.vertices.length],a.vertices[(c+1)%a.vertices.length],a.vertices[c])?!0:!1} function createPolygon(a){for(var c={vertices:a},e=[],f=0f||0>c||1l&&(l+=n);0>m&&(m+=n);m=l>m?l-m:l+n-m;h=(h?-m:n-m)/3;a.push(f);for(f=1;3>f;++f)m=l+h*f,a.push({x:c.x+Math.cos(m)*e,y:c.y+Math.sin(m)*e});a.push(g)}function createOffsetEdge(a,c,e){return{vertex1:{x:a.vertex1.x+c,y:a.vertex1.y+e},vertex2:{x:a.vertex2.x+c,y:a.vertex2.y+e}}} function offset_points_rounded(a,c){a=sort_polygon(a);c=createPaddingPolygon(createPolygon(convert_xy(a)),c);return convert_kp(c.vertices)} function createMarginPolygon(a,c){for(var e=[],f=0;fc||1E6a||1E6e&&(e*=-1);return 180/Math.PI*e} function point_angle(a,c,e){var f=c.x-a.x;a=c.y-a.y;var g=e.x-c.x;c=e.y-c.y;f=Math.atan2(f*c-a*g,f*g+a*c);0>f&&(f*=-1);return 180/Math.PI*f}function project(a,c){var e=c[2]-c[0],f=c[3]-c[1],g=Math.min(1,Math.max(0,((a.x-c[0])*e+(a.y-c[1])*f)/(e*e+f*f)));return{point:{x:c[0]+e*g,y:c[1]+f*g},dist:Math.hypot(c[0]+e*g-a.x,c[1]+f*g-a.y)}} function get_box(a){for(var c=[],e=[],f=0;fc!==h>c&&a<(p-l)*(c-m)/(h-m)+l&&(f=!f);h=n}return f?"inside":"outside"}function rotate_point({x:a,y:c},e){const f=Math.cos(e);e=Math.sin(e);return{x:a*f-c*e,y:c*f+a*e}} function rotate_points(a,c,e={x:0,y:0}){for(var f=[],g=0;gc&&(f=a[h],g=a[h+1],e.push(Math.round(1E3*a[h])/1E3),e.push(Math.round(1E3*a[h+1])/1E3));return e}function distance(a,c,e,f){return Math.hypot(e-a,f-c)}function dist(a,c){return Math.hypot(c.x-a.x,c.y-a.y)} function bulgetopoints(a){var c=[];for(i=0;i=theta;)c.push(center_x+radius*Math.cos(theta/180*Math.PI)),c.push(center_y+radius*Math.sin(theta/180*Math.PI)),theta+=1;i+=2}else if(!isNaN(a[i]))c.push(a[i]),c.push(a[i+1]);else if("bulge"==a[i]){if(b={},b.bulge=a[i+1],0>b.bulge?(b.theta=4*Math.atan(-b.bulge),b.ax=a[i-2],b.ay=a[i-1],b.bx=a[i+2],b.by=a[i+3],i==a.length-2&&(b.bx=a[0],b.by=a[1])):(b.theta=4* Math.atan(b.bulge),b.bx=a[i-2],b.by=a[i-1],b.ax=a[i+2],b.ay=a[i+3],i==a.length-2&&(b.ax=a[0],b.ay=a[1])),null!=b.ax&&null!=b.bx){b.distance=Math.sqrt(Math.pow(b.bx-b.ax,2)+Math.pow(b.by-b.ay,2));d=0>b.bulge?b.distance/2*(1-Math.pow(b.bulge,2))/(2*b.bulge):b.distance/2*(1-Math.pow(b.bulge,2))/(2*-b.bulge);u=(b.bx-b.ax)/b.distance;v=(b.by-b.ay)/b.distance;b.center_x=-v*d+(b.ax+b.bx)/2;b.center_y=u*d+(b.ay+b.by)/2;b.radius=Math.sqrt(Math.pow(b.center_x-b.ax,2)+Math.pow(b.center_y-b.ay,2));b.startAngle= Math.atan2(b.by-b.center_y,b.bx-b.center_x)/Math.PI*180;b.endAngle=Math.atan2(b.ay-b.center_y,b.ax-b.center_x)/Math.PI*180;b.endAngleb.bulge)for(k=b.endInter;k>=b.startInter;--k)c.push(b.center_x+Math.cos(k/180*Math.PI)*b.radius),c.push(b.center_y+Math.sin(k/180*Math.PI)*b.radius);else for(k=b.startInter;k<=b.endInter;k+=1)c.push(b.center_x+Math.cos(k/180*Math.PI)*b.radius),c.push(b.center_y+Math.sin(k/180*Math.PI)* b.radius);b.endAngle=rad2deg(Math.atan2(b.ax-b.cx,b.ay-b.cy))+90;b.startAngle=rad2deg(Math.atan2(b.bx-b.cx,b.by-b.cy))+90}}else if("arc"==a[i]){c=[];center_x=a[0];center_y=a[1];radius=a[3];start=a[4];end=a[5];start>end&&(start=a[4]-360,end=a[5]);for(k=start;k<=end;k+=1)c.push(center_x+radius*Math.cos(k/180*Math.PI)),c.push(center_y+radius*Math.sin(k/180*Math.PI));c.push(center_x+radius*Math.cos(end/180*Math.PI));c.push(center_y+radius*Math.sin(end/180*Math.PI));break}return c} function rad2deg(a){return 180/Math.PI*a}function invertp(a){for(var c=[],e=0;e>2]|=l.charCodeAt(m)<<8*m--;for(i=l=0;il;m=[f=m[3],c+((f=m[0]+[c&e|~c&f,f&c|~f&e,c^e^f,e^(c|~f)][m=l>>4]+g[l]+~~n[i|15&[l,5*l+1,3*l+5,7*l][m]])<< (m=[7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21][4*m+l++%4])|f>>>-m),c,e])c=0|m[1],e=m[2];for(l=4;l;)h[--l]+=m[l]}for(a="";32>l;)a+=(h[l>>3]>>4*(1^l++)&15).toString(16);return a};