d3/d3.geom.min.js

16 строки
7.3 KiB
JavaScript
Исходник Обычный вид История

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