1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-18 20:59:39 +02:00
Maybe/vendor/javascript/delaunator.js

5 lines
5.8 KiB
JavaScript
Raw Normal View History

// delaunator@5.0.1 downloaded from https://ga.jspm.io/npm:delaunator@5.0.1/index.js
import{orient2d as t}from"robust-predicates";const s=Math.pow(2,-52);const i=new Uint32Array(512);class Delaunator{static from(t,s=defaultGetX,i=defaultGetY){const n=t.length;const e=new Float64Array(n*2);for(let h=0;h<n;h++){const n=t[h];e[2*h]=s(n);e[2*h+1]=i(n)}return new Delaunator(e)}constructor(t){const s=t.length>>1;if(s>0&&typeof t[0]!=="number")throw new Error("Expected coords to contain numbers.");this.coords=t;const i=Math.max(2*s-5,0);this._triangles=new Uint32Array(i*3);this._halfedges=new Int32Array(i*3);this._hashSize=Math.ceil(Math.sqrt(s));this._hullPrev=new Uint32Array(s);this._hullNext=new Uint32Array(s);this._hullTri=new Uint32Array(s);this._hullHash=new Int32Array(this._hashSize);this._ids=new Uint32Array(s);this._dists=new Float64Array(s);this.update()}update(){const{coords:i,_hullPrev:n,_hullNext:e,_hullTri:h,_hullHash:l}=this;const r=i.length>>1;let o=Infinity;let c=Infinity;let a=-Infinity;let u=-Infinity;for(let t=0;t<r;t++){const s=i[2*t];const n=i[2*t+1];s<o&&(o=s);n<c&&(c=n);s>a&&(a=s);n>u&&(u=n);this._ids[t]=t}const _=(o+a)/2;const f=(c+u)/2;let d,y,g;for(let t=0,s=Infinity;t<r;t++){const n=dist(_,f,i[2*t],i[2*t+1]);if(n<s){d=t;s=n}}const w=i[2*d];const k=i[2*d+1];for(let t=0,s=Infinity;t<r;t++){if(t===d)continue;const n=dist(w,k,i[2*t],i[2*t+1]);if(n<s&&n>0){y=t;s=n}}let b=i[2*y];let p=i[2*y+1];let A=Infinity;for(let t=0;t<r;t++){if(t===d||t===y)continue;const s=circumradius(w,k,b,p,i[2*t],i[2*t+1]);if(s<A){g=t;A=s}}let I=i[2*g];let S=i[2*g+1];if(A===Infinity){for(let t=0;t<r;t++)this._dists[t]=i[2*t]-i[0]||i[2*t+1]-i[1];quicksort(this._ids,this._dists,0,r-1);const t=new Uint32Array(r);let s=0;for(let i=0,n=-Infinity;i<r;i++){const e=this._ids[i];const h=this._dists[e];if(h>n){t[s++]=e;n=h}}this.hull=t.subarray(0,s);this.triangles=new Uint32Array(0);this.halfedges=new Uint32Array(0);return}if(t(w,k,b,p,I,S)<0){const t=y;const s=b;const i=p;y=g;b=I;p=S;g=t;I=s;S=i}const m=circumcenter(w,k,b,p,I,S);this._cx=m.x;this._cy=m.y;for(let t=0;t<r;t++)this._dists[t]=dist(i[2*t],i[2*t+1],m.x,m.y);quicksort(this._ids,this._dists,0,r-1);this._hullStart=d;let x=3;e[d]=n[g]=y;e[y]=n[d]=g;e[g]=n[y]=d;h[d]=0;h[y]=1;h[g]=2;l.fill(-1);l[this._hashKey(w,k)]=d;l[this._hashKey(b,p)]=y;l[this._hashKey(I,S)]=g;this.trianglesLen=0;this._addTriangle(d,y,g,-1,-1,-1);for(let r,o,c=0;c<this._ids.length;c++){const a=this._ids[c];const u=i[2*a];const _=i[2*a+1];if(c>0&&Math.abs(u-r)<=s&&Math.abs(_-o)<=s)continue;r=u;o=_;if(a===d||a===y||a===g)continue;let f=0;for(let t=0,s=this._hashKey(u,_);t<this._hashSize;t++){f=l[(s+t)%this._hashSize];if(f!==-1&&f!==e[f])break}f=n[f];let w,k=f;while(w=e[k],t(u,_,i[2*k],i[2*k+1],i[2*w],i[2*w+1])>=0){k=w;if(k===f){k=-1;break}}if(k===-1)continue;let b=this._addTriangle(k,a,e[k],-1,-1,h[k]);h[a]=this._legalize(b+2);h[k]=b;x++;let p=e[k];while(w=e[p],t(u,_,i[2*p],i[2*p+1],i[2*w],i[2*w+1])<0){b=this._addTriangle(p,a,w,h[a],-1,h[p]);h[a]=this._legalize(b+2);e[p]=p;x--;p=w}if(k===f)while(w=n[k],t(u,_,i[2*w],i[2*w+1],i[2*k],i[2*k+1])<0){b=this._addTriangle(w,a,k,-1,h[k],h[w]);this._legalize(b+2);h[w]=b;e[k]=k;x--;k=w}this._hullStart=n[a]=k;e[k]=n[p]=a;e[a]=p;l[this._hashKey(u,_)]=a;l[this._hashKey(i[2*k],i[2*k+1])]=k}this.hull=new Uint32Array(x);for(let t=0,s=this._hullStart;t<x;t++){this.hull[t]=s;s=e[s]}this.triangles=this._triangles.subarray(0,this.trianglesLen);this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(t,s){return Math.floor(pseudoAngle(t-this._cx,s-this._cy)*this._hashSize)%this._hashSize}_legalize(t){const{_triangles:s,_halfedges:n,coords:e}=this;let h=0;let l=0;while(true){const r=n[t];const o=t-t%3;l=o+(t+2)%3;if(r===-1){if(h===0)break;t=i[--h];continue}const c=r-r%3;const a=o+(t+1)%3;const u=c+(r+2)%3;const _=s[l];const f=s[t];const d=s[a];const y=s[u];const g=inCircle(e[2*_],e[2*_+1],e[2*f],e[2*f+1],e[2*d],e[2*d+1],e[2*y],e[2*y+1]);if(g){s[t]=y;s[r]=_;const e=n[u];if(e===-1){let s=this._hullStart;do{if(this._hullTri[s]===u){this._hullTri[s]=t;break}s=this._hullPrev[s]}while(s!==this._hullStart)}this._link(t,e);this._link(r,n[l]);this._link(l,u);const o=c