d3/d3.geom.min.js

16 строки
7.5 KiB
JavaScript

(function(){function E(c,g,d,a){var f,b,e;c=a[c];f=c[0];b=c[1];c=a[g];g=c[0];e=c[1];c=a[d];return(c[1]-b)*(g-f)-(e-b)*(c[0]-f)>0}function A(c,g,d){return(d[0]-g[0])*(c[1]-g[1])<(d[1]-g[1])*(c[0]-g[0])}function C(c,g,d,a){var f=c[0],b=d[0];c=c[1];var e=d[1];d=g[0]-f;var l=a[0]-b;g=g[1]-c;a=a[1]-e;b=(l*(c-e)-a*(f-b))/(a*d-l*g);return[f+b*d,c+b*g]}function D(c,g){var d={list:c.map(function(h,j){return{index:j,x:h[0],y:h[1]}}).sort(function(h,j){return h.y<j.y?-1:h.y>j.y?1:h.x<j.x?-1:h.x>j.x?1:0}),bottomSite:null},
a={list:[],leftEnd:null,rightEnd:null,init:function(){a.leftEnd=a.createHalfEdge(null,"l");a.rightEnd=a.createHalfEdge(null,"l");a.leftEnd.r=a.rightEnd;a.rightEnd.l=a.leftEnd;a.list.unshift(a.leftEnd,a.rightEnd)},createHalfEdge:function(h,j){return{edge:h,side:j,vertex:null,l:null,r:null}},insert:function(h,j){j.l=h;j.r=h.r;h.r.l=j;h.r=j},leftBound:function(h){var j=a.leftEnd;do j=j.r;while(j!=a.rightEnd&&f.rightOf(j,h));return j=j.l},del:function(h){h.l.r=h.r;h.r.l=h.l;h.edge=null},right:function(h){return h.r},
left:function(h){return h.l},leftRegion:function(h){return h.edge==null?d.bottomSite:h.edge.region[h.side]},rightRegion:function(h){return h.edge==null?d.bottomSite:h.edge.region[B[h.side]]}},f={bisect:function(h,j){var i={region:{l:h,r:j},ep:{l:null,r:null}},m=j.x-h.x,r=j.y-h.y,u=m>0?m:-m,v=r>0?r:-r;i.c=h.x*m+h.y*r+(m*m+r*r)*0.5;if(u>v){i.a=1;i.b=r/m;i.c/=m}else{i.b=1;i.a=m/r;i.c/=r}return i},intersect:function(h,j){var i=h.edge,m=j.edge;if(!i||!m||i.region.r==m.region.r)return null;var r=i.a*m.b-
i.b*m.a;if(Math.abs(r)<1.0E-10)return null;var u=(i.c*m.b-m.c*i.b)/r;r=(m.c*i.a-i.c*m.a)/r;var v=i.region.r,y=m.region.r;if(v.y<y.y||v.y==y.y&&v.x<y.x){v=h;i=i}else{v=j;i=m}if((i=u>=i.region.r.x)&&v.side=="l"||!i&&v.side=="r")return null;return{x:u,y:r}},rightOf:function(h,j){var i=h.edge,m=i.region.r,r=j.x>m.x;if(r&&h.side=="l")return 1;if(!r&&h.side=="r")return 0;if(i.a==1){var u=j.y-m.y,v=j.x-m.x,y=0,x=0;if(!r&&i.b<0||r&&i.b>=0)x=y=u>=i.b*v;else{x=j.x+j.y*i.b>i.c;if(i.b<0)x=!x;x||(y=1)}if(!y){m=
m.x-i.region.l.x;x=i.b*(v*v-u*u)<m*u*(1+2*v/m+i.b*i.b);if(i.b<0)x=!x}}else{v=i.c-i.a*j.x;i=j.y-v;u=j.x-m.x;m=v-m.y;x=i*i>u*u+m*m}return h.side=="l"?x:!x},endPoint:function(h,j,i){h.ep[j]=i;h.ep[B[j]]&&g(h)},distance:function(h,j){var i=h.x-j.x,m=h.y-j.y;return Math.sqrt(i*i+m*m)}},b={list:[],insert:function(h,j,i){h.vertex=j;h.ystar=j.y+i;i=0;for(var m=b.list,r=m.length;i<r;i++){var u=m[i];if(!(h.ystar>u.ystar||h.ystar==u.ystar&&j.x>u.vertex.x))break}m.splice(i,0,h)},del:function(h){for(var j=0,i=
b.list,m=i.length;j<m&&i[j]!=h;++j);i.splice(j,1)},empty:function(){return b.list.length==0},nextEvent:function(h){for(var j=0,i=b.list,m=i.length;j<m;++j)if(i[j]==h)return i[j+1];return null},min:function(){var h=b.list[0];return{x:h.vertex.x,y:h.ystar}},extractMin:function(){return b.list.shift()}};a.init();d.bottomSite=d.list.shift();for(var e=d.list.shift(),l,k,o,p,s,n,t,q,w;;){b.empty()||(l=b.min());if(e&&(b.empty()||e.y<l.y||e.y==l.y&&e.x<l.x)){k=a.leftBound(e);o=a.right(k);t=a.rightRegion(k);
w=f.bisect(t,e);n=a.createHalfEdge(w,"l");a.insert(k,n);if(q=f.intersect(k,n)){b.del(k);b.insert(k,q,f.distance(q,e))}k=n;n=a.createHalfEdge(w,"r");a.insert(k,n);(q=f.intersect(n,o))&&b.insert(n,q,f.distance(q,e));e=d.list.shift()}else if(b.empty())break;else{k=b.extractMin();p=a.left(k);o=a.right(k);s=a.right(o);t=a.leftRegion(k);n=a.rightRegion(o);q=k.vertex;f.endPoint(k.edge,k.side,q);f.endPoint(o.edge,o.side,q);a.del(k);b.del(o);a.del(o);k="l";if(t.y>n.y){k=t;t=n;n=k;k="r"}w=f.bisect(t,n);n=a.createHalfEdge(w,
k);a.insert(p,n);f.endPoint(w,B[k],q);if(q=f.intersect(p,n)){b.del(p);b.insert(p,q,f.distance(q,t))}(q=f.intersect(n,s))&&b.insert(n,q,f.distance(q,t))}}for(k=a.right(a.leftEnd);k!=a.rightEnd;k=a.right(k))g(k.edge)}function z(c,g,d,a,f,b){if(!c(g,d,a,f,b)){var e=(d+f)*0.5,l=(a+b)*0.5;g=g.nodes;g[0]&&z(c,g[0],d,a,e,l);g[1]&&z(c,g[1],e,a,f,l);g[2]&&z(c,g[2],d,l,e,b);g[3]&&z(c,g[3],e,l,f,b)}}d3.geom={};d3.geom.contour=function(c,g){var d;if(!(d=g))a:{for(var a=d=0;;){if(c(d,a)){d=[d,a];break a}if(d==
0){d=a+1;a=0}else{d-=1;a+=1}}d=void 0}d=d;a=[];var f=d[0],b=d[1],e=0,l=0,k=NaN,o=NaN;l=0;do{l=0;if(c(f-1,b-1))l+=1;if(c(f,b-1))l+=2;if(c(f-1,b))l+=4;if(c(f,b))l+=8;if(l==6){e=o==-1?-1:1;l=0}else if(l==9){e=0;l=k==1?-1:1}else{e=F[l];l=G[l]}if(e!=k&&l!=o){a.push([f,b]);k=e;o=l}f+=e;b+=l}while(d[0]!=f||d[1]!=b);return a};var F=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],G=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(c){if(c.length<3)return[];var g=c.length,d=g-1,a=[],f=[],b,e=0,l,k,o,p,
s,n,t;for(b=1;b<g;++b)if(c[b][1]<c[e][1])e=b;else if(c[b][1]==c[e][1])e=c[b][0]<c[e][0]?b:e;for(b=0;b<g;++b)if(b!=e){k=c[b][1]-c[e][1];l=c[b][0]-c[e][0];a.push({angle:Math.atan2(k,l),index:b})}a.sort(function(q,w){return q.angle-w.angle});t=a[0].angle;n=a[0].index;s=0;for(b=1;b<d;++b){g=a[b].index;if(t==a[b].angle){l=c[n][0]-c[e][0];k=c[n][1]-c[e][1];o=c[g][0]-c[e][0];p=c[g][1]-c[e][1];if(l*l+k*k>=o*o+p*p)a[b].index=-1;else{a[s].index=-1;t=a[b].angle;s=b;n=g}}else{t=a[b].angle;s=b;n=g}}f.push(e);
for(g=b=0;b<2;++g)if(a[g].index!=-1){f.push(a[g].index);b++}for(e=f.length;g<d;++g)if(a[g].index!=-1){for(;!E(f[e-2],f[e-1],a[g].index,c);)--e;f[e++]=a[g].index}d=[];for(b=0;b<e;++b)d.push(c[f[b]]);return d};d3.geom.polygon=function(c){c.area=function(){for(var g=0,d=c.length,a=c[d-1][0]*c[0][1],f=c[d-1][1]*c[0][0];++g<d;){a+=c[g-1][0]*c[g][1];f+=c[g-1][1]*c[g][0]}return(f-a)*0.5};c.centroid=function(g){var d=-1,a=c.length-1,f=0,b=0,e,l,k;for(arguments.length||(g=1/(6*c.area()));++d<a;){e=c[d];l=
c[d+1];k=e[0]*l[1]-l[0]*e[1];f+=(e[0]+l[0])*k;b+=(e[1]+l[1])*k}return[f*g,b*g]};c.clip=function(g){for(var d,a=-1,f=c.length,b,e,l=c[f-1],k,o,p;++a<f;){d=g.slice();g.length=0;k=c[a];o=d[(e=d.length)-1];for(b=-1;++b<e;){p=d[b];if(A(p,l,k)){A(o,l,k)||g.push(C(o,p,l,k));g.push(p)}else A(o,l,k)&&g.push(C(o,p,l,k));o=p}l=k}return g};return c};d3.geom.voronoi=function(c){var g=c.map(function(){return[]});D(c,function(d){var a,f,b,e;if(d.a==1&&d.b>=0){a=d.ep.r;f=d.ep.l}else{a=d.ep.l;f=d.ep.r}if(d.a==1){b=
a?a.y:-1E6;a=d.c-d.b*b;e=f?f.y:1E6;f=d.c-d.b*e}else{a=a?a.x:-1E6;b=d.c-d.a*a;f=f?f.x:1E6;e=d.c-d.a*f}a=[a,b];f=[f,e];g[d.region.l.index].push(a,f);g[d.region.r.index].push(a,f)});return g.map(function(d,a){var f=c[a][0],b=c[a][1];d.forEach(function(e){e.angle=Math.atan2(e[0]-f,e[1]-b)});return d.sort(function(e,l){return e.angle-l.angle}).filter(function(e,l){return!l||e.angle-d[l-1].angle>1.0E-10})})};var B={l:"r",r:"l"};d3.geom.delaunay=function(c){var g=c.map(function(){return[]}),d=[];D(c,function(a){g[a.region.l.index].push(c[a.region.r.index])});
g.forEach(function(a,f){var b=c[f],e=b[0],l=b[1];a.forEach(function(p){p.angle=Math.atan2(p[0]-e,p[1]-l)});a.sort(function(p,s){return p.angle-s.angle});for(var k=0,o=a.length-1;k<o;k++)d.push([b,a[k],a[k+1]])});return d};d3.geom.quadtree=function(c){function g(s,n,t,q,w,h){if(!(isNaN(n[0])||isNaN(n[1])))if(s.leaf){var j=s.point;if(j){if(!(Math.abs(j[0]-n[0])+Math.abs(j[1]-n[1])<0.01)){s.point=null;d(s,j,t,q,w,h)}d(s,n,t,q,w,h)}else s.point=n}else d(s,n,t,q,w,h)}function d(s,n,t,q,w,h){var j=(t+w)*
0.5,i=(q+h)*0.5,m=n[0]>=j,r=n[1]>=i,u=(r<<1)+m;s.leaf=false;s=s.nodes[u]||(s.nodes[u]={leaf:true,nodes:[],point:null});if(m)t=j;else w=j;if(r)q=i;else h=i;g(s,n,t,q,w,h)}for(var a,f=-1,b=c.length,e=Number.POSITIVE_INFINITY,l=e,k=Number.NEGATIVE_INFINITY,o=k;++f<b;){a=c[f];if(a[0]<e)e=a[0];if(a[1]<l)l=a[1];if(a[0]>k)k=a[0];if(a[1]>o)o=a[1]}a=k-e;f=o-l;if(a>f)o=l+a;else k=e+f;var p={leaf:true,nodes:[],point:null};for(f=-1;++f<b;)g(p,c[f],e,l,k,o);p.visit=function(s){z(s,p,e,l,k,o)};return p}})();