dots-connector
Version:
Delaunay Triangulation library
2 lines (1 loc) • 3.73 kB
JavaScript
!function(r,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(r="undefined"!=typeof globalThis?globalThis:r||self).triangulate=t()}(this,(function(){"use strict";function r(r){return r.forEach((function(r){r[0]+=Math.random()/1e6,r[1]+=Math.random()/1e6})),r}function t(r){return r.sort((function(r,t){return r[0]-t[0]}))}function n(r){var t=new Float64Array(2*r.length);return r.forEach((function(r,n){t[2*n]=r[0],t[2*n+1]=r[1]})),t}function e(r){var t=Math.max(2*r.length/2-5,0),n=new Uint32Array(3*t),e=new Uint32Array(3*t);e.fill(t+1);var i,o=0;v(r,0,1,2)?(n[0]=1,n[1]=0,n[2]=2,i=l.fromTriangle(1,0,2,0)):(n[0]=0,n[1]=1,n[2]=2,i=l.fromTriangle(0,1,2,0)),o++;for(var f=3;f<r.length/2;f++)for(var u=i;u;){var s=u.prev,h=u.next;if(v(r,u.from,u.to,f)){n[3*o+0]=u.to,n[3*o+1]=u.from,n[3*o+2]=f;var p=n[3*u.triangle+0],g=n[3*u.triangle+1],c=p===u.to?1:g===u.to?2:0;e[3*u.triangle+c]=o,e[3*o+2]=u.triangle,s&&(s.next=h),h&&(h.prev=s);var m=new l(f,u.to,o,h),x=new l(u.from,f,o,m,s);o++,s&&s.from===f?(e[3*s.triangle+1]=o-1,e[3*(o-1)+0]=s.triangle,s.prev?s.prev.next=m:i=m,m.prev=s.prev,x=void 0):(s?s.next=x:i=x,m.prev=x);var d=h||i;d.from===m.to&&d.to===m.from?(e[3*(o-1)+1]=d.triangle,e[3*d.triangle+0]=o-1,d===i?((i=i.next).prev=void 0,m.prev.next=void 0):(d.next.prev=m.prev,m.prev.next=d.next),m=void 0):h&&(h.prev=m),u.next=void 0,u.prev=void 0,a(r,n,e,i,t,o-1)}u=h}return{triangles:n.subarray(0,3*o),points:r}}var i=new Uint32Array(512),o=new Uint32Array(3);function a(r,t,n,e,a,f){var v=0,l=1;for(i[0]=f;v<l;){var s=i[v];o[0]=n[3*s+0],o[1]=n[3*s+1],o[2]=n[3*s+2];for(var h=0;h<3;h++){var p=o[h],g=t[3*p+0],c=t[3*p+1],m=t[3*p+2];if(!(p>a)){var x=0===h?t[3*s+0]:1===h?t[3*s+1]:t[3*s+2],d=t[3*s+0]>t[3*s+1];if(d?u(r,g,c,m,x):u(r,c,m,g,x)){t[3*p+2]=x;var y=n[3*s+1],b=n[3*s+0],w=d?n[3*p+1]:n[3*p+2],M=d?n[3*p+2]:n[3*p+0];if(d){t[3*s+1]=g;for(var k=0;k<3;k++)if(n[3*w+k]===p){n[3*w+k]=s;break}for(k=0;k<3;k++)if(n[3*b+k]===s){n[3*b+k]=p;break}n[3*p+0]=b,n[3*p+1]=s,n[3*p+2]=M,n[3*s+0]=p,n[3*s+1]=y,n[3*s+2]=w}else{t[3*s+0]=c;for(k=0;k<3;k++)if(n[3*M+k]===p){n[3*M+k]=s;break}for(k=0;k<3;k++)if(n[3*y+k]===s){n[3*y+k]=p;break}n[3*p+0]=s,n[3*p+1]=y,n[3*p+2]=w,n[3*s+0]=b,n[3*s+1]=p,n[3*s+2]=M}for(var A=e,T=0;A&&(A.triangle===p?d&&A.from===m?(A.triangle=s,T++):d||A.from!==c||(A.triangle=s,T++):A.triangle===s&&(d&&A.from===c?(A.triangle=p,T++):d||A.from!==x||(A.triangle=p,T++)),2!==T);)A=A.next;i[l++]=s,i[l++]=p;break}}}v++}}function f(r,t,n,e,i,o){var a=(e-t)*(i-r),f=(n-r)*(o-t);return Math.abs(a-f)>=33306690738754716e-32*Math.abs(a+f)?a-f:0}function v(r,t,n,e){var i=r[2*t],o=r[2*t+1],a=r[2*n],v=r[2*n+1],u=r[2*e],l=r[2*e+1];return(f(i,o,a,v,u,l)||f(a,v,u,l,i,o)||f(u,l,i,o,a,v))<0}function u(r,t,n,e,i){var o=r[2*t],a=r[2*t+1],f=r[2*n],v=r[2*n+1],u=r[2*e],l=r[2*e+1],s=r[2*i],h=r[2*i+1],p=o-s,g=a-h,c=f-s,m=v-h,x=u-s,d=l-h,y=c*c+m*m,b=x*x+d*d;return p*(m*b-y*d)-g*(c*b-y*x)+(p*p+g*g)*(c*d-m*x)<0}var l=function(){function r(r,t,n,e,i){this.from=r,this.to=t,this.triangle=n,this.next=e,this.prev=i}return r.fromTriangle=function(t,n,e,i){var o=new r(t,n,i),a=new r(n,e,i),f=new r(e,t,i);return o.next=a,a.prev=o,a.next=f,f.prev=a,o},r.prototype.toString=function(){var r,t;if(this.next&&this.next.prev!==this)throw new Error("I'm ("+this.from+","+this.to+"). My next is ("+this.next.from+","+this.next.to+"), but my next's prev is ("+(null===(r=this.next.prev)||void 0===r?void 0:r.from)+","+(null===(t=this.next.prev)||void 0===t?void 0:t.to)+")");return"("+this.from+","+this.to+",trig "+this.triangle+")->"+(this.next||"🛑")},r}();return function(i){return(o=[r,t,n,e],function(r){return o.reduce((function(r,t){return t(r)}),r)})(i);var o}}));