UNPKG

plotboilerplate

Version:

A simple javascript plotting boilerplate for 2d stuff.

1 lines 137 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(){for(var e in this.draggable=!0,this.selectable=!0,this.isSelected=!1,this.visible=!0,t.model)this[e]=t.model[e]}}t.model={draggable:!0,selectable:!0,isSelected:!1,visible:!0};class e{static next(){return""+e.current++}}e.current=0;class s{constructor(t){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[],this.vertex=t}addClickListener(t){return s._addListener(this.click,t),this}removeClickListener(t){return this.click=s._removeListener(this.click,t),this}addDragListener(t){return s._addListener(this.drag,t),this}removeDragListener(t){return this.drag=s._removeListener(this.drag,t),this}addDragStartListener(t){return s._addListener(this.dragStart,t),this}removeDragStartListener(t){return this.dragStart=s._removeListener(this.dragStart,t),this}addDragEndListener(t){return s._addListener(this.dragEnd,t),this}removeDragEndListener(t){return this.dragEnd=s._removeListener(this.dragEnd,t),this}fireClickEvent(t){s._fireEvent(this,this.click,t)}fireDragEvent(t){s._fireEvent(this,this.drag,t)}fireDragStartEvent(t){s._fireEvent(this,this.dragStart,t)}fireDragEndEvent(t){s._fireEvent(this,this.dragEnd,t)}removeAllListeners(){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[]}static _fireEvent(t,e,s){const i=s;for(var r in void 0===i.params?i.params={vertex:t.vertex}:i.params.vertex=t.vertex,e)e[r](i)}static _addListener(t,e){for(var s in t)if(t[s]==e)return!1;return t.push(e),!0}static _removeListener(t,e){for(var s=0;s<t.length;s++)if(t[s]==e)return t.splice(s,1);return t}}class i{constructor(t,s){this.className="Circle",this.uid=e.next(),this.center=t,this.radius=s}move(t){return this.center.add(t),this}containsPoint(t){return this.center.distance(t)<this.radius}containsCircle(t){return this.center.distance(t.center)+t.radius<this.radius}lineDistance(t){return t.getClosestPoint(this.center).distance(this.center)-this.radius}vertAt(t){return i.circleUtils.vertAt(t,this.radius).add(this.center)}tangentAt(t){const e=i.circleUtils.vertAt(t,this.radius);return new o(e,new a(0,0)).add(this.center).perp()}getBounds(){return new u(this.center.clone().subXY(Math.abs(this.radius),Math.abs(this.radius)),this.center.clone().addXY(Math.abs(this.radius),Math.abs(this.radius)))}circleIntersection(t){if(this.center.distance(t.center)>this.radius+t.radius)return null;if(this.center.distance(t.center)<Math.abs(this.radius-t.radius))return null;var e=this.center,s=t.center,i=e.distance(s),r=(this.radius*this.radius-t.radius*t.radius+i*i)/(2*i),n=Math.sqrt(this.radius*this.radius-r*r),h=s.clone().scale(r/i,e),o=h.x+n*(s.y-e.y)/i,c=h.y-n*(s.x-e.x)/i,u=h.x-n*(s.y-e.y)/i,d=h.y+n*(s.x-e.x)/i;return new l(new a(o,c),new a(u,d))}lineIntersection(t,e){const s=new a,i=new a,r=new a(t).sub(this.center),n=new a(e).sub(this.center),h=r.difference(n);0===Math.abs(h.y)&&(h.y=1e-6);const o=r.distance(n),c=r.x*n.y-r.y*n.x,u=o*o;if(this.radius*this.radius*u-c*c<0)return null;const d=this.radius*this.radius*o*o-c*c,g=Math.sqrt(d);return s.x=(c*h.y+Math.sign(h.y)*h.x*g)/u,i.x=(c*h.y-Math.sign(h.y)*h.x*g)/u,s.y=(-c*h.x+Math.abs(h.y)*g)/u,i.y=(-c*h.x-Math.abs(h.y)*g)/u,new l(s.add(this.center),i.add(this.center))}lineIntersections(t,e=!1){const s=this.lineIntersection(t.a,t.b);return s?e?[s.a,s.b].filter((e=>t.hasPoint(e,!0))):[s.a,s.b]:[]}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map((t=>{const e=new l(this.center,t).angle();return this.tangentAt(e)}))}closestPoint(t){const e=this.lineIntersection(this.center,t);return e?e.a.distance(t)<e.b.distance(t)?e.a:e.b:new a}destroy(){this.center.destroy(),this.isDestroyed=!0}}i.circleUtils={vertAt:(t,e)=>new a(Math.cos(t)*e,Math.sin(t)*e)};class r{constructor(t,s,i){this.className="Triangle",this.uid=e.next(),this.a=t,this.b=s,this.c=i,this.calcCircumcircle()}static fromArray(t){if(t.length<3)throw`Cannot create triangle from array with less than three vertices (${t.length})`;return new r(t[0],t[1],t[2])}getArea(){return Math.abs(r.utils.signedArea(this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y))}getCentroid(){return new a((this.a.x+this.b.x+this.c.x)/3,(this.a.y+this.b.y+this.c.y)/3)}scaleToCentroid(t){let e=this.getCentroid();return this.a.scale(t,e),this.b.scale(t,e),this.c.scale(t,e),this}getBounds(){return this.bounds()}move(t){return this.a.add(t),this.b.add(t),this.c.add(t),this}getCircumcircle(){return this.calcCircumcircle(),new i(this.center.clone(),this.radius)}isAdjacent(t){var e=this.a.equals(t.a)||this.a.equals(t.b)||this.a.equals(t.c),s=this.b.equals(t.a)||this.b.equals(t.b)||this.b.equals(t.c),i=this.c.equals(t.a)||this.c.equals(t.b)||this.c.equals(t.c);return e&&s||e&&i||s&&i}getThirdVertex(t,e){return this.a.equals(t)&&this.b.equals(e)||this.a.equals(e)&&this.b.equals(t)?this.c:this.b.equals(t)&&this.c.equals(e)||this.b.equals(e)&&this.c.equals(t)?this.a:this.b}calcCircumcircle(){const t=this.b.x-this.a.x,e=this.b.y-this.a.y,s=this.c.x-this.a.x,i=this.c.y-this.a.y,n=t*(this.a.x+this.b.x)+e*(this.a.y+this.b.y),h=s*(this.a.x+this.c.x)+i*(this.a.y+this.c.y),o=2*(t*(this.c.y-this.b.y)-e*(this.c.x-this.b.x));let l,c;if(Math.abs(o)<r.EPSILON){const t=this.bounds();this.center=new a((t.min.x+t.max.x)/2,(t.min.y+t.max.y)/2),l=this.center.x-t.min.x,c=this.center.y-t.min.y}else{const r=(i*n-e*h)/o,u=(t*h-s*n)/o;this.center=new a(r,u),l=this.center.x-this.a.x,c=this.center.y-this.a.y}this.radius_squared=l*l+c*c,this.radius=Math.sqrt(this.radius_squared)}inCircumcircle(t){const e=this.center.x-t.x,s=this.center.y-t.y;return e*e+s*s<=this.radius_squared}bounds(){return new u(new a(r.utils.min3(this.a.x,this.b.x,this.c.x),r.utils.min3(this.a.y,this.b.y,this.c.y)),new a(r.utils.max3(this.a.x,this.b.x,this.c.x),r.utils.max3(this.a.y,this.b.y,this.c.y)))}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map((t=>t.intersectionPoint))}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map((t=>{const e=this.getEdgeAt(t.edgeIndex);return new o(e.a.clone(),e.b.clone()).moveTo(t.intersectionPoint)}))}getEdgeAt(t){var e=t%3;return 0===e?new l(this.a,this.b):1===e?new l(this.b,this.c):new l(this.c,this.a)}toPolygon(){return new c([this.a,this.b,this.c])}determinant(){return r.utils.determinant(this.a,this.b,this.c)}containsPoint(t){return r.utils.pointIsInTriangle(t.x,t.y,this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y)}getIncircularTriangle(){const t=new l(this.a,this.b),e=new l(this.b,this.c),s=new l(this.c,this.a),i=n.nsectAngle(this.b,this.a,this.c,2)[0],a=n.nsectAngle(this.c,this.b,this.a,2)[0],h=i.intersection(a),o=t.getClosestPoint(h),c=e.getClosestPoint(h),u=s.getClosestPoint(h);return new r(o,c,u)}getIncircle(){return this.getIncircularTriangle().getCircumcircle()}getIncenter(){return this.center&&this.radius||this.calcCircumcircle(),this.center.clone()}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+", c : "+this.c.toString()+"}"}destroy(){this.a.destroy(),this.b.destroy(),this.c.destroy(),this.isDestroyed=!0}}r.EPSILON=1e-6,r.utils={max3:(t,e,s)=>t>=e&&t>=s?t:e>=t&&e>=s?e:s,min3:(t,e,s)=>t<=e&&t<=s?t:e<=t&&e<=s?e:s,signedArea:(t,e,s,i,r,n)=>.5*(-i*r+e*(-s+r)+t*(i-n)+s*n),pointIsInTriangle(t,e,s,i,n,a,h,o){var l=r.utils.signedArea(s,i,n,a,h,o),c=1/(2*l)*(i*h-s*o+(o-i)*t+(s-h)*e),u=1/(2*l)*(s*a-i*n+(i-a)*t+(n-s)*e);return c>0&&u>0&&1-c-u>0},determinant:(t,e,s)=>(e.y-t.y)*(s.x-e.x)-(s.y-e.y)*(e.x-t.x)};const n={mapAngleTo2PI(t){const e=Math.asin(Math.sin(t));return Math.cos(t)<0?Math.PI-e:e<0?e+2*Math.PI:e},dist4:(t,e,s,i)=>Math.sqrt(Math.pow(s-t,2)+Math.pow(e-i,2)),dotProduct:(t,e)=>t.x*e.x+t.y*e.y,nsectAngle(t,e,s,i){const n=new r(t,e,s),a=new l(t,e),h=new l(t,s);var o=a.angle(h);const c=n.determinant()>0;o<0&&(o=2*Math.PI+o),c||(o=-1*(2*Math.PI-o));const u=Math.max(a.length(),h.length())/a.length();for(var d=[],g=1;g<i;g++)d.push(new l(t,e.clone().rotate(o/i*-g,t)).scale(u));return d},wrapMax:(t,e)=>(e+t%e)%e,wrapMinMax:(t,e,s)=>e+n.wrapMax(t-e,s-e)};class a{constructor(i,r){if(this.className="Vertex",this.uid=e.next(),void 0===i)this.x=0,this.y=0;else if("number"==typeof i&&"number"==typeof r)this.x=i,this.y=r;else{const t=i;"number"==typeof t.x&&"number"==typeof t.y?(this.x=t.x,this.y=t.y):(this.x="number"==typeof i?i:void 0===i?0:NaN,this.y="number"==typeof r?r:void 0===r?0:NaN)}this.attr=new t,this.listeners=new s(this)}set(t,e){if("number"==typeof t&&"number"==typeof e)this.x=t,this.y=e;else{const s=t;"number"==typeof s.x&&"number"==typeof s.y?(this.x=s.x,this.y=s.y):(this.x="number"==typeof t?t:void 0===t?0:NaN,this.y="number"==typeof e?e:void 0===e?0:NaN)}return this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}invX(){return this.x=-this.x,this}invY(){return this.y=-this.y,this}add(t,e){if("number"==typeof t&&"number"==typeof e)this.x+=t,this.y+=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x+=s.x,this.y+=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x+=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y+=e}}return this}move(t){return this.add(t)}addXY(t,e){return this.x+=t,this.y+=e,this}addX(t){return this.x+=t,this}addY(t){return this.y+=t,this}sub(t,e){if("number"==typeof t&&"number"==typeof e)this.x-=t,this.y-=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x-=s.x,this.y-=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x-=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y-=e}}return this}subXY(t,e){return this.x-=t,this.y-=e,this}subX(t){return this.x-=t,this}subY(t){return this.y-=t,this}equals(t){var e=Math.abs(this.x-t.x)<a.EPSILON,s=Math.abs(this.y-t.y)<a.EPSILON;return e&&s}clone(){return new a(this.x,this.y)}distance(t){return n.dist4(this.x,this.y,t.x,t.y)}angle(t){const e=void 0===t?Math.PI/2-Math.atan2(this.x,this.y):Math.PI/2-Math.atan2(t.x-this.x,t.y-this.y);return e<0?2*Math.PI+e:e}difference(t){return new a(t.x-this.x,t.y-this.y)}scale(t,e){return this.scaleXY({x:t,y:t},e)}lerp(t,e){var s=this.difference(t);return this.x+=s.x*e,this.y+=s.y*e,this}lerpAbs(t,e){var s=this.distance(t),i=this.difference(t),r=i.x/s,n=i.y/s;return this.x+=r*e,this.y+=n*e,this}scaleXY(t,e){return e&&void 0!==e||(e={x:0,y:0}),this.x=e.x+(this.x-e.x)*t.x,this.y=e.y+(this.y-e.y)*t.y,this}rotate(t,e){e&&void 0!==e||(e={x:0,y:0}),this.sub(e),t+=Math.atan2(this.y,this.x);let s=this.distance(a.ZERO);return this.x=s*Math.cos(t),this.y=s*Math.sin(t),this.add(e),this}multiplyScalar(t){return this.x*=t,this.y*=t,this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}inv(){return this.x=-this.x,this.y=-this.y,this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}toString(t){return void 0===t?"("+this.x+","+this.y+")":"("+this.x.toFixed(t)+","+this.y.toFixed(t)+")"}destroy(){this.listeners.removeAllListeners(),this.isDestroyed=!0}static randomVertex(t){return new a(t.min.x+Math.random()*(t.max.x-t.min.x),t.min.y+Math.random()*(t.max.y-t.min.y))}}a.ZERO=new a(0,0),a.EPSILON=1e-6,a.utils={buildArrowHead:(t,e,s,i,r)=>{console.warn("[DEPRECATION] Vertex.utils.buildArrowHead is deprecated. Please use Vector.utils.buildArrowHead instead.");var n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),h=[];return h.push(new a(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),h.push(new a(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),h.push(new a(e.x*i,e.y*r)),h.push(new a(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),h},arrayToJSON:(t,e)=>JSON.stringify(t.map((function(t){return void 0===typeof e?{x:t.x,y:t.y}:{x:Number(t.x.toFixed(e)),y:Number(t.y.toFixed(e))}})))};class h{constructor(t,s,i){this.uid=e.next(),this.a=t,this.b=s,this.factory=i}length(){return Math.sqrt(Math.pow(this.b.x-this.a.x,2)+Math.pow(this.b.y-this.a.y,2))}setLength(t){return this.scale(t/this.length())}sub(t){return this.a.sub(t),this.b.sub(t),this}add(t){return this.a.add(t),this.b.add(t),this}revert(){const t=this.a;return this.a=this.b,this.b=t,this}normalize(){return this.b.set(this.a.x+(this.b.x-this.a.x)/this.length(),this.a.y+(this.b.y-this.a.y)/this.length()),this}scale(t){return this.b.set(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t),this}moveTo(t){let e=this.a.difference(t);return this.a.add(e),this.b.add(e),this}move(t){return this.a.add(t),this.b.add(t),this}angle(t){null!=t&&void 0!==t||(t=this.factory(new a(0,0),new a(100,0)));const e=this.b.clone().sub(this.a),s=t.b.clone().sub(t.a);return Math.atan2(s.x,s.y)-Math.atan2(e.x,e.y)}vertAt(t){return new a(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t)}denominator(t){return(t.b.y-t.a.y)*(this.b.x-this.a.x)-(t.b.x-t.a.x)*(this.b.y-this.a.y)}colinear(t,e){return Math.abs(this.denominator(t))<(void 0===e?a.EPSILON:e)}getClosestT(t){var e=h.vtutils.dist2(this.a,this.b);return 0===e?0:((t.x-this.a.x)*(this.b.x-this.a.x)+(t.y-this.a.y)*(this.b.y-this.a.y))/e}hasPoint(t,e,s){const i=this.getClosestT(t),r=Math.sqrt(h.vtutils.dist2(t,this.vertAt(i)));return void 0!==e&&e?r<(null!=s?s:a.EPSILON)&&i>=0&&i<=1:r<(null!=s?s:a.EPSILON)}getClosestPoint(t){var e=this.getClosestT(t);return this.vertAt(e)}pointDistance(t){return Math.sqrt(h.vtutils.dist2(t,this.vertAt(this.getClosestT(t))))}clone(){return this.factory(this.a.clone(),this.b.clone())}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+" }"}destroy(){this.a.destroy(),this.b.destroy(),this.isDestroyed=!0}}h.vtutils={dist2:(t,e)=>(t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y)};class o extends h{constructor(t,e){super(t,e,((t,e)=>new o(t,e))),this.className="Vector"}perp(){var t=this.clone();return t.sub(this.a),(t=new o(new a,new a(-t.b.y,t.b.x))).a.add(this.a),t.b.add(this.a),t}inverse(){var t=this.a;return this.a=this.b,this.b=t,this}inv(){return this.b.x=this.a.x-(this.b.x-this.a.x),this.b.y=this.a.y-(this.b.y-this.a.y),this}intersection(t){var e=this.denominator(t);if(0==e)return null;var s=this.a.y-t.a.y,i=this.a.x-t.a.x,r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;return s=r/e,i=n/e,new a(this.a.x+s*(this.b.x-this.a.x),this.a.y+s*(this.b.y-this.a.y))}getOrthogonal(){const t=this.a.clone(),e=this.b.clone().sub(this.a),s=e.x;return e.x=-e.y,e.y=s,new o(t,e.add(this.a))}rotate(t){return this.b.rotate(t,this.a),this}}o.utils={buildArrowHead:(t,e,s,i,r)=>{const n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),h=[];return h.push(new a(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),h.push(new a(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),h.push(new a(e.x*i,e.y*r)),h.push(new a(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),h}};class l extends h{constructor(t,e){super(t,e,((t,e)=>new l(t,e))),this.className="Line"}intersection(t){const e=this.denominator(t);if(0==e)return null;let s=this.a.y-t.a.y,i=this.a.x-t.a.x;const r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;s=r/e,i=n/e;const h=this.a.x+s*(this.b.x-this.a.x),o=this.a.y+s*(this.b.y-this.a.y);return isNaN(s)||isNaN(h)||isNaN(o)?null:new a(h,o)}getBounds(){return u.computeFromVertices([this.a,this.b])}getStartPoint(){return this.a}getEndPoint(){return this.b}getStartTangent(){return this.b}getEndTangent(){return this.a}reverse(){var t=this.a;return this.a=this.b,this.b=t,this}lineIntersections(t,e=!1){const s=this.intersection(t);return s?!this.hasPoint(s,!0)||e&&!t.hasPoint(s,e)?[]:[s]:[]}lineIntersectionTangents(t,e=!1){const s=this.lineIntersections(t,e);if(0===s.length)return[];const i=s[0];return[new o(this.a.clone(),this.b.clone()).moveTo(i)]}}class c{constructor(t,s){this.className="Polygon",this.uid=e.next(),void 0===t&&(t=[]),this.vertices=t,this.isOpen=s||!1}addVertex(t){this.vertices.push(t)}addVertexAt(t,e){this.vertices.splice(e,0,t)}getEdgeAt(t){return new l(this.getVertexAt(t),this.getVertexAt(t+1))}getEdges(){const t=[];for(var e=0;e+1<this.vertices.length;e++)t.push(this.getEdgeAt(e));return!this.isOpen&&this.vertices.length>0&&t.push(this.getEdgeAt(this.vertices.length-1)),t}getInnerAngleAt(t){const e=this.vertices[t],s=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),i=this.vertices[(t+1)%this.vertices.length].clone(),r=this.isAngleAcute(t),h=new a(0,0),o=new a(e.x-s.x,e.y-s.y),l=new a(i.x-e.x,i.y-e.y),c=h.distance(o),u=h.distance(l),d=n.dotProduct(o,l),g=c*u;return r?Math.PI-Math.acos(d/g):Math.PI+Math.acos(d/g)}isAngleAcute(t){const e=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),s=this.vertices[t],i=this.vertices[(t+1)%this.vertices.length].clone();return r.utils.determinant(e,s,i)<0}getVertexAt(t){return t<0?this.vertices[this.vertices.length-Math.abs(t)%this.vertices.length]:this.vertices[t%this.vertices.length]}move(t){for(var e in this.vertices)this.vertices[e].add(t);return this}containsVert(t){for(var e=!1,s=0,i=this.vertices.length-1;s<this.vertices.length;i=s++){let r=this.vertices[s].x,n=this.vertices[s].y,a=this.vertices[i].x,h=this.vertices[i].y;n>t.y!=h>t.y&&t.x<(a-r)*(t.y-n)/(h-n)+r&&(e=!e)}return e}containsVerts(t){return t.every((t=>this.containsVert(t)))}containsPolygon(t){for(var e=0;e<t.vertices.length;e++)if(!this.containsVert(t.vertices[e]))return!1;const s=new l(new a,new a);for(e=0;e<t.vertices.length;e++)if(s.a.set(t.vertices[e]),s.b.set(t.vertices[(e+1)%t.vertices.length]),this.lineIntersections(s,!0).length>0)return!1;return!0}area(){return c.utils.area(this.vertices)}signedArea(){return c.utils.signedArea(this.vertices)}isClockwise(){return c.utils.isClockwise(this.vertices)}perimeter(){let t=0;for(var e=1;e<this.vertices.length;e++)t+=this.vertices[e-1].distance(this.vertices[e]);return!this.isOpen&&this.vertices.length>1&&(t+=this.vertices[0].distance(this.vertices[this.vertices.length-1])),t}scale(t,e){for(var s in this.vertices)"function"==typeof this.vertices[s].scale?this.vertices[s].scale(t,e):console.log("There seems to be a null vertex!",this.vertices[s]);return this}rotate(t,e){for(var s in this.vertices)this.vertices[s].rotate(t,e);return this}getMeanCenter(){if(0===this.vertices.length)return null;const t=this.vertices[0].clone();for(var e=1;e<this.vertices.length;e++)t.add(this.vertices[e]);return t.x/=this.vertices.length,t.y/=this.vertices.length,t}getCentroid(){if(0===this.vertices.length)return null;const t=new a(0,0),e=this.vertices.length;for(var s=0;s<e;s++){const r=this.vertices[s],n=this.vertices[(s+1)%e];var i=r.x*n.y-n.x*r.y;t.x+=(r.x+n.x)*i,t.y+=(r.y+n.y)*i}const r=this.area();return t.x*=1/(6*r),t.y*=1/(6*r),t}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map((t=>t.intersectionPoint))}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map((t=>{const e=this.getEdgeAt(t.edgeIndex);return new o(e.a.clone(),e.b.clone()).moveTo(t.intersectionPoint)}))}closestLineIntersection(t,e=!1){const s=this.lineIntersections(t,e);if(s.length<=0)return null;let i=new a(Number.MAX_VALUE,Number.MAX_VALUE),r=Number.MAX_VALUE;for(var n in s){const e=s[n],a=e.distance(t.a);a<r&&(r=a,i=e)}return i}getInterpolationPolygon(t){const e=[];for(var s=0;s<this.vertices.length;s++){const r=this.vertices[s],n=this.vertices[(s+1)%this.vertices.length];if(e.push(r.clone()),!this.isOpen||s+1!==this.vertices.length){const s=1/(t+1);for(var i=1;i<=t;i++)e.push(r.clone().lerp(n,s*i))}}return new c(e,this.isOpen)}getEvenDistributionPolygon(t){if(t<=0)throw new Error("pointCount must be larger than zero; is "+t+".");const e=new c([],this.isOpen);if(0===this.vertices.length)return e;let s=new a(this.vertices[0]);if(e.vertices.push(s),1===this.vertices.length)return e;const i=this.perimeter()/t,r=this.vertices.length;let n=1,h=new a(this.vertices[1]),o=s.distance(h),l=this.isOpen?r:r+1,u=i;for(var d=1;d<t&&n<l;)if(u<o){let t=s.clone().lerpAbs(h,u);e.vertices.push(t),u+=i,d++}else n++,s=h,h=new a(this.vertices[n%r]),u-=o,o=s.distance(h);return e}getBounds(){return u.computeFromVertices(this.vertices)}clone(){return new c(this.vertices.map((t=>t.clone())),this.isOpen)}elimitateColinearEdges(t){const e=void 0===t?1:t,s=this.vertices.slice();let i=0;for(var r=new l(new a,new a),n=new l(new a,new a);i+1<s.length&&s.length>2;){const t=s[i],a=s[(i+1)%s.length];r.a=t,r.b=a,n.a=a;let h=!1,o=i+2;do{let t=s[o%s.length];n.b=t,h=r.colinear(n,e),h&&o++}while(h);o-i>2&&s.splice(i+1,o-i-2),i++}return new c(s,this.isOpen)}toQuadraticBezierData(){if(this.vertices.length<3)return[];var t=[],e=this.vertices[0],s=this.vertices[1],i=new a(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(i);for(var r=this.isOpen?this.vertices.length:this.vertices.length+1,n=1;n<r;n++){e=this.vertices[n%this.vertices.length],s=this.vertices[(n+1)%this.vertices.length];i=new a(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(e),t.push(i),e=s}return t}toQuadraticBezierSVGString(){var t=this.toQuadraticBezierData();if(0==t.length)return"";for(var e=["M "+t[0].x+" "+t[0].y],s=1;s<t.length;s+=2)e.push("Q "+t[s].x+" "+t[s].y+", "+t[s+1].x+" "+t[s+1].y);return e.join(" ")}toCubicBezierData(t){if(void 0===t&&(t=1),this.vertices.length<3)return[];var e=[],s=this.vertices[0],i=this.vertices[1],r=new a(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2);e.push(r);for(var n=this.isOpen?this.vertices.length-1:this.vertices.length,h=0;h<n;h++){s=this.vertices[h%this.vertices.length],i=this.vertices[(h+1)%this.vertices.length];var o=this.vertices[(h+2)%this.vertices.length],l=new a(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2),c=new a(i.x+(o.x-i.x)/2,i.y+(o.y-i.y)/2),u=new a(l.x+(i.x-l.x)*t,l.y+(i.y-l.y)*t),d=new a(c.x+(i.x-c.x)*t,c.y+(i.y-c.y)*t);e.push(u),e.push(d),e.push(c)}return e}toCubicBezierSVGString(t){var e=this.toCubicBezierData(t);if(0==e.length)return"";for(var s=["M "+e[0].x+" "+e[0].y],i=1;i<e.length;i+=3)s.push("C "+e[i].x+" "+e[i].y+", "+e[i+1].x+" "+e[i+1].y+", "+e[i+2].x+" "+e[i+2].y);return s.join(" ")}toCubicBezierPath(t){for(var e=this.toCubicBezierData(t),s=[],i=0;i+3<e.length;i+=3)s.push([e[i],e[i+3],e[i+1],e[i+2]]);return g.fromArray(s)}destroy(){for(var t=0;t<this.vertices.length;t++)this.vertices[t].destroy();this.isDestroyed=!0}}c.utils={area(t){let e=0;for(var s=0,i=t.length;s<i;s++){e+=t[s].x*t[(s+1)%i].y*.5,e-=t[(s+1)%i].x*t[s].y*.5}return Math.abs(e)},isClockwise:t=>c.utils.signedArea(t)<0,signedArea(t){let e=0;const s=t.length;for(var i=0;i<s;i++){const r=(i+1)%s;e+=(t[r].x-t[i].x)*(t[i].y+t[r].y)}return e},locateLineIntersecion(t,e,s,i){const r=[];for(var n=s?e.length-1:e.length,a=0;a<n;a++){const s=new l(e[a%n],e[(a+1)%n]),h=s.intersection(t);null===h||!s.hasPoint(h,!0)||i&&!t.hasPoint(h,i)||r.push({edgeIndex:a,intersectionPoint:h})}return r}};class u{constructor(t,e){this.min=t,this.max=e,this.width=e.x-t.x,this.height=e.y-t.y}getNorthPoint(){return new a(this.min.x+this.width/2,this.min.y)}getSouthPoint(){return new a(this.min.x+this.width/2,this.max.y)}getWestPoint(){return new a(this.min.x,this.min.y+this.height/2)}getEastPoint(){return new a(this.max.x,this.min.y+this.height/2)}toPolygon(){return new c([new a(this.min),new a(this.max.x,this.min.y),new a(this.max),new a(this.min.x,this.max.y)],!1)}getCenter(){return new a(this.min.x+(this.max.x-this.min.x)/2,this.min.y+(this.max.y-this.min.y)/2)}getMinDimension(){return Math.min(this.width,this.height)}getMaxDimension(){return Math.max(this.width,this.height)}randomPoint(t=0,e=0){const s=t>0&&t<1?this.width*t:t,i=e>0&&e<1?this.height*e:e;return new a(this.min.x+s+Math.random()*(this.width-2*s),this.min.y+i+Math.random()*(this.height-2*i))}toString(){return`{ min: ${this.min.toString()}, max : ${this.max.toString()}, width: ${this.width}, height : ${this.height} }`}clone(){return new u({x:this.min.x,y:this.min.y},{x:this.max.x,y:this.max.y})}static computeFromVertices(t){if(0==t.length)return new u(new a(0,0),new a(0,0));let e,s=t[0].x,i=t[0].x,r=t[0].y,n=t[0].y;for(var h in t)e=t[h],s=Math.min(s,e.x),i=Math.max(i,e.x),r=Math.min(r,e.y),n=Math.max(n,e.y);return new u(new a(s,r),new a(i,n))}static computeFromBoundsSet(t){if(0==t.length)return new u(new a(0,0),new a(0,0));let e,s=t[0].min.x,i=t[0].max.x,r=t[0].min.y,n=t[0].min.y;for(var h in t)e=t[h],s=Math.min(s,e.min.x),i=Math.max(i,e.max.x),r=Math.min(r,e.min.y),n=Math.max(n,e.min.y);return new u(new a(s,r),new a(i,n))}static fromDimension(t,e,s){return new u(null!=s?s:{x:0,y:0},{x:(s?s.x:0)+t,y:(s?s.y:0)+e})}}class d{constructor(t,s,i,r){this.START_POINT=d.START_POINT,this.START_CONTROL_POINT=d.START_CONTROL_POINT,this.END_CONTROL_POINT=d.END_CONTROL_POINT,this.END_POINT=d.END_POINT,this.uid=e.next(),this.startPoint=t,this.startControlPoint=i,this.endPoint=s,this.endControlPoint=r,this.curveIntervals=30,this.segmentCache=[],this.segmentLengths=[],this.updateArcLengths()}moveCurvePoint(t,e,s,i){t==this.START_POINT?(this.getStartPoint().add(e),s&&this.getStartControlPoint().add(e)):t==this.START_CONTROL_POINT?this.getStartControlPoint().add(e):t==this.END_CONTROL_POINT?this.getEndControlPoint().add(e):t==this.END_POINT?(this.getEndPoint().add(e),s&&this.getEndControlPoint().add(e)):console.log(`[CubicBezierCurve.moveCurvePoint] pointID '${t}' invalid.`),i&&this.updateArcLengths()}translate(t){return this.startPoint.add(t),this.startControlPoint.add(t),this.endControlPoint.add(t),this.endPoint.add(t),this}move(t){return this.translate(t)}reverse(){let t=this.startPoint;return this.startPoint=this.endPoint,this.endPoint=t,t=this.startControlPoint,this.startControlPoint=this.endControlPoint,this.endControlPoint=t,this}getLength(){return this.arcLength}updateArcLengths(){let t=this.startPoint.clone(),e=new a(0,0),s=1/this.curveIntervals;this.segmentCache=[],this.segmentCache.push(this.startPoint),this.segmentLengths=[];let i=0;var r=0;let n;for(;r<=1;)e=this.getPointAt(r),this.segmentCache.push(e),n=t.distance(e),this.segmentLengths.push(n),i+=n,t=e,r+=s;this.arcLength=i}getClosestT(t){var e={t:0,tPrev:0,tNext:1},s=0;do{e=this.locateIntervalByDistance(t,e.tPrev,e.tNext,this.curveIntervals),s++}while(s<4&&this.getPointAt(e.tPrev).distance(this.getPointAt(e.tNext))>1);return e.t}locateIntervalByDistance(t,e,s,i){var r=-1,n=0,a=0;const h=s-e;for(var o=0;o<=i;o++){a=e+h*(o/i);var l=this.getPointAt(a).distance(t);(-1==r||l<n)&&(r=o,n=l)}return{t:e+h*(r/i),tPrev:e+h*(Math.max(0,r-1)/i),tNext:e+h*(Math.min(i,r+1)/i)}}getBounds(){const t=d.utils.cubicPolyMinMax(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),e=t.min,s=t.max,i=d.utils.cubicPolyMinMax(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y),r=i.min,n=i.max;return u.computeFromVertices([{x:e,y:r},{x:e,y:n},{x:s,y:n},{x:s,y:r}])}getStartPoint(){return this.startPoint}getEndPoint(){return this.endPoint}getStartControlPoint(){return this.startControlPoint}getEndControlPoint(){return this.endControlPoint}getPointByID(t){if(t==this.START_POINT)return this.startPoint;if(t==this.END_POINT)return this.endPoint;if(t==this.START_CONTROL_POINT)return this.startControlPoint;if(t==this.END_CONTROL_POINT)return this.endControlPoint;throw new Error(`Invalid point ID '${t}'.`)}getPointAt(t){const e=d.utils.evaluateT(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x,t),s=d.utils.evaluateT(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y,t);return new a(e,s)}getPoint(t){return this.getPointAt(t/this.arcLength)}getTangentAt(t){const e=this.getStartPoint(),s=this.getStartControlPoint(),i=this.getEndControlPoint(),r=this.getEndPoint(),n=t*t,h=1-2*t+n,o=-3*e.x*h+s.x*(3*h-6*(t-n))+i.x*(6*(t-n)-3*n)+3*r.x*n,l=-3*e.y*h+s.y*(3*h-6*(t-n))+i.y*(6*(t-n)-3*n)+3*r.y*n;return new a(o,l)}trimStart(t){return this.trimStartAt(this.convertU2T(t))}trimStartAt(t){const e=d.utils.getSubCurvePointsAt(this,t,1);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}trimEnd(t){return this.trimEndAt(this.convertU2T(t))}trimEndAt(t){const e=d.utils.getSubCurvePointsAt(this,0,t);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}getSubCurve(t,e){return this.getSubCurveAt(this.convertU2T(t),this.convertU2T(e))}getSubCurveAt(t,e){const s=d.utils.getSubCurvePointsAt(this,t,e);return new d(s[0],s[1],s[2],s[3])}convertU2T(t){return Math.max(0,Math.min(1,t/this.arcLength))}getTangent(t){return this.getTangentAt(this.convertU2T(t))}getPerpendicular(t){return this.getPerpendicularAt(this.convertU2T(t))}getPerpendicularAt(t){const e=this.getTangentAt(t);return new a(e.y,-e.x)}clone(){return new d(this.getStartPoint().clone(),this.getEndPoint().clone(),this.getStartControlPoint().clone(),this.getEndControlPoint().clone())}getStartTangent(){return this.startControlPoint}getEndTangent(){return this.endControlPoint}lineIntersections(t,e=!1){const s=this.lineIntersectionTs(t).map((t=>this.getPointAt(t)));return e?s.filter((e=>t.hasPoint(e,!0))):s}lineIntersectionTangents(t,e=!1){const s=this.lineIntersectionTs(t).map((t=>{const e=this.getPointAt(t),s=this.getTangentAt(t);return new o(e,s.add(e))}));return e?s.filter((e=>t.hasPoint(e.a,!0))):s}lineIntersectionTs(t){var e=t.b.y-t.a.y,s=t.a.x-t.b.x,i=t.a.x*(t.a.y-t.b.y)+t.a.y*(t.b.x-t.a.x),r=d.utils.bezierCoeffs(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),n=d.utils.bezierCoeffs(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y);const a=Array(4);return a[0]=e*r[0]+s*n[0],a[1]=e*r[1]+s*n[1],a[2]=e*r[2]+s*n[2],a[3]=e*r[3]+s*n[3]+i,d.utils.cubicRoots(a).filter((t=>-1!=t))}equals(t){return!!t&&(!!(t.startPoint&&t.endPoint&&t.startControlPoint&&t.endControlPoint)&&(this.startPoint.equals(t.startPoint)&&this.endPoint.equals(t.endPoint)&&this.startControlPoint.equals(t.startControlPoint)&&this.endControlPoint.equals(t.endControlPoint)))}destroy(){this.startPoint.destroy(),this.endPoint.destroy(),this.startControlPoint.destroy(),this.endControlPoint.destroy(),this.isDestroyed=!0}static isInstance(t){return t instanceof d}toJSON(t){return"{ "+(t?"\n\t":"")+'"startPoint" : ['+this.getStartPoint().x+","+this.getStartPoint().y+"], "+(t?"\n\t":"")+'"endPoint" : ['+this.getEndPoint().x+","+this.getEndPoint().y+"], "+(t?"\n\t":"")+'"startControlPoint": ['+this.getStartControlPoint().x+","+this.getStartControlPoint().y+"], "+(t?"\n\t":"")+'"endControlPoint" : ['+this.getEndControlPoint().x+","+this.getEndControlPoint().y+"]"+(t?"\n\t":"")+" }"}static fromJSON(t){var e=JSON.parse(t);return d.fromObject(e)}static fromObject(t){if("object"!=typeof t)throw"Can only build from object.";if(!t.startPoint)throw'Object member "startPoint" missing.';if(!t.endPoint)throw'Object member "endPoint" missing.';if(!t.startControlPoint)throw'Object member "startControlPoint" missing.';if(!t.endControlPoint)throw'Object member "endControlPoint" missing.';return new d(new a(t.startPoint[0],t.startPoint[1]),new a(t.endPoint[0],t.endPoint[1]),new a(t.startControlPoint[0],t.startControlPoint[1]),new a(t.endControlPoint[0],t.endControlPoint[1]))}static fromArray(t){if(!Array.isArray(t))throw"Can only build from object.";if(4!=t.length)throw"Can only build from array with four elements.";return new d(t[0],t[1],t[2],t[3])}}d.START_POINT=0,d.START_CONTROL_POINT=1,d.END_CONTROL_POINT=2,d.END_POINT=3,d.utils={evaluateT:(t,e,s,i,r)=>t*Math.pow(1-r,3)+3*e*r*Math.pow(1-r,2)+3*s*Math.pow(r,2)*(1-r)+i*Math.pow(r,3),cubicPolyMinMax:(t,e,s,i)=>{var r=d.utils.cubicPoly(t,e,s,i),n=r[0],a=r[1];r[2];var h=r[1]*r[1]-4*r[0]*r[2],o=Math.min(i,t),l=Math.max(i,t);if(h>=0){var c=(-a+Math.sqrt(h))/(2*n);if(c>0&&c<1){var u=d.utils.evaluateT(t,e,s,i,c);u<o&&(o=u),u>l&&(l=u)}var g=(-a-Math.sqrt(h))/(2*n);if(g>0&&g<1){var f=d.utils.evaluateT(t,e,s,i,g);f<o&&(o=f),f>l&&(l=f)}}return{min:o,max:l}},getSubCurvePointsAt:(t,e,s)=>{const i=new o(t.getPointAt(e),t.getTangentAt(e)),r=new o(t.getPointAt(s),t.getTangentAt(s).inv());return i.b.add(i.a),r.b.add(r.a),i.scale(.33333333*(s-e)),r.scale(.33333333*(s-e)),[i.a,r.a,i.b,r.b]},cubicRoots:t=>{const e=t[0],s=t[1]/e,i=t[2]/e,r=t[3]/e;var n,a;const h=(3*i-Math.pow(s,2))/9,o=(9*s*i-27*r-2*Math.pow(s,3))/54,l=Math.pow(h,3)+Math.pow(o,2),c=[];if(l>=0)n=d.utils.sgn(o+Math.sqrt(l))*Math.pow(Math.abs(o+Math.sqrt(l)),1/3),a=d.utils.sgn(o-Math.sqrt(l))*Math.pow(Math.abs(o-Math.sqrt(l)),1/3),c[0]=-s/3+(n+a),c[1]=-s/3-(n+a)/2,c[2]=-s/3-(n+a)/2,0!=Math.abs(Math.sqrt(3)*(n-a)/2)&&(c[1]=-1,c[2]=-1);else{const t=Math.acos(o/Math.sqrt(-Math.pow(h,3)));c[0]=2*Math.sqrt(-h)*Math.cos(t/3)-s/3,c[1]=2*Math.sqrt(-h)*Math.cos((t+2*Math.PI)/3)-s/3,c[2]=2*Math.sqrt(-h)*Math.cos((t+4*Math.PI)/3)-s/3,0}return c.filter((t=>t>=0&&t<=1)).sort()},bezierCoeffs:(t,e,s,i)=>{const r=[NaN,NaN,NaN,NaN];return r[0]=3*e-t+-3*s+i,r[1]=3*t-6*e+3*s,r[2]=-3*t+3*e,r[3]=t,r},cubicPoly:(t,e,s,i)=>[3*i-9*s+9*e-3*t,6*t-12*e+6*s,3*e-3*t],sgn:t=>t<0?-1:1};class g{constructor(){this.className="BezierPath",this.START_POINT=0,this.START_CONTROL_POINT=1,this.END_CONTROL_POINT=2,this.END_POINT=3,this.uid=e.next(),this.totalArcLength=0,this.adjustCircular=!1,this.bezierCurves=[]}addCurve(t){if(null==t||void 0===t)throw"Cannot add null curve to bézier path.";this.bezierCurves.push(t),this.bezierCurves.length>1?(t.startPoint=this.bezierCurves[this.bezierCurves.length-2].endPoint,this.adjustSuccessorControlPoint(this.bezierCurves.length-2,!0,!0)):this.totalArcLength+=t.getLength()}locateCurveByStartPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startPoint.equals(t))return e;return-1}locateCurveByEndPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endPoint.equals(t))return e;return-1}locateCurveByStartControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startControlPoint.equals(t))return e;return-1}locateCurveByEndControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endControlPoint.equals(t))return e;return-1}getLength(){return this.totalArcLength}updateArcLengths(){this.totalArcLength=0;for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].updateArcLengths(),this.totalArcLength+=this.bezierCurves[t].getLength()}getCurveCount(){return this.bezierCurves.length}getCurveAt(t){return this.bezierCurves[t]}translate(t){for(var e=0;e<this.bezierCurves.length;e++){(s=this.bezierCurves[e]).getStartPoint().add(t),s.getStartControlPoint().add(t),s.getEndControlPoint().add(t)}var s;return(s=this.bezierCurves[this.bezierCurves.length-1]).getEndPoint().add(t),this.updateArcLengths(),this}move(t){return this.translate(t)}scale(t,e){return this.scaleXY({x:e,y:e},t)}scaleXY(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().scaleXY(t,e),i.getStartControlPoint().scaleXY(t,e),i.getEndControlPoint().scaleXY(t,e)}return this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().scaleXY(t,e),this.updateArcLengths(),this}rotate(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().rotate(t,e),i.getStartControlPoint().rotate(t,e),i.getEndControlPoint().rotate(t,e)}this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().rotate(t,e)}getClosestT(t){for(var e=-1,s=0,i=0,r=0,n=0,a=0,h=0;h<this.bezierCurves.length;h++)r=this.bezierCurves[h].getClosestT(t),i=this.bezierCurves[h].getPointAt(r).distance(t),(-1==e||i<s)&&(e=h,s=i,n=a+r*this.bezierCurves[h].getLength()),a+=this.bezierCurves[h].getLength();return Math.max(0,Math.min(1,n/this.totalArcLength))}getPoint(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getPoint(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(t,0)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;if(e>=this.bezierCurves.length)return this.bezierCurves[this.bezierCurves.length-1].getEndPoint().clone();var i=t-s;return this.bezierCurves[e].getPoint(i)}getPointAt(t){return this.getPoint(t*this.totalArcLength)}getTangentAt(t){return this.getTangent(t*this.totalArcLength)}getTangent(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getTangent(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;var i=t-s;return this.bezierCurves[e].getTangent(i)}getPerpendicularAt(t){return this.getPerpendicular(t*this.totalArcLength)}getPerpendicular(t){(t<0||t>this.totalArcLength)&&(console.log("[BezierPath.getPerpendicular(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));var e=g._locateUIndex(this,t),s=this.bezierCurves[e.i],i=t-e.uPart;return s.getPerpendicular(i)}lineIntersections(t,e=!1){return this.bezierCurves.reduce(((s,i)=>s.concat(i.lineIntersections(t,e))),[])}lineIntersectionTangents(t,e=!1){return this.bezierCurves.reduce(((s,i)=>s.concat(i.lineIntersectionTangents(t,e))),[])}static _locateUIndex(t,e){for(var s=0,i=0,r=0;s<t.bezierCurves.length&&i+t.bezierCurves[s].getLength()<e;)i+=t.bezierCurves[s].getLength(),s+1<t.bezierCurves.length&&(r+=t.bezierCurves[s].getLength()),s++;return{i:s,uPart:i,uBefore:r}}getSubPathAt(t,e){t=Math.max(0,t),e=Math.min(1,e);let s=t*this.totalArcLength,i=e*this.totalArcLength;var r=g._locateUIndex(this,s),n=g._locateUIndex(this,i),a=(s-r.uBefore)/this.bezierCurves[r.i].getLength();if(r.i==n.i){var h=(i-n.uBefore)/this.bezierCurves[n.i].getLength(),o=this.bezierCurves[r.i].getSubCurveAt(a,h);return g.fromArray([o])}var l=[];if(r.i>n.i){o=this.bezierCurves[r.i].getSubCurveAt(a,0);l.push(o);for(var c=r.i-1;c>n.i;c--)l.push(this.bezierCurves[c].clone().reverse());h=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(1,h))}else{o=this.bezierCurves[r.i].getSubCurveAt(a,1);l.push(o);for(c=r.i+1;c<n.i&&c<this.bezierCurves.length;c++)l.push(this.bezierCurves[c].clone());h=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(0,h))}return g.fromArray(l)}moveCurvePoint(t,e,s){if(this.getCurveAt(t).moveCurvePoint(e,s,!0,!0),e==this.START_POINT&&(t>0||this.adjustCircular))this.getCurveAt(t-1<0?this.bezierCurves.length+(t-1):t-1).moveCurvePoint(this.END_CONTROL_POINT,s,!0,!1);else if(e==this.END_POINT&&(t+1<this.bezierCurves.length||this.adjustCircular)){this.getCurveAt((t+1)%this.bezierCurves.length).moveCurvePoint(this.START_CONTROL_POINT,s,!0,!1)}else e==this.START_CONTROL_POINT&&t>0?this.adjustPredecessorControlPoint(t,!0,!1):e==this.END_CONTROL_POINT&&t+1<this.getCurveCount()&&this.adjustSuccessorControlPoint(t,!0,!1);this.updateArcLengths()}adjustPredecessorControlPoint(t,e,s){if(this.adjustCircular||!(t<=0)){var i=this.getCurveAt(t),r=this.getCurveAt(t-1<0?this.getCurveCount()+(t-1):t-1);g.adjustNeighbourControlPoint(i,r,i.getStartPoint(),i.getStartControlPoint(),r.getEndPoint(),r.getEndControlPoint(),e,s)}}adjustSuccessorControlPoint(t,e,s){if(this.adjustCircular||!(t+1>this.getCurveCount())){var i=this.getCurveAt(t),r=this.getCurveAt((t+1)%this.getCurveCount());g.adjustNeighbourControlPoint(i,r,i.getEndPoint(),i.getEndControlPoint(),r.getStartPoint(),r.getStartControlPoint(),e,s)}}static adjustNeighbourControlPoint(t,e,s,i,r,n,h,o){var l=new a(i.x-s.x,i.y-s.y),c=new a(n.x-r.x,n.y-r.y),u=Math.sqrt(Math.pow(l.x,2)+Math.pow(l.y,2)),d=Math.sqrt(Math.pow(c.x,2)+Math.pow(c.y,2));u<=.1||(h?n.set(r.x-l.x*(d/u),r.y-l.y*(d/u)):n.set(r.x-l.x,r.y-l.y),e.updateArcLengths())}getBounds(){const t=new a(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY),e=new a(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY);for(var s,i=0;i<this.bezierCurves.length;i++)s=this.bezierCurves[i].getBounds(),t.x=Math.min(t.x,s.min.x),t.y=Math.min(t.y,s.min.y),e.x=Math.max(e.x,s.max.x),e.y=Math.max(e.y,s.max.y);return new u(t,e)}getEvenDistributionVertices(t){if(t<2)throw new Error("pointCount must be larger than one; is "+t+".");const e=[];if(0===this.bezierCurves.length)return e;var s=new a(this.bezierCurves[0].startPoint);e.push(s);const i=this.totalArcLength/(t-1),r=this.bezierCurves.length;let n=0,h=this.bezierCurves[0].arcLength,o=i,l=1;for(;l<t&&n<r;)if(o<h){var c=this.bezierCurves[n].getPoint(o);e.push(c),o+=i,l++}else n++,o-=h,h=n<r?this.bezierCurves[n].arcLength:0;return e.push(new a(this.bezierCurves[r-1].endPoint)),e}clone(){for(var t=new g,e=0;e<this.bezierCurves.length;e++)t.bezierCurves.push(this.bezierCurves[e].clone()),e>0&&(t.bezierCurves[e-1].endPoint=t.bezierCurves[e].startPoint);return t.updateArcLengths(),t.adjustCircular=this.adjustCircular,t}equals(t){if(!t)return!1;if(!t.bezierCurves)return!1;if(void 0===t.bezierCurves.length)return!1;if(t.bezierCurves.length!=this.bezierCurves.length)return!1;for(var e=0;e<this.bezierCurves.length;e++)if(!this.bezierCurves[e].equals(t.bezierCurves[e]))return!1;return!0}destroy(){for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].destroy();this.isDestroyed=!0}toPathPoints(){if(0===this.bezierCurves.length)return[];if(1===this.bezierCurves.length)return[this.bezierCurves[0].startPoint,this.bezierCurves[0].startControlPoint,this.bezierCurves[0].endControlPoint,this.bezierCurves[0].endPoint];const t=[];t.push(this.bezierCurves[0].startPoint),t.push(this.bezierCurves[0].startControlPoint);for(var e=1;e<this.bezierCurves.length;e++)t.push(this.bezierCurves[e-1].endControlPoint),t.push(this.bezierCurves[e-1].endPoint),t.push(this.bezierCurves[e].startPoint),t.push(this.bezierCurves[e].startControlPoint);return t.push(this.bezierCurves[0].endControlPoint),t.push(this.bezierCurves[0].endPoint),t}toJSON(t){var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++)s>0&&e.push(","),t?e.push("\n\t"):e.push(" "),e.push(this.bezierCurves[s].toJSON(t));return 0!=this.bezierCurves.length&&e.push(" "),e.push("]"),e.join("")}static fromJSON(t){var e=JSON.parse(t);return g.fromArray(e)}static fromCurve(t){const e=new g;return e.addCurve(t),e}static fromArray(t){if(!Array.isArray(t))throw"[BezierPath.fromArray] Passed object must be an array.";const e=t;if(e.length<1)throw"[BezierPath.fromArray] Passed array must contain at least one bezier curve (has "+e.length+").";for(var s=new g,i=null,r=0;r<e.length;r++){var n;if(d.isInstance(e[r]))n=e[r].clone();else if(0 in e[r]&&1 in e[r]&&2 in e[r]&&3 in e[r]){if(!(e[r][0]&&e[r][1]&&e[r][2]&&e[r][3]))throw"Cannot convert path data to BezierPath instance. At least one element is undefined (index="+r+"): "+e[r];n=d.fromArray(e[r])}else n=d.fromObject(e[r]);i&&(n.startPoint=i.endPoint),s.bezierCurves.push(n),i=n}return s.updateArcLengths(),s}toReducedListRepresentation(t){void 0===t&&(t=1);var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];e.push(i.getStartPoint().x.toFixed(t)),e.push(","),e.push(i.getStartPoint().y.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().x.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().y.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().x.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().y.toFixed(t)),e.push(",")}if(0!=this.bezierCurves.length){i=this.bezierCurves[this.bezierCurves.length-1];e.push(i.getEndPoint().x.toFixed(t)),e.push(","),e.push(i.getEndPoint().y.toFixed(t))}return e.push("]"),e.join("")}static fromReducedListRepresentation(t,e){var s=JSON.parse(t);if(!s.length)throw console.log("Cannot parse bezier path from non-array object nor from empty point list."),"Cannot parse bezier path from non-array object nor from empty point list.";if(s.length<8)throw console.log("Cannot build bezier path. The passed array must contain at least 8 elements (numbers)."),"Cannot build bezier path. The passed array must contain at least 8 elements (numbers).";return g.fromReducedList(s,e)}static fromReducedList(t,e){var s,i,r,n=new g,h=new a,o=0;do{0==o&&(h=new a(t[o],t[o+1])),s=new a(t[o+2],t[o+3]),i=new a(t[o+4],t[o+5]),r=new a(t[o+6],t[o+7]);var l=new d(h,r,s,i);n.bezierCurves.push(l),h=r,o+=6}while(o+2<t.length);return n.adjustCircular=null!=e&&e,e&&(n.bezierCurves[n.bezierCurves.length-1].endPoint=n.bezierCurves[0].startPoint),n.updateArcLengths(),n}}g.START_POINT=0,g.START_CONTROL_POINT=1,g.END_CONTROL_POINT=2,g.END_POINT=3;class f{constructor(t,s,i){this.className="CircleSector",this.uid=e.next(),this.circle=t,this.startAngle=s,this.endAngle=i}getBounds(){const t=this,e=this.circle.getBounds(),s=[e.getNorthPoint(),e.getSouthPoint(),e.getWestPoint(),e.getEastPoint()].filter((e=>{const s=new l(t.circle.center,e).angle();return t.containsAngle(s)}));return u.computeFromVertices(s.concat([this.getStartPoint(),this.getEndPoint()]))}move(t){return this.circle.move(t),this}containsAngle(t){var e=n.mapAngleTo2PI(t),s=n.mapAngleTo2PI(this.startAngle),i=n.mapAngleTo2PI(this.endAngle);return s<=i?e>=s&&e<i:e>=s||e<i}angleAt(t){if(this.startAngle<=this.endAngle){return(this.startAngle+(this.endAngle-this.startAngle)*t)%(2*Math.PI)}return(this.startAngle+(2*Math.PI-this.startAngle+this.endAngle)*t)%(2*Math.PI)}getStartPoint(){return this.circle.vertAt(this.startAngle)}getEndPoint(){return this.circle.vertAt(this.endAngle)}circleSectorIntersection(t){const e=this.circle.circleIntersection(t.circle);if(!e)return null;const s=this.circle.center.angle(e.a),r=this.circle.center.angle(e.b);if(!this.containsAngle(s)||!this.containsAngle(r))return null;const n=t.circle.center.angle(e.a),a=t.circle.center.angle(e.b);if(!t.containsAngle(n)||!t.containsAngle(a))return null;var h=new f(this.circle,this.endAngle,this.startAngle).angleAt(.5);const o=new f(new i(this.circle.center.clone(),this.circle.radius),s,r);return o.containsAngle(h)&&(o.startAngle=r,o.endAngle=s),o}lineIntersections(t,e=!1){const s=this.circle.lineIntersections(t,e),i=new l(this.circle.center,new a);return s.filter((t=>{i.b.set(t);const e=i.angle();return this.containsAngle(n.wrapMinMax(e,0,2*Math.PI))}))}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map((t=>{const e=new l(this.circle.center,t).angle();return this.circle.tangentAt(e)}))}destroy(){this.circle.destroy(),this.isDestroyed=!0}}f.circleSectorUtils={polarToCartesian:(t,e,s,i)=>({x:t+s*Math.cos(i),y:e+s*Math.sin(i)}),describeSVGArc:(t,e,s,i,r,n)=>{void 0===n&&(n={moveToStart:!0});const a=f.circleSectorUtils.polarToCartesian(t,e,s,r),h=f.circleSectorUtils.polarToCartesian(t,e,s,i);if(2*Math.PI-Math.abs(i-r)<.001){const a=f.circleSectorUtils.describeSVGArc(t,e,s,i,i+(r-i)/2,n),h=f.circleSectorUtils.describeSVGArc(t,e,s,i+(r-i)/2,r,n);return a.concat(h)}const o=r-i;var l,c;o<0?(l=Math.abs(o)<Math.PI?1:0,c=1):(l=Math.abs(o)>Math.PI?1:0,c=1);const u=[];return n.moveToStart&&u.push("M",h.x,h.y),u.push("A",s,s,0,l,c,a.x,a.y),u}};const x=180/Math.PI;class v{constructor(t,e,s,i,r,n,h,o,l,c,u,d){if(this.svgNode=t,this.offset=new a(0,0).set(e),this.scale=new a(1,1).set(s),this.fillShapes=r,this.isSecondary=Boolean(h),this.drawConfig=n,this.drawlibConfiguration={},this.cache=new Map,this.setSize(i),h){if(!(o&&l&&c&&u))throw"Cannot create secondary svg draw lib with undefinde gNode|bufferGNode|nodeDefs|bufferNodeDefs.";this.gNode=o,this.bufferGNode=l,this.nodeDefs=c,this.bufferedNodeDefs=u,d&&(this.nodeStyle=d)}else this.addStyleDefs(n),this.addDefsNode(),this.gNode=this.createSVGNode("g"),this.bufferGNode=this.createSVGNode("g"),this.svgNode.appendChild(this.gNode)}addStyleDefs(t){this.nodeStyle=this.createSVGNode("style"),this.svgNode.appendChild(this.nodeStyle),this.rebuildStyleDefs(t)}rebuildStyleDefs(t){const e={bezier:"CubicBezierCurve",polygon:"Polygon",triangle:"Triangle",ellipse:"Ellipse",ellipseSector:"EllipseSector",circle:"Circle",circleSector:"CircleSector",vertex:"Vertex",line:"Line",vector:"Vector",image:"Image",text:"Text"},s=[];for(var i in e){const r=e[i],n=t[i];n?s.push(`.${r} { fill : none; stroke: ${n.color}; stroke-width: ${n.lineWidth}px }`):console.warn(`Warning: your draw config is missing the key '${i}' which is required.`)}this.customStyleDefs&&(s.push("\n/* Custom styles */\n"),this.customStyleDefs.forEach(((t,e)=>{s.push(e+" { "+t+" }")}))),this.nodeStyle.innerHTML=s.join("\n")}addDefsNode(){this.nodeDefs=this.createSVGNode("defs"),this.bufferedNodeDefs=this.createSVGNode("defs"),this.svgNode.appendChild(this.nodeDefs)}addCustomStyleDefs(t){this.customStyleDefs=t}findElement(t,e){if(!t)return null;var s=this.cache.get(t);return s&&s.nodeName.toUpperCase()===e.toUpperCase()?(this.cache.delete(t),s):null}createSVGNode(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}makeNode(t){var e=this.findElement(this.curId,t);return e||(e=this.createSVGNode(t)),this.drawlibConfiguration.blendMode&&e.style["mix-blend-mode"](this.drawlibConfiguration.blendMode),e}_bindFillDraw(t,e,s,i,r){return this._configureNode(t,e,this.fillShapes,s,i,r),this._bindNode(t,void 0)}_bindNode(t,e){return t.parentNode||(null!=e?e:this.bufferGNode).appendChild(t),t}_addCSSClasses(t,e){this.curClassName?t.setAttribute("class",`${e} ${this.curClassName}`):t.setAttribute("class",e)}_configureNode(t,e,s,i,r,n){return this._addCSSClasses(t,e),t.setAttribute("fill",s&&i?i:"none"),t.setAttribute("stroke",s?"none":i||"none"),t.setAttribute("stroke-width",`${r||1}`),this.curId&&t.setAttribute("id",`${this.curId}`),this.applyStrokeOpts(t,n),t}setSize(t){this.canvasSize=t,this.svgNode.setAttribute("viewBox",`0 0 ${this.canvasSize.width} ${this.canvasSize.height}`),this.svgNode.setAttribute("width",`${this.canvasSize.width}`),this.svgNode.setAttribute("height",`${this.canvasSize.height}`)}copyInstance(t){return new v(this.svgNode,this.offset,this.scale,this.canvasSize,t,this.drawConfig,!0,this.gNode,this.bufferGNode,this.nodeDefs,this.bufferedNodeDefs,this.nodeStyle)}setConfiguration(t){this.drawlibConfiguration=t}setCurrentId(t){this.curId=t