d3/d3.geom.min.js

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

2011-03-12 14:30:08 +03:00
(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,i){return{index:i,x:h[0],y:h[1]}}).sort(function(h,i){return h.y<i.y?-1:h.y>i.y?1:h.x<i.x?-1:h.x>i.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,i){return{edge:h,side:i,vertex:null,l:null,r:null}},insert:function(h,i){i.l=h;i.r=h.r;h.r.l=i;h.r=i},leftBound:function(h){var i=a.leftEnd;do i=i.r;while(i!=a.rightEnd&&f.rightOf(i,h));return i=i.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,i){var j={region:{l:h,r:i},ep:{l:null,r:null}},m=i.x-h.x,r=i.y-h.y;j.c=h.x*m+h.y*r+(m*m+r*r)*0.5;if((m>0?m:-m)>(r>0?r:-r)){j.a=1;j.b=r/m;j.c/=m}else{j.b=1;j.a=m/r;j.c/=r}return j},intersect:function(h,i){var j=h.edge,m=i.edge;if(!j||!m||j.region.r==m.region.r)return null;var r=j.a*m.b-j.b*
m.a;if(Math.abs(r)<1.0E-10)return null;var u=(j.c*m.b-m.c*j.b)/r;r=(m.c*j.a-j.c*m.a)/r;var w=j.region.r,y=m.region.r;if(w.y<y.y||w.y==y.y&&w.x<y.x)w=h;else{w=i;j=m}if((j=u>=j.region.r.x)&&w.side=="l"||!j&&w.side=="r")return null;return{x:u,y:r}},rightOf:function(h,i){var j=h.edge,m=j.region.r,r=i.x>m.x;if(r&&h.side=="l")return 1;if(!r&&h.side=="r")return 0;if(j.a==1){var u=i.y-m.y,w=i.x-m.x,y=0,x=0;if(!r&&j.b<0||r&&j.b>=0)x=y=u>=j.b*w;else{x=i.x+i.y*j.b>j.c;if(j.b<0)x=!x;x||(y=1)}if(!y){m=m.x-j.region.l.x;
x=j.b*(w*w-u*u)<m*u*(1+2*w/m+j.b*j.b);if(j.b<0)x=!x}}else{w=j.c-j.a*i.x;j=i.y-w;u=i.x-m.x;m=w-m.y;x=j*j>u*u+m*m}return h.side=="l"?x:!x},endPoint:function(h,i,j){h.ep[i]=j;h.ep[B[i]]&&g(h)},distance:function(h,i){var j=h.x-i.x,m=h.y-i.y;return Math.sqrt(j*j+m*m)}},b={list:[],insert:function(h,i,j){h.vertex=i;h.ystar=i.y+j;j=0;for(var m=b.list,r=m.length;j<r;j++){var u=m[j];if(!(h.ystar>u.ystar||h.ystar==u.ystar&&i.x>u.vertex.x))break}m.splice(j,0,h)},del:function(h){for(var i=0,j=b.list,m=j.length;i<
m&&j[i]!=h;++i);j.splice(i,1)},empty:function(){return b.list.length==0},nextEvent:function(h){for(var i=0,j=b.list,m=j.length;i<m;++i)if(j[i]==h)return j[i+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,v;;){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);v=f.bisect(t,e);n=
a.createHalfEdge(v,"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(v,"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"}v=f.bisect(t,n);n=a.createHalfEdge(v,
k);a.insert(p,n);f.endPoint(v,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}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,v){return q.angle-v.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,v,h){if(!(isNaN(n[0])||isNaN(n[1])))if(s.leaf){var i=s.point;if(i){if(!(Math.abs(i[0]-n[0])+Math.abs(i[1]-n[1])<0.01)){s.point=null;d(s,i,t,q,v,h)}d(s,n,t,q,v,h)}else s.point=n}else d(s,n,t,q,v,h)}function d(s,n,t,q,v,h){var i=(t+v)*
0.5,j=(q+h)*0.5,m=n[0]>=i,r=n[1]>=j,u=(r<<1)+m;s.leaf=false;s=s.nodes[u]||(s.nodes[u]={leaf:true,nodes:[],point:null});if(m)t=i;else v=i;if(r)q=j;else h=j;g(s,n,t,q,v,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}})();