d3_rails 3.3.6 → 3.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/d3.js +797 -547
- data/app/assets/javascripts/d3.min.js +5 -5
- data/lib/d3_rails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b0540892ac2d7ea0c74ae84ecca47c934814df3
|
4
|
+
data.tar.gz: 99dc329cb1bfa9979192624a09877ce2e06ab6f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc4c810ee9502ac6794573b81608dfddf7a3163ad8ce7082f755d9670e4217325edf3ee365a8d0e0dec10cdb6ba6ee209322273a7e0879c6f7fe44bbb1e95f04
|
7
|
+
data.tar.gz: fcd92511147ec1c0ef577a857961286fcc4d38318e776ed52ff1dfbcf21a77b679d5e85256974073ed576d43b79c3bbf2215fddc14262b107501a2dd09bdc034
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
d3 = function() {
|
2
2
|
var d3 = {
|
3
|
-
version: "3.3.
|
3
|
+
version: "3.3.7"
|
4
4
|
};
|
5
5
|
if (!Date.now) Date.now = function() {
|
6
6
|
return +new Date();
|
@@ -186,8 +186,19 @@ d3 = function() {
|
|
186
186
|
return entries;
|
187
187
|
};
|
188
188
|
d3.merge = function(arrays) {
|
189
|
-
|
189
|
+
var n = arrays.length, m, i = -1, j = 0, merged, array;
|
190
|
+
while (++i < n) j += arrays[i].length;
|
191
|
+
merged = new Array(j);
|
192
|
+
while (--n >= 0) {
|
193
|
+
array = arrays[n];
|
194
|
+
m = array.length;
|
195
|
+
while (--m >= 0) {
|
196
|
+
merged[--j] = array[m];
|
197
|
+
}
|
198
|
+
}
|
199
|
+
return merged;
|
190
200
|
};
|
201
|
+
var abs = Math.abs;
|
191
202
|
d3.range = function(start, stop, step) {
|
192
203
|
if (arguments.length < 3) {
|
193
204
|
step = 1;
|
@@ -197,7 +208,7 @@ d3 = function() {
|
|
197
208
|
}
|
198
209
|
}
|
199
210
|
if ((stop - start) / step === Infinity) throw new Error("infinite range");
|
200
|
-
var range = [], k = d3_range_integerScale(
|
211
|
+
var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
|
201
212
|
start *= k, stop *= k, step *= k;
|
202
213
|
if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
|
203
214
|
return range;
|
@@ -714,16 +725,16 @@ d3 = function() {
|
|
714
725
|
};
|
715
726
|
function d3_selection_creator(name) {
|
716
727
|
return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() {
|
717
|
-
return
|
728
|
+
return this.ownerDocument.createElementNS(name.space, name.local);
|
718
729
|
} : function() {
|
719
|
-
return
|
730
|
+
return this.ownerDocument.createElementNS(this.namespaceURI, name);
|
720
731
|
};
|
721
732
|
}
|
722
733
|
d3_selectionPrototype.insert = function(name, before) {
|
723
734
|
name = d3_selection_creator(name);
|
724
735
|
before = d3_selection_selector(before);
|
725
736
|
return this.select(function() {
|
726
|
-
return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments));
|
737
|
+
return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
|
727
738
|
});
|
728
739
|
};
|
729
740
|
d3_selectionPrototype.remove = function() {
|
@@ -2031,11 +2042,12 @@ d3 = function() {
|
|
2031
2042
|
if (n < 2) delay = 0;
|
2032
2043
|
if (n < 3) then = Date.now();
|
2033
2044
|
var time = then + delay, timer = {
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
2045
|
+
c: callback,
|
2046
|
+
t: time,
|
2047
|
+
f: false,
|
2048
|
+
n: null
|
2037
2049
|
};
|
2038
|
-
if (d3_timer_queueTail) d3_timer_queueTail.
|
2050
|
+
if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
|
2039
2051
|
d3_timer_queueTail = timer;
|
2040
2052
|
if (!d3_timer_interval) {
|
2041
2053
|
d3_timer_timeout = clearTimeout(d3_timer_timeout);
|
@@ -2060,30 +2072,23 @@ d3 = function() {
|
|
2060
2072
|
d3_timer_mark();
|
2061
2073
|
d3_timer_sweep();
|
2062
2074
|
};
|
2063
|
-
function d3_timer_replace(callback, delay, then) {
|
2064
|
-
var n = arguments.length;
|
2065
|
-
if (n < 2) delay = 0;
|
2066
|
-
if (n < 3) then = Date.now();
|
2067
|
-
d3_timer_active.callback = callback;
|
2068
|
-
d3_timer_active.time = then + delay;
|
2069
|
-
}
|
2070
2075
|
function d3_timer_mark() {
|
2071
2076
|
var now = Date.now();
|
2072
2077
|
d3_timer_active = d3_timer_queueHead;
|
2073
2078
|
while (d3_timer_active) {
|
2074
|
-
if (now >= d3_timer_active.
|
2075
|
-
d3_timer_active = d3_timer_active.
|
2079
|
+
if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
|
2080
|
+
d3_timer_active = d3_timer_active.n;
|
2076
2081
|
}
|
2077
2082
|
return now;
|
2078
2083
|
}
|
2079
2084
|
function d3_timer_sweep() {
|
2080
2085
|
var t0, t1 = d3_timer_queueHead, time = Infinity;
|
2081
2086
|
while (t1) {
|
2082
|
-
if (t1.
|
2083
|
-
t1 = t0 ? t0.
|
2087
|
+
if (t1.f) {
|
2088
|
+
t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
|
2084
2089
|
} else {
|
2085
|
-
if (t1.
|
2086
|
-
t1 = (t0 = t1).
|
2090
|
+
if (t1.t < time) time = t1.t;
|
2091
|
+
t1 = (t0 = t1).n;
|
2087
2092
|
}
|
2088
2093
|
}
|
2089
2094
|
d3_timer_queueTail = t0;
|
@@ -2102,7 +2107,7 @@ d3 = function() {
|
|
2102
2107
|
return d3_formatPrefixes[8 + i / 3];
|
2103
2108
|
};
|
2104
2109
|
function d3_formatPrefix(d, i) {
|
2105
|
-
var k = Math.pow(10,
|
2110
|
+
var k = Math.pow(10, abs(8 - i) * 3);
|
2106
2111
|
return {
|
2107
2112
|
scale: i > 8 ? function(d) {
|
2108
2113
|
return d / k;
|
@@ -2388,7 +2393,7 @@ d3 = function() {
|
|
2388
2393
|
return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
|
2389
2394
|
}
|
2390
2395
|
function d3_geo_sphericalEqual(a, b) {
|
2391
|
-
return
|
2396
|
+
return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
|
2392
2397
|
}
|
2393
2398
|
d3.geo.bounds = function() {
|
2394
2399
|
var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
|
@@ -2423,7 +2428,7 @@ d3 = function() {
|
|
2423
2428
|
var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
|
2424
2429
|
d3_geo_cartesianNormalize(inflection);
|
2425
2430
|
inflection = d3_geo_spherical(inflection);
|
2426
|
-
var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian =
|
2431
|
+
var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
|
2427
2432
|
if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
|
2428
2433
|
var φi = inflection[1] * d3_degrees;
|
2429
2434
|
if (φi > φ1) φ1 = φi;
|
@@ -2468,7 +2473,7 @@ d3 = function() {
|
|
2468
2473
|
function ringPoint(λ, φ) {
|
2469
2474
|
if (p0) {
|
2470
2475
|
var dλ = λ - λ_;
|
2471
|
-
dλSum +=
|
2476
|
+
dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
|
2472
2477
|
} else λ__ = λ, φ__ = φ;
|
2473
2478
|
d3_geo_area.point(λ, φ);
|
2474
2479
|
linePoint(λ, φ);
|
@@ -2479,7 +2484,7 @@ d3 = function() {
|
|
2479
2484
|
function ringEnd() {
|
2480
2485
|
ringPoint(λ__, φ__);
|
2481
2486
|
d3_geo_area.lineEnd();
|
2482
|
-
if (
|
2487
|
+
if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
|
2483
2488
|
range[0] = λ0, range[1] = λ1;
|
2484
2489
|
p0 = null;
|
2485
2490
|
}
|
@@ -2622,41 +2627,13 @@ d3 = function() {
|
|
2622
2627
|
listener.lineEnd();
|
2623
2628
|
return;
|
2624
2629
|
}
|
2625
|
-
var a =
|
2626
|
-
|
2627
|
-
points: segment,
|
2628
|
-
other: null,
|
2629
|
-
visited: false,
|
2630
|
-
entry: true,
|
2631
|
-
subject: true
|
2632
|
-
}, b = {
|
2633
|
-
point: p0,
|
2634
|
-
points: [ p0 ],
|
2635
|
-
other: a,
|
2636
|
-
visited: false,
|
2637
|
-
entry: false,
|
2638
|
-
subject: false
|
2639
|
-
};
|
2640
|
-
a.other = b;
|
2630
|
+
var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
|
2631
|
+
a.o = b;
|
2641
2632
|
subject.push(a);
|
2642
2633
|
clip.push(b);
|
2643
|
-
a =
|
2644
|
-
|
2645
|
-
|
2646
|
-
other: null,
|
2647
|
-
visited: false,
|
2648
|
-
entry: false,
|
2649
|
-
subject: true
|
2650
|
-
};
|
2651
|
-
b = {
|
2652
|
-
point: p1,
|
2653
|
-
points: [ p1 ],
|
2654
|
-
other: a,
|
2655
|
-
visited: false,
|
2656
|
-
entry: true,
|
2657
|
-
subject: false
|
2658
|
-
};
|
2659
|
-
a.other = b;
|
2634
|
+
a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
|
2635
|
+
b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
|
2636
|
+
a.o = b;
|
2660
2637
|
subject.push(a);
|
2661
2638
|
clip.push(b);
|
2662
2639
|
});
|
@@ -2665,35 +2642,36 @@ d3 = function() {
|
|
2665
2642
|
d3_geo_clipPolygonLinkCircular(clip);
|
2666
2643
|
if (!subject.length) return;
|
2667
2644
|
for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
|
2668
|
-
clip[i].
|
2645
|
+
clip[i].e = entry = !entry;
|
2669
2646
|
}
|
2670
|
-
var start = subject[0],
|
2647
|
+
var start = subject[0], points, point;
|
2671
2648
|
while (1) {
|
2672
|
-
current = start;
|
2673
|
-
while (current.
|
2674
|
-
points = current.
|
2649
|
+
var current = start, isSubject = true;
|
2650
|
+
while (current.v) if ((current = current.n) === start) return;
|
2651
|
+
points = current.z;
|
2675
2652
|
listener.lineStart();
|
2676
2653
|
do {
|
2677
|
-
current.
|
2678
|
-
if (current.
|
2679
|
-
if (
|
2680
|
-
for (var i = 0
|
2654
|
+
current.v = current.o.v = true;
|
2655
|
+
if (current.e) {
|
2656
|
+
if (isSubject) {
|
2657
|
+
for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
|
2681
2658
|
} else {
|
2682
|
-
interpolate(current.
|
2659
|
+
interpolate(current.x, current.n.x, 1, listener);
|
2683
2660
|
}
|
2684
|
-
current = current.
|
2661
|
+
current = current.n;
|
2685
2662
|
} else {
|
2686
|
-
if (
|
2687
|
-
points = current.
|
2688
|
-
for (var i = points.length;
|
2663
|
+
if (isSubject) {
|
2664
|
+
points = current.p.z;
|
2665
|
+
for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
|
2689
2666
|
} else {
|
2690
|
-
interpolate(current.
|
2667
|
+
interpolate(current.x, current.p.x, -1, listener);
|
2691
2668
|
}
|
2692
|
-
current = current.
|
2669
|
+
current = current.p;
|
2693
2670
|
}
|
2694
|
-
current = current.
|
2695
|
-
points = current.
|
2696
|
-
|
2671
|
+
current = current.o;
|
2672
|
+
points = current.z;
|
2673
|
+
isSubject = !isSubject;
|
2674
|
+
} while (!current.v);
|
2697
2675
|
listener.lineEnd();
|
2698
2676
|
}
|
2699
2677
|
}
|
@@ -2701,12 +2679,20 @@ d3 = function() {
|
|
2701
2679
|
if (!(n = array.length)) return;
|
2702
2680
|
var n, i = 0, a = array[0], b;
|
2703
2681
|
while (++i < n) {
|
2704
|
-
a.
|
2705
|
-
b.
|
2682
|
+
a.n = b = array[i];
|
2683
|
+
b.p = a;
|
2706
2684
|
a = b;
|
2707
2685
|
}
|
2708
|
-
a.
|
2709
|
-
b.
|
2686
|
+
a.n = b = array[0];
|
2687
|
+
b.p = a;
|
2688
|
+
}
|
2689
|
+
function d3_geo_clipPolygonIntersection(point, points, other, entry) {
|
2690
|
+
this.x = point;
|
2691
|
+
this.z = points;
|
2692
|
+
this.o = other;
|
2693
|
+
this.e = entry;
|
2694
|
+
this.v = false;
|
2695
|
+
this.n = this.p = null;
|
2710
2696
|
}
|
2711
2697
|
function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
|
2712
2698
|
return function(rotate, listener) {
|
@@ -2821,7 +2807,7 @@ d3 = function() {
|
|
2821
2807
|
};
|
2822
2808
|
}
|
2823
2809
|
function d3_geo_clipSort(a, b) {
|
2824
|
-
return ((a = a.
|
2810
|
+
return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
|
2825
2811
|
}
|
2826
2812
|
function d3_geo_pointInPolygon(point, polygon) {
|
2827
2813
|
var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
|
@@ -2833,9 +2819,9 @@ d3 = function() {
|
|
2833
2819
|
while (true) {
|
2834
2820
|
if (j === m) j = 0;
|
2835
2821
|
point = ring[j];
|
2836
|
-
var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, antimeridian =
|
2822
|
+
var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, antimeridian = abs(dλ) > π, k = sinφ0 * sinφ;
|
2837
2823
|
d3_geo_areaRingSum.add(Math.atan2(k * Math.sin(dλ), cosφ0 * cosφ + k * Math.cos(dλ)));
|
2838
|
-
polarAngle += antimeridian ? dλ + (dλ >= 0 ?
|
2824
|
+
polarAngle += antimeridian ? dλ + (dλ >= 0 ? τ : -τ) : dλ;
|
2839
2825
|
if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
|
2840
2826
|
var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
|
2841
2827
|
d3_geo_cartesianNormalize(arc);
|
@@ -2861,8 +2847,8 @@ d3 = function() {
|
|
2861
2847
|
clean = 1;
|
2862
2848
|
},
|
2863
2849
|
point: function(λ1, φ1) {
|
2864
|
-
var sλ1 = λ1 > 0 ? π : -π, dλ =
|
2865
|
-
if (
|
2850
|
+
var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
|
2851
|
+
if (abs(dλ - π) < ε) {
|
2866
2852
|
listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
|
2867
2853
|
listener.point(sλ0, φ0);
|
2868
2854
|
listener.lineEnd();
|
@@ -2871,8 +2857,8 @@ d3 = function() {
|
|
2871
2857
|
listener.point(λ1, φ0);
|
2872
2858
|
clean = 0;
|
2873
2859
|
} else if (sλ0 !== sλ1 && dλ >= π) {
|
2874
|
-
if (
|
2875
|
-
if (
|
2860
|
+
if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
|
2861
|
+
if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
|
2876
2862
|
φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
|
2877
2863
|
listener.point(sλ0, φ0);
|
2878
2864
|
listener.lineEnd();
|
@@ -2894,7 +2880,7 @@ d3 = function() {
|
|
2894
2880
|
}
|
2895
2881
|
function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
|
2896
2882
|
var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
|
2897
|
-
return
|
2883
|
+
return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
|
2898
2884
|
}
|
2899
2885
|
function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
|
2900
2886
|
var φ;
|
@@ -2909,8 +2895,8 @@ d3 = function() {
|
|
2909
2895
|
listener.point(-π, -φ);
|
2910
2896
|
listener.point(-π, 0);
|
2911
2897
|
listener.point(-π, φ);
|
2912
|
-
} else if (
|
2913
|
-
var s =
|
2898
|
+
} else if (abs(from[0] - to[0]) > ε) {
|
2899
|
+
var s = from[0] < to[0] ? π : -π;
|
2914
2900
|
φ = direction * s / 2;
|
2915
2901
|
listener.point(-s, φ);
|
2916
2902
|
listener.point(0, φ);
|
@@ -2920,7 +2906,7 @@ d3 = function() {
|
|
2920
2906
|
}
|
2921
2907
|
}
|
2922
2908
|
function d3_geo_clipCircle(radius) {
|
2923
|
-
var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere =
|
2909
|
+
var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
|
2924
2910
|
return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
|
2925
2911
|
function visible(λ, φ) {
|
2926
2912
|
return Math.cos(λ) * Math.cos(φ) > cr;
|
@@ -3000,9 +2986,9 @@ d3 = function() {
|
|
3000
2986
|
if (!two) return q;
|
3001
2987
|
var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
|
3002
2988
|
if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
|
3003
|
-
var δλ = λ1 - λ0, polar =
|
2989
|
+
var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
|
3004
2990
|
if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
|
3005
|
-
if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (
|
2991
|
+
if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
|
3006
2992
|
var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
|
3007
2993
|
d3_geo_cartesianAdd(q1, A);
|
3008
2994
|
return [ q, d3_geo_spherical(q1) ];
|
@@ -3015,6 +3001,60 @@ d3 = function() {
|
|
3015
3001
|
return code;
|
3016
3002
|
}
|
3017
3003
|
}
|
3004
|
+
function d3_geom_clipLine(x0, y0, x1, y1) {
|
3005
|
+
return function(line) {
|
3006
|
+
var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
|
3007
|
+
r = x0 - ax;
|
3008
|
+
if (!dx && r > 0) return;
|
3009
|
+
r /= dx;
|
3010
|
+
if (dx < 0) {
|
3011
|
+
if (r < t0) return;
|
3012
|
+
if (r < t1) t1 = r;
|
3013
|
+
} else if (dx > 0) {
|
3014
|
+
if (r > t1) return;
|
3015
|
+
if (r > t0) t0 = r;
|
3016
|
+
}
|
3017
|
+
r = x1 - ax;
|
3018
|
+
if (!dx && r < 0) return;
|
3019
|
+
r /= dx;
|
3020
|
+
if (dx < 0) {
|
3021
|
+
if (r > t1) return;
|
3022
|
+
if (r > t0) t0 = r;
|
3023
|
+
} else if (dx > 0) {
|
3024
|
+
if (r < t0) return;
|
3025
|
+
if (r < t1) t1 = r;
|
3026
|
+
}
|
3027
|
+
r = y0 - ay;
|
3028
|
+
if (!dy && r > 0) return;
|
3029
|
+
r /= dy;
|
3030
|
+
if (dy < 0) {
|
3031
|
+
if (r < t0) return;
|
3032
|
+
if (r < t1) t1 = r;
|
3033
|
+
} else if (dy > 0) {
|
3034
|
+
if (r > t1) return;
|
3035
|
+
if (r > t0) t0 = r;
|
3036
|
+
}
|
3037
|
+
r = y1 - ay;
|
3038
|
+
if (!dy && r < 0) return;
|
3039
|
+
r /= dy;
|
3040
|
+
if (dy < 0) {
|
3041
|
+
if (r > t1) return;
|
3042
|
+
if (r > t0) t0 = r;
|
3043
|
+
} else if (dy > 0) {
|
3044
|
+
if (r < t0) return;
|
3045
|
+
if (r < t1) t1 = r;
|
3046
|
+
}
|
3047
|
+
if (t0 > 0) line.a = {
|
3048
|
+
x: ax + t0 * dx,
|
3049
|
+
y: ay + t0 * dy
|
3050
|
+
};
|
3051
|
+
if (t1 < 1) line.b = {
|
3052
|
+
x: ax + t1 * dx,
|
3053
|
+
y: ay + t1 * dy
|
3054
|
+
};
|
3055
|
+
return line;
|
3056
|
+
};
|
3057
|
+
}
|
3018
3058
|
var d3_geo_clipExtentMAX = 1e9;
|
3019
3059
|
d3.geo.clipExtent = function() {
|
3020
3060
|
var x0, y0, x1, y1, stream, clip, clipExtent = {
|
@@ -3035,7 +3075,7 @@ d3 = function() {
|
|
3035
3075
|
};
|
3036
3076
|
function d3_geo_clipExtent(x0, y0, x1, y1) {
|
3037
3077
|
return function(listener) {
|
3038
|
-
var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), segments, polygon, ring;
|
3078
|
+
var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
|
3039
3079
|
var clip = {
|
3040
3080
|
point: point,
|
3041
3081
|
lineStart: lineStart,
|
@@ -3130,13 +3170,22 @@ d3 = function() {
|
|
3130
3170
|
}
|
3131
3171
|
} else {
|
3132
3172
|
if (v && v_) listener.point(x, y); else {
|
3133
|
-
var
|
3134
|
-
|
3173
|
+
var l = {
|
3174
|
+
a: {
|
3175
|
+
x: x_,
|
3176
|
+
y: y_
|
3177
|
+
},
|
3178
|
+
b: {
|
3179
|
+
x: x,
|
3180
|
+
y: y
|
3181
|
+
}
|
3182
|
+
};
|
3183
|
+
if (clipLine(l)) {
|
3135
3184
|
if (!v_) {
|
3136
3185
|
listener.lineStart();
|
3137
|
-
listener.point(a
|
3186
|
+
listener.point(l.a.x, l.a.y);
|
3138
3187
|
}
|
3139
|
-
listener.point(b
|
3188
|
+
listener.point(l.b.x, l.b.y);
|
3140
3189
|
if (!v) listener.lineEnd();
|
3141
3190
|
clean = false;
|
3142
3191
|
} else if (v) {
|
@@ -3151,43 +3200,15 @@ d3 = function() {
|
|
3151
3200
|
return clip;
|
3152
3201
|
};
|
3153
3202
|
function corner(p, direction) {
|
3154
|
-
return
|
3203
|
+
return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
|
3155
3204
|
}
|
3156
3205
|
function compare(a, b) {
|
3157
|
-
return comparePoints(a.
|
3206
|
+
return comparePoints(a.x, b.x);
|
3158
3207
|
}
|
3159
3208
|
function comparePoints(a, b) {
|
3160
3209
|
var ca = corner(a, 1), cb = corner(b, 1);
|
3161
3210
|
return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
|
3162
3211
|
}
|
3163
|
-
function clipLine(a, b) {
|
3164
|
-
var dx = b[0] - a[0], dy = b[1] - a[1], t = [ 0, 1 ];
|
3165
|
-
if (Math.abs(dx) < ε && Math.abs(dy) < ε) return x0 <= a[0] && a[0] <= x1 && y0 <= a[1] && a[1] <= y1;
|
3166
|
-
if (d3_geo_clipExtentT(x0 - a[0], dx, t) && d3_geo_clipExtentT(a[0] - x1, -dx, t) && d3_geo_clipExtentT(y0 - a[1], dy, t) && d3_geo_clipExtentT(a[1] - y1, -dy, t)) {
|
3167
|
-
if (t[1] < 1) {
|
3168
|
-
b[0] = a[0] + t[1] * dx;
|
3169
|
-
b[1] = a[1] + t[1] * dy;
|
3170
|
-
}
|
3171
|
-
if (t[0] > 0) {
|
3172
|
-
a[0] += t[0] * dx;
|
3173
|
-
a[1] += t[0] * dy;
|
3174
|
-
}
|
3175
|
-
return true;
|
3176
|
-
}
|
3177
|
-
return false;
|
3178
|
-
}
|
3179
|
-
}
|
3180
|
-
function d3_geo_clipExtentT(num, denominator, t) {
|
3181
|
-
if (Math.abs(denominator) < ε) return num <= 0;
|
3182
|
-
var u = num / denominator;
|
3183
|
-
if (denominator > 0) {
|
3184
|
-
if (u > t[1]) return false;
|
3185
|
-
if (u > t[0]) t[0] = u;
|
3186
|
-
} else {
|
3187
|
-
if (u < t[0]) return false;
|
3188
|
-
if (u < t[1]) t[1] = u;
|
3189
|
-
}
|
3190
|
-
return true;
|
3191
3212
|
}
|
3192
3213
|
function d3_geo_compose(a, b) {
|
3193
3214
|
function compose(x, y) {
|
@@ -3312,7 +3333,7 @@ d3 = function() {
|
|
3312
3333
|
},
|
3313
3334
|
polygonEnd: function() {
|
3314
3335
|
d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
|
3315
|
-
d3_geo_pathAreaSum +=
|
3336
|
+
d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
|
3316
3337
|
}
|
3317
3338
|
};
|
3318
3339
|
function d3_geo_pathAreaRingStart() {
|
@@ -3541,8 +3562,8 @@ d3 = function() {
|
|
3541
3562
|
function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
|
3542
3563
|
var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
|
3543
3564
|
if (d2 > 4 * δ2 && depth--) {
|
3544
|
-
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 =
|
3545
|
-
if (dz * dz / d2 > δ2 ||
|
3565
|
+
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
|
3566
|
+
if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
|
3546
3567
|
resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
|
3547
3568
|
stream.point(x2, y2);
|
3548
3569
|
resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
|
@@ -3850,9 +3871,9 @@ d3 = function() {
|
|
3850
3871
|
}
|
3851
3872
|
function lines() {
|
3852
3873
|
return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
|
3853
|
-
return
|
3874
|
+
return abs(x % DX) > ε;
|
3854
3875
|
}).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
|
3855
|
-
return
|
3876
|
+
return abs(y % DY) > ε;
|
3856
3877
|
}).map(y));
|
3857
3878
|
}
|
3858
3879
|
graticule.lines = function() {
|
@@ -4000,7 +4021,7 @@ d3 = function() {
|
|
4000
4021
|
d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
|
4001
4022
|
};
|
4002
4023
|
function nextPoint(λ, φ) {
|
4003
|
-
var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t =
|
4024
|
+
var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
|
4004
4025
|
d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
|
4005
4026
|
λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
|
4006
4027
|
}
|
@@ -4037,7 +4058,7 @@ d3 = function() {
|
|
4037
4058
|
}, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
|
4038
4059
|
if (!n) return d3_geo_mercator;
|
4039
4060
|
function forward(λ, φ) {
|
4040
|
-
var ρ =
|
4061
|
+
var ρ = abs(abs(φ) - halfπ) < ε ? 0 : F / Math.pow(t(φ), n);
|
4041
4062
|
return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
|
4042
4063
|
}
|
4043
4064
|
forward.invert = function(x, y) {
|
@@ -4051,7 +4072,7 @@ d3 = function() {
|
|
4051
4072
|
}).raw = d3_geo_conicConformal;
|
4052
4073
|
function d3_geo_conicEquidistant(φ0, φ1) {
|
4053
4074
|
var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
|
4054
|
-
if (
|
4075
|
+
if (abs(n) < ε) return d3_geo_equirectangular;
|
4055
4076
|
function forward(λ, φ) {
|
4056
4077
|
var ρ = G - φ;
|
4057
4078
|
return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
|
@@ -4362,7 +4383,7 @@ d3 = function() {
|
|
4362
4383
|
var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
|
4363
4384
|
while (++i < j) {
|
4364
4385
|
d = d3_svg_lineSlope(points[i], points[i + 1]);
|
4365
|
-
if (
|
4386
|
+
if (abs(d) < ε) {
|
4366
4387
|
m[i] = m[i + 1] = 0;
|
4367
4388
|
} else {
|
4368
4389
|
a = m[i] / d;
|
@@ -4533,424 +4554,653 @@ d3 = function() {
|
|
4533
4554
|
var a = coordinates[0], b = coordinates[coordinates.length - 1];
|
4534
4555
|
return !(a[0] - b[0] || a[1] - b[1]);
|
4535
4556
|
}
|
4536
|
-
|
4537
|
-
|
4538
|
-
|
4539
|
-
|
4540
|
-
|
4541
|
-
|
4542
|
-
|
4543
|
-
|
4544
|
-
|
4545
|
-
|
4546
|
-
|
4547
|
-
|
4548
|
-
|
4549
|
-
|
4550
|
-
|
4551
|
-
|
4552
|
-
|
4553
|
-
|
4554
|
-
|
4555
|
-
|
4556
|
-
|
4557
|
-
|
4558
|
-
var
|
4559
|
-
|
4560
|
-
|
4561
|
-
|
4562
|
-
|
4563
|
-
|
4564
|
-
|
4565
|
-
|
4566
|
-
|
4567
|
-
|
4568
|
-
|
4569
|
-
|
4570
|
-
|
4571
|
-
|
4572
|
-
|
4573
|
-
|
4574
|
-
|
4575
|
-
|
4576
|
-
|
4577
|
-
|
4578
|
-
|
4579
|
-
|
4580
|
-
|
4581
|
-
|
4582
|
-
|
4583
|
-
|
4584
|
-
|
4585
|
-
|
4586
|
-
|
4587
|
-
|
4588
|
-
|
4589
|
-
|
4590
|
-
|
4591
|
-
|
4592
|
-
|
4593
|
-
|
4594
|
-
|
4595
|
-
|
4596
|
-
|
4597
|
-
|
4598
|
-
|
4599
|
-
|
4600
|
-
}).map(function(d) {
|
4601
|
-
return polygon[d];
|
4602
|
-
});
|
4603
|
-
});
|
4604
|
-
polygons.forEach(function(polygon, i) {
|
4605
|
-
var n = polygon.length;
|
4606
|
-
if (!n) return polygon.push([ -Z, -Z ], [ -Z, Z ], [ Z, Z ], [ Z, -Z ]);
|
4607
|
-
if (n > 2) return;
|
4608
|
-
var p0 = points[i], p1 = polygon[0], p2 = polygon[1], x0 = p0[0], y0 = p0[1], x1 = p1[0], y1 = p1[1], x2 = p2[0], y2 = p2[1], dx = Math.abs(x2 - x1), dy = y2 - y1;
|
4609
|
-
if (Math.abs(dy) < ε) {
|
4610
|
-
var y = y0 < y1 ? -Z : Z;
|
4611
|
-
polygon.push([ -Z, y ], [ Z, y ]);
|
4612
|
-
} else if (dx < ε) {
|
4613
|
-
var x = x0 < x1 ? -Z : Z;
|
4614
|
-
polygon.push([ x, -Z ], [ x, Z ]);
|
4557
|
+
var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
|
4558
|
+
function d3_geom_voronoiBeach() {
|
4559
|
+
d3_geom_voronoiRedBlackNode(this);
|
4560
|
+
this.edge = this.site = this.circle = null;
|
4561
|
+
}
|
4562
|
+
function d3_geom_voronoiCreateBeach(site) {
|
4563
|
+
var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
|
4564
|
+
beach.site = site;
|
4565
|
+
return beach;
|
4566
|
+
}
|
4567
|
+
function d3_geom_voronoiDetachBeach(beach) {
|
4568
|
+
d3_geom_voronoiDetachCircle(beach);
|
4569
|
+
d3_geom_voronoiBeaches.remove(beach);
|
4570
|
+
d3_geom_voronoiBeachPool.push(beach);
|
4571
|
+
d3_geom_voronoiRedBlackNode(beach);
|
4572
|
+
}
|
4573
|
+
function d3_geom_voronoiRemoveBeach(beach) {
|
4574
|
+
var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
|
4575
|
+
x: x,
|
4576
|
+
y: y
|
4577
|
+
}, previous = beach.P, next = beach.N, disappearing = [ beach ];
|
4578
|
+
d3_geom_voronoiDetachBeach(beach);
|
4579
|
+
var lArc = previous;
|
4580
|
+
while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
|
4581
|
+
previous = lArc.P;
|
4582
|
+
disappearing.unshift(lArc);
|
4583
|
+
d3_geom_voronoiDetachBeach(lArc);
|
4584
|
+
lArc = previous;
|
4585
|
+
}
|
4586
|
+
disappearing.unshift(lArc);
|
4587
|
+
d3_geom_voronoiDetachCircle(lArc);
|
4588
|
+
var rArc = next;
|
4589
|
+
while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
|
4590
|
+
next = rArc.N;
|
4591
|
+
disappearing.push(rArc);
|
4592
|
+
d3_geom_voronoiDetachBeach(rArc);
|
4593
|
+
rArc = next;
|
4594
|
+
}
|
4595
|
+
disappearing.push(rArc);
|
4596
|
+
d3_geom_voronoiDetachCircle(rArc);
|
4597
|
+
var nArcs = disappearing.length, iArc;
|
4598
|
+
for (iArc = 1; iArc < nArcs; ++iArc) {
|
4599
|
+
rArc = disappearing[iArc];
|
4600
|
+
lArc = disappearing[iArc - 1];
|
4601
|
+
d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
|
4602
|
+
}
|
4603
|
+
lArc = disappearing[0];
|
4604
|
+
rArc = disappearing[nArcs - 1];
|
4605
|
+
rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
|
4606
|
+
d3_geom_voronoiAttachCircle(lArc);
|
4607
|
+
d3_geom_voronoiAttachCircle(rArc);
|
4608
|
+
}
|
4609
|
+
function d3_geom_voronoiAddBeach(site) {
|
4610
|
+
var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
|
4611
|
+
while (node) {
|
4612
|
+
dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
|
4613
|
+
if (dxl > ε) node = node.L; else {
|
4614
|
+
dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
|
4615
|
+
if (dxr > ε) {
|
4616
|
+
if (!node.R) {
|
4617
|
+
lArc = node;
|
4618
|
+
break;
|
4619
|
+
}
|
4620
|
+
node = node.R;
|
4615
4621
|
} else {
|
4616
|
-
|
4617
|
-
|
4618
|
-
|
4622
|
+
if (dxl > -ε) {
|
4623
|
+
lArc = node.P;
|
4624
|
+
rArc = node;
|
4625
|
+
} else if (dxr > -ε) {
|
4626
|
+
lArc = node;
|
4627
|
+
rArc = node.N;
|
4619
4628
|
} else {
|
4620
|
-
|
4621
|
-
polygon.push([ -Z, y ], [ Z, y ]);
|
4629
|
+
lArc = rArc = node;
|
4622
4630
|
}
|
4631
|
+
break;
|
4632
|
+
}
|
4633
|
+
}
|
4634
|
+
}
|
4635
|
+
var newArc = d3_geom_voronoiCreateBeach(site);
|
4636
|
+
d3_geom_voronoiBeaches.insert(lArc, newArc);
|
4637
|
+
if (!lArc && !rArc) return;
|
4638
|
+
if (lArc === rArc) {
|
4639
|
+
d3_geom_voronoiDetachCircle(lArc);
|
4640
|
+
rArc = d3_geom_voronoiCreateBeach(lArc.site);
|
4641
|
+
d3_geom_voronoiBeaches.insert(newArc, rArc);
|
4642
|
+
newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
|
4643
|
+
d3_geom_voronoiAttachCircle(lArc);
|
4644
|
+
d3_geom_voronoiAttachCircle(rArc);
|
4645
|
+
return;
|
4646
|
+
}
|
4647
|
+
if (!rArc) {
|
4648
|
+
newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
|
4649
|
+
return;
|
4650
|
+
}
|
4651
|
+
d3_geom_voronoiDetachCircle(lArc);
|
4652
|
+
d3_geom_voronoiDetachCircle(rArc);
|
4653
|
+
var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
|
4654
|
+
x: (cy * hb - by * hc) / d + ax,
|
4655
|
+
y: (bx * hc - cx * hb) / d + ay
|
4656
|
+
};
|
4657
|
+
d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
|
4658
|
+
newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
|
4659
|
+
rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
|
4660
|
+
d3_geom_voronoiAttachCircle(lArc);
|
4661
|
+
d3_geom_voronoiAttachCircle(rArc);
|
4662
|
+
}
|
4663
|
+
function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
|
4664
|
+
var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
|
4665
|
+
if (!pby2) return rfocx;
|
4666
|
+
var lArc = arc.P;
|
4667
|
+
if (!lArc) return -Infinity;
|
4668
|
+
site = lArc.site;
|
4669
|
+
var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
|
4670
|
+
if (!plby2) return lfocx;
|
4671
|
+
var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
|
4672
|
+
if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
|
4673
|
+
return (rfocx + lfocx) / 2;
|
4674
|
+
}
|
4675
|
+
function d3_geom_voronoiRightBreakPoint(arc, directrix) {
|
4676
|
+
var rArc = arc.N;
|
4677
|
+
if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
|
4678
|
+
var site = arc.site;
|
4679
|
+
return site.y === directrix ? site.x : Infinity;
|
4680
|
+
}
|
4681
|
+
function d3_geom_voronoiCell(site) {
|
4682
|
+
this.site = site;
|
4683
|
+
this.edges = [];
|
4684
|
+
}
|
4685
|
+
d3_geom_voronoiCell.prototype.prepare = function() {
|
4686
|
+
var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
|
4687
|
+
while (iHalfEdge--) {
|
4688
|
+
edge = halfEdges[iHalfEdge].edge;
|
4689
|
+
if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
|
4690
|
+
}
|
4691
|
+
halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
|
4692
|
+
return halfEdges.length;
|
4693
|
+
};
|
4694
|
+
function d3_geom_voronoiCloseCells(extent) {
|
4695
|
+
var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
|
4696
|
+
while (iCell--) {
|
4697
|
+
cell = cells[iCell];
|
4698
|
+
if (!cell || !cell.prepare()) continue;
|
4699
|
+
halfEdges = cell.edges;
|
4700
|
+
nHalfEdges = halfEdges.length;
|
4701
|
+
iHalfEdge = 0;
|
4702
|
+
while (iHalfEdge < nHalfEdges) {
|
4703
|
+
end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
|
4704
|
+
start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
|
4705
|
+
if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
|
4706
|
+
halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
|
4707
|
+
x: x0,
|
4708
|
+
y: abs(x2 - x0) < ε ? y2 : y1
|
4709
|
+
} : abs(y3 - y1) < ε && x1 - x3 > ε ? {
|
4710
|
+
x: abs(y2 - y1) < ε ? x2 : x1,
|
4711
|
+
y: y1
|
4712
|
+
} : abs(x3 - x1) < ε && y3 - y0 > ε ? {
|
4713
|
+
x: x1,
|
4714
|
+
y: abs(x2 - x1) < ε ? y2 : y0
|
4715
|
+
} : abs(y3 - y0) < ε && x3 - x0 > ε ? {
|
4716
|
+
x: abs(y2 - y0) < ε ? x2 : x0,
|
4717
|
+
y: y0
|
4718
|
+
} : null), cell.site, null));
|
4719
|
+
++nHalfEdges;
|
4720
|
+
}
|
4721
|
+
}
|
4722
|
+
}
|
4723
|
+
}
|
4724
|
+
function d3_geom_voronoiHalfEdgeOrder(a, b) {
|
4725
|
+
return b.angle - a.angle;
|
4726
|
+
}
|
4727
|
+
function d3_geom_voronoiCircle() {
|
4728
|
+
d3_geom_voronoiRedBlackNode(this);
|
4729
|
+
this.x = this.y = this.arc = this.site = this.cy = null;
|
4730
|
+
}
|
4731
|
+
function d3_geom_voronoiAttachCircle(arc) {
|
4732
|
+
var lArc = arc.P, rArc = arc.N;
|
4733
|
+
if (!lArc || !rArc) return;
|
4734
|
+
var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
|
4735
|
+
if (lSite === rSite) return;
|
4736
|
+
var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
|
4737
|
+
var d = 2 * (ax * cy - ay * cx);
|
4738
|
+
if (d >= -ε2) return;
|
4739
|
+
var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
|
4740
|
+
var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
|
4741
|
+
circle.arc = arc;
|
4742
|
+
circle.site = cSite;
|
4743
|
+
circle.x = x + bx;
|
4744
|
+
circle.y = cy + Math.sqrt(x * x + y * y);
|
4745
|
+
circle.cy = cy;
|
4746
|
+
arc.circle = circle;
|
4747
|
+
var before = null, node = d3_geom_voronoiCircles._;
|
4748
|
+
while (node) {
|
4749
|
+
if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
|
4750
|
+
if (node.L) node = node.L; else {
|
4751
|
+
before = node.P;
|
4752
|
+
break;
|
4623
4753
|
}
|
4624
|
-
}
|
4625
|
-
|
4626
|
-
|
4627
|
-
|
4628
|
-
|
4629
|
-
|
4630
|
-
|
4631
|
-
|
4632
|
-
|
4633
|
-
|
4634
|
-
|
4635
|
-
|
4636
|
-
|
4637
|
-
if (
|
4638
|
-
|
4639
|
-
|
4640
|
-
|
4641
|
-
|
4642
|
-
}
|
4643
|
-
|
4644
|
-
|
4645
|
-
|
4646
|
-
|
4647
|
-
|
4648
|
-
|
4649
|
-
|
4650
|
-
|
4651
|
-
|
4652
|
-
|
4653
|
-
|
4654
|
-
|
4655
|
-
|
4656
|
-
|
4657
|
-
|
4658
|
-
|
4659
|
-
|
4660
|
-
|
4661
|
-
|
4662
|
-
|
4663
|
-
|
4664
|
-
|
4665
|
-
|
4666
|
-
|
4667
|
-
|
4668
|
-
var points = new Array(n), fx = d3_functor(x), fy = d3_functor(y), d, i = -1, n = data.length;
|
4669
|
-
while (++i < n) {
|
4670
|
-
(points[i] = [ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]).data = d;
|
4671
|
-
}
|
4672
|
-
return d3.geom.delaunay(points).map(function(triangle) {
|
4673
|
-
return triangle.map(function(point) {
|
4674
|
-
return point.data;
|
4675
|
-
});
|
4676
|
-
});
|
4677
|
-
};
|
4678
|
-
return voronoi;
|
4679
|
-
};
|
4680
|
-
var d3_geom_voronoiOpposite = {
|
4681
|
-
l: "r",
|
4682
|
-
r: "l"
|
4683
|
-
};
|
4684
|
-
function d3_geom_voronoiTessellate(points, callback) {
|
4685
|
-
var Sites = {
|
4686
|
-
list: points.map(function(v, i) {
|
4687
|
-
return {
|
4688
|
-
index: i,
|
4689
|
-
x: v[0],
|
4690
|
-
y: v[1]
|
4691
|
-
};
|
4692
|
-
}).sort(function(a, b) {
|
4693
|
-
return a.y < b.y ? -1 : a.y > b.y ? 1 : a.x < b.x ? -1 : a.x > b.x ? 1 : 0;
|
4694
|
-
}),
|
4695
|
-
bottomSite: null
|
4696
|
-
};
|
4697
|
-
var EdgeList = {
|
4698
|
-
list: [],
|
4699
|
-
leftEnd: null,
|
4700
|
-
rightEnd: null,
|
4701
|
-
init: function() {
|
4702
|
-
EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
|
4703
|
-
EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
|
4704
|
-
EdgeList.leftEnd.r = EdgeList.rightEnd;
|
4705
|
-
EdgeList.rightEnd.l = EdgeList.leftEnd;
|
4706
|
-
EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
|
4707
|
-
},
|
4708
|
-
createHalfEdge: function(edge, side) {
|
4709
|
-
return {
|
4710
|
-
edge: edge,
|
4711
|
-
side: side,
|
4712
|
-
vertex: null,
|
4713
|
-
l: null,
|
4714
|
-
r: null
|
4754
|
+
} else {
|
4755
|
+
if (node.R) node = node.R; else {
|
4756
|
+
before = node;
|
4757
|
+
break;
|
4758
|
+
}
|
4759
|
+
}
|
4760
|
+
}
|
4761
|
+
d3_geom_voronoiCircles.insert(before, circle);
|
4762
|
+
if (!before) d3_geom_voronoiFirstCircle = circle;
|
4763
|
+
}
|
4764
|
+
function d3_geom_voronoiDetachCircle(arc) {
|
4765
|
+
var circle = arc.circle;
|
4766
|
+
if (circle) {
|
4767
|
+
if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
|
4768
|
+
d3_geom_voronoiCircles.remove(circle);
|
4769
|
+
d3_geom_voronoiCirclePool.push(circle);
|
4770
|
+
d3_geom_voronoiRedBlackNode(circle);
|
4771
|
+
arc.circle = null;
|
4772
|
+
}
|
4773
|
+
}
|
4774
|
+
function d3_geom_voronoiClipEdges(extent) {
|
4775
|
+
var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
|
4776
|
+
while (i--) {
|
4777
|
+
e = edges[i];
|
4778
|
+
if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
|
4779
|
+
e.a = e.b = null;
|
4780
|
+
edges.splice(i, 1);
|
4781
|
+
}
|
4782
|
+
}
|
4783
|
+
}
|
4784
|
+
function d3_geom_voronoiConnectEdge(edge, extent) {
|
4785
|
+
var vb = edge.b;
|
4786
|
+
if (vb) return true;
|
4787
|
+
var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
|
4788
|
+
if (ry === ly) {
|
4789
|
+
if (fx < x0 || fx >= x1) return;
|
4790
|
+
if (lx > rx) {
|
4791
|
+
if (!va) va = {
|
4792
|
+
x: fx,
|
4793
|
+
y: y0
|
4794
|
+
}; else if (va.y >= y1) return;
|
4795
|
+
vb = {
|
4796
|
+
x: fx,
|
4797
|
+
y: y1
|
4715
4798
|
};
|
4716
|
-
}
|
4717
|
-
|
4718
|
-
|
4719
|
-
|
4720
|
-
|
4721
|
-
|
4722
|
-
|
4723
|
-
|
4724
|
-
var he = EdgeList.leftEnd;
|
4725
|
-
do {
|
4726
|
-
he = he.r;
|
4727
|
-
} while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
|
4728
|
-
he = he.l;
|
4729
|
-
return he;
|
4730
|
-
},
|
4731
|
-
del: function(he) {
|
4732
|
-
he.l.r = he.r;
|
4733
|
-
he.r.l = he.l;
|
4734
|
-
he.edge = null;
|
4735
|
-
},
|
4736
|
-
right: function(he) {
|
4737
|
-
return he.r;
|
4738
|
-
},
|
4739
|
-
left: function(he) {
|
4740
|
-
return he.l;
|
4741
|
-
},
|
4742
|
-
leftRegion: function(he) {
|
4743
|
-
return he.edge == null ? Sites.bottomSite : he.edge.region[he.side];
|
4744
|
-
},
|
4745
|
-
rightRegion: function(he) {
|
4746
|
-
return he.edge == null ? Sites.bottomSite : he.edge.region[d3_geom_voronoiOpposite[he.side]];
|
4747
|
-
}
|
4748
|
-
};
|
4749
|
-
var Geom = {
|
4750
|
-
bisect: function(s1, s2) {
|
4751
|
-
var newEdge = {
|
4752
|
-
region: {
|
4753
|
-
l: s1,
|
4754
|
-
r: s2
|
4755
|
-
},
|
4756
|
-
ep: {
|
4757
|
-
l: null,
|
4758
|
-
r: null
|
4759
|
-
}
|
4799
|
+
} else {
|
4800
|
+
if (!va) va = {
|
4801
|
+
x: fx,
|
4802
|
+
y: y1
|
4803
|
+
}; else if (va.y < y0) return;
|
4804
|
+
vb = {
|
4805
|
+
x: fx,
|
4806
|
+
y: y0
|
4760
4807
|
};
|
4761
|
-
|
4762
|
-
|
4763
|
-
|
4764
|
-
|
4765
|
-
|
4766
|
-
|
4808
|
+
}
|
4809
|
+
} else {
|
4810
|
+
fm = (lx - rx) / (ry - ly);
|
4811
|
+
fb = fy - fm * fx;
|
4812
|
+
if (fm < -1 || fm > 1) {
|
4813
|
+
if (lx > rx) {
|
4814
|
+
if (!va) va = {
|
4815
|
+
x: (y0 - fb) / fm,
|
4816
|
+
y: y0
|
4817
|
+
}; else if (va.y >= y1) return;
|
4818
|
+
vb = {
|
4819
|
+
x: (y1 - fb) / fm,
|
4820
|
+
y: y1
|
4821
|
+
};
|
4767
4822
|
} else {
|
4768
|
-
|
4769
|
-
|
4770
|
-
|
4823
|
+
if (!va) va = {
|
4824
|
+
x: (y1 - fb) / fm,
|
4825
|
+
y: y1
|
4826
|
+
}; else if (va.y < y0) return;
|
4827
|
+
vb = {
|
4828
|
+
x: (y0 - fb) / fm,
|
4829
|
+
y: y0
|
4830
|
+
};
|
4771
4831
|
}
|
4772
|
-
|
4773
|
-
|
4774
|
-
|
4775
|
-
|
4776
|
-
|
4777
|
-
return
|
4778
|
-
|
4779
|
-
|
4780
|
-
|
4781
|
-
|
4782
|
-
}
|
4783
|
-
var xint = (e1.c * e2.b - e2.c * e1.b) / d, yint = (e2.c * e1.a - e1.c * e2.a) / d, e1r = e1.region.r, e2r = e2.region.r, el, e;
|
4784
|
-
if (e1r.y < e2r.y || e1r.y == e2r.y && e1r.x < e2r.x) {
|
4785
|
-
el = el1;
|
4786
|
-
e = e1;
|
4832
|
+
} else {
|
4833
|
+
if (ly < ry) {
|
4834
|
+
if (!va) va = {
|
4835
|
+
x: x0,
|
4836
|
+
y: fm * x0 + fb
|
4837
|
+
}; else if (va.x >= x1) return;
|
4838
|
+
vb = {
|
4839
|
+
x: x1,
|
4840
|
+
y: fm * x1 + fb
|
4841
|
+
};
|
4787
4842
|
} else {
|
4788
|
-
|
4789
|
-
|
4790
|
-
|
4791
|
-
|
4792
|
-
|
4793
|
-
|
4794
|
-
|
4795
|
-
|
4796
|
-
x: xint,
|
4797
|
-
y: yint
|
4798
|
-
};
|
4799
|
-
},
|
4800
|
-
rightOf: function(he, p) {
|
4801
|
-
var e = he.edge, topsite = e.region.r, rightOfSite = p.x > topsite.x;
|
4802
|
-
if (rightOfSite && he.side === "l") {
|
4803
|
-
return 1;
|
4804
|
-
}
|
4805
|
-
if (!rightOfSite && he.side === "r") {
|
4806
|
-
return 0;
|
4843
|
+
if (!va) va = {
|
4844
|
+
x: x1,
|
4845
|
+
y: fm * x1 + fb
|
4846
|
+
}; else if (va.x < x0) return;
|
4847
|
+
vb = {
|
4848
|
+
x: x0,
|
4849
|
+
y: fm * x0 + fb
|
4850
|
+
};
|
4807
4851
|
}
|
4808
|
-
|
4809
|
-
|
4810
|
-
|
4811
|
-
|
4852
|
+
}
|
4853
|
+
}
|
4854
|
+
edge.a = va;
|
4855
|
+
edge.b = vb;
|
4856
|
+
return true;
|
4857
|
+
}
|
4858
|
+
function d3_geom_voronoiEdge(lSite, rSite) {
|
4859
|
+
this.l = lSite;
|
4860
|
+
this.r = rSite;
|
4861
|
+
this.a = this.b = null;
|
4862
|
+
}
|
4863
|
+
function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
|
4864
|
+
var edge = new d3_geom_voronoiEdge(lSite, rSite);
|
4865
|
+
d3_geom_voronoiEdges.push(edge);
|
4866
|
+
if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
|
4867
|
+
if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
|
4868
|
+
d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
|
4869
|
+
d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
|
4870
|
+
return edge;
|
4871
|
+
}
|
4872
|
+
function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
|
4873
|
+
var edge = new d3_geom_voronoiEdge(lSite, null);
|
4874
|
+
edge.a = va;
|
4875
|
+
edge.b = vb;
|
4876
|
+
d3_geom_voronoiEdges.push(edge);
|
4877
|
+
return edge;
|
4878
|
+
}
|
4879
|
+
function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
|
4880
|
+
if (!edge.a && !edge.b) {
|
4881
|
+
edge.a = vertex;
|
4882
|
+
edge.l = lSite;
|
4883
|
+
edge.r = rSite;
|
4884
|
+
} else if (edge.l === rSite) {
|
4885
|
+
edge.b = vertex;
|
4886
|
+
} else {
|
4887
|
+
edge.a = vertex;
|
4888
|
+
}
|
4889
|
+
}
|
4890
|
+
function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
|
4891
|
+
var va = edge.a, vb = edge.b;
|
4892
|
+
this.edge = edge;
|
4893
|
+
this.site = lSite;
|
4894
|
+
this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
|
4895
|
+
}
|
4896
|
+
d3_geom_voronoiHalfEdge.prototype = {
|
4897
|
+
start: function() {
|
4898
|
+
return this.edge.l === this.site ? this.edge.a : this.edge.b;
|
4899
|
+
},
|
4900
|
+
end: function() {
|
4901
|
+
return this.edge.l === this.site ? this.edge.b : this.edge.a;
|
4902
|
+
}
|
4903
|
+
};
|
4904
|
+
function d3_geom_voronoiRedBlackTree() {
|
4905
|
+
this._ = null;
|
4906
|
+
}
|
4907
|
+
function d3_geom_voronoiRedBlackNode(node) {
|
4908
|
+
node.U = node.C = node.L = node.R = node.P = node.N = null;
|
4909
|
+
}
|
4910
|
+
d3_geom_voronoiRedBlackTree.prototype = {
|
4911
|
+
insert: function(after, node) {
|
4912
|
+
var parent, grandpa, uncle;
|
4913
|
+
if (after) {
|
4914
|
+
node.P = after;
|
4915
|
+
node.N = after.N;
|
4916
|
+
if (after.N) after.N.P = node;
|
4917
|
+
after.N = node;
|
4918
|
+
if (after.R) {
|
4919
|
+
after = after.R;
|
4920
|
+
while (after.L) after = after.L;
|
4921
|
+
after.L = node;
|
4922
|
+
} else {
|
4923
|
+
after.R = node;
|
4924
|
+
}
|
4925
|
+
parent = after;
|
4926
|
+
} else if (this._) {
|
4927
|
+
after = d3_geom_voronoiRedBlackFirst(this._);
|
4928
|
+
node.P = null;
|
4929
|
+
node.N = after;
|
4930
|
+
after.P = after.L = node;
|
4931
|
+
parent = after;
|
4932
|
+
} else {
|
4933
|
+
node.P = node.N = null;
|
4934
|
+
this._ = node;
|
4935
|
+
parent = null;
|
4936
|
+
}
|
4937
|
+
node.L = node.R = null;
|
4938
|
+
node.U = parent;
|
4939
|
+
node.C = true;
|
4940
|
+
after = node;
|
4941
|
+
while (parent && parent.C) {
|
4942
|
+
grandpa = parent.U;
|
4943
|
+
if (parent === grandpa.L) {
|
4944
|
+
uncle = grandpa.R;
|
4945
|
+
if (uncle && uncle.C) {
|
4946
|
+
parent.C = uncle.C = false;
|
4947
|
+
grandpa.C = true;
|
4948
|
+
after = grandpa;
|
4812
4949
|
} else {
|
4813
|
-
|
4814
|
-
|
4815
|
-
|
4816
|
-
|
4817
|
-
if (!above) {
|
4818
|
-
fast = 1;
|
4950
|
+
if (after === parent.R) {
|
4951
|
+
d3_geom_voronoiRedBlackRotateLeft(this, parent);
|
4952
|
+
after = parent;
|
4953
|
+
parent = after.U;
|
4819
4954
|
}
|
4955
|
+
parent.C = false;
|
4956
|
+
grandpa.C = true;
|
4957
|
+
d3_geom_voronoiRedBlackRotateRight(this, grandpa);
|
4820
4958
|
}
|
4821
|
-
|
4822
|
-
|
4823
|
-
|
4824
|
-
|
4825
|
-
|
4959
|
+
} else {
|
4960
|
+
uncle = grandpa.L;
|
4961
|
+
if (uncle && uncle.C) {
|
4962
|
+
parent.C = uncle.C = false;
|
4963
|
+
grandpa.C = true;
|
4964
|
+
after = grandpa;
|
4965
|
+
} else {
|
4966
|
+
if (after === parent.L) {
|
4967
|
+
d3_geom_voronoiRedBlackRotateRight(this, parent);
|
4968
|
+
after = parent;
|
4969
|
+
parent = after.U;
|
4826
4970
|
}
|
4971
|
+
parent.C = false;
|
4972
|
+
grandpa.C = true;
|
4973
|
+
d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
|
4827
4974
|
}
|
4975
|
+
}
|
4976
|
+
parent = after.U;
|
4977
|
+
}
|
4978
|
+
this._.C = false;
|
4979
|
+
},
|
4980
|
+
remove: function(node) {
|
4981
|
+
if (node.N) node.N.P = node.P;
|
4982
|
+
if (node.P) node.P.N = node.N;
|
4983
|
+
node.N = node.P = null;
|
4984
|
+
var parent = node.U, sibling, left = node.L, right = node.R, next, red;
|
4985
|
+
if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
|
4986
|
+
if (parent) {
|
4987
|
+
if (parent.L === node) parent.L = next; else parent.R = next;
|
4988
|
+
} else {
|
4989
|
+
this._ = next;
|
4990
|
+
}
|
4991
|
+
if (left && right) {
|
4992
|
+
red = next.C;
|
4993
|
+
next.C = node.C;
|
4994
|
+
next.L = left;
|
4995
|
+
left.U = next;
|
4996
|
+
if (next !== right) {
|
4997
|
+
parent = next.U;
|
4998
|
+
next.U = node.U;
|
4999
|
+
node = next.R;
|
5000
|
+
parent.L = node;
|
5001
|
+
next.R = right;
|
5002
|
+
right.U = next;
|
4828
5003
|
} else {
|
4829
|
-
|
4830
|
-
|
5004
|
+
next.U = parent;
|
5005
|
+
parent = next;
|
5006
|
+
node = next.R;
|
4831
5007
|
}
|
4832
|
-
|
4833
|
-
|
4834
|
-
|
4835
|
-
|
4836
|
-
|
4837
|
-
|
4838
|
-
|
4839
|
-
|
4840
|
-
|
4841
|
-
|
4842
|
-
|
4843
|
-
|
4844
|
-
|
4845
|
-
|
4846
|
-
|
4847
|
-
|
4848
|
-
|
4849
|
-
|
4850
|
-
|
4851
|
-
|
4852
|
-
|
4853
|
-
|
5008
|
+
} else {
|
5009
|
+
red = node.C;
|
5010
|
+
node = next;
|
5011
|
+
}
|
5012
|
+
if (node) node.U = parent;
|
5013
|
+
if (red) return;
|
5014
|
+
if (node && node.C) {
|
5015
|
+
node.C = false;
|
5016
|
+
return;
|
5017
|
+
}
|
5018
|
+
do {
|
5019
|
+
if (node === this._) break;
|
5020
|
+
if (node === parent.L) {
|
5021
|
+
sibling = parent.R;
|
5022
|
+
if (sibling.C) {
|
5023
|
+
sibling.C = false;
|
5024
|
+
parent.C = true;
|
5025
|
+
d3_geom_voronoiRedBlackRotateLeft(this, parent);
|
5026
|
+
sibling = parent.R;
|
5027
|
+
}
|
5028
|
+
if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
|
5029
|
+
if (!sibling.R || !sibling.R.C) {
|
5030
|
+
sibling.L.C = false;
|
5031
|
+
sibling.C = true;
|
5032
|
+
d3_geom_voronoiRedBlackRotateRight(this, sibling);
|
5033
|
+
sibling = parent.R;
|
5034
|
+
}
|
5035
|
+
sibling.C = parent.C;
|
5036
|
+
parent.C = sibling.R.C = false;
|
5037
|
+
d3_geom_voronoiRedBlackRotateLeft(this, parent);
|
5038
|
+
node = this._;
|
5039
|
+
break;
|
5040
|
+
}
|
5041
|
+
} else {
|
5042
|
+
sibling = parent.L;
|
5043
|
+
if (sibling.C) {
|
5044
|
+
sibling.C = false;
|
5045
|
+
parent.C = true;
|
5046
|
+
d3_geom_voronoiRedBlackRotateRight(this, parent);
|
5047
|
+
sibling = parent.L;
|
5048
|
+
}
|
5049
|
+
if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
|
5050
|
+
if (!sibling.L || !sibling.L.C) {
|
5051
|
+
sibling.R.C = false;
|
5052
|
+
sibling.C = true;
|
5053
|
+
d3_geom_voronoiRedBlackRotateLeft(this, sibling);
|
5054
|
+
sibling = parent.L;
|
5055
|
+
}
|
5056
|
+
sibling.C = parent.C;
|
5057
|
+
parent.C = sibling.L.C = false;
|
5058
|
+
d3_geom_voronoiRedBlackRotateRight(this, parent);
|
5059
|
+
node = this._;
|
4854
5060
|
break;
|
4855
5061
|
}
|
4856
5062
|
}
|
4857
|
-
|
4858
|
-
|
4859
|
-
|
4860
|
-
|
4861
|
-
|
4862
|
-
|
4863
|
-
|
4864
|
-
|
4865
|
-
|
4866
|
-
|
4867
|
-
|
4868
|
-
|
4869
|
-
|
4870
|
-
|
4871
|
-
|
4872
|
-
|
4873
|
-
|
4874
|
-
|
4875
|
-
|
4876
|
-
|
4877
|
-
|
4878
|
-
|
4879
|
-
|
4880
|
-
|
4881
|
-
|
4882
|
-
|
4883
|
-
|
4884
|
-
|
4885
|
-
|
4886
|
-
|
4887
|
-
|
4888
|
-
|
5063
|
+
sibling.C = true;
|
5064
|
+
node = parent;
|
5065
|
+
parent = parent.U;
|
5066
|
+
} while (!node.C);
|
5067
|
+
if (node) node.C = false;
|
5068
|
+
}
|
5069
|
+
};
|
5070
|
+
function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
|
5071
|
+
var p = node, q = node.R, parent = p.U;
|
5072
|
+
if (parent) {
|
5073
|
+
if (parent.L === p) parent.L = q; else parent.R = q;
|
5074
|
+
} else {
|
5075
|
+
tree._ = q;
|
5076
|
+
}
|
5077
|
+
q.U = parent;
|
5078
|
+
p.U = q;
|
5079
|
+
p.R = q.L;
|
5080
|
+
if (p.R) p.R.U = p;
|
5081
|
+
q.L = p;
|
5082
|
+
}
|
5083
|
+
function d3_geom_voronoiRedBlackRotateRight(tree, node) {
|
5084
|
+
var p = node, q = node.L, parent = p.U;
|
5085
|
+
if (parent) {
|
5086
|
+
if (parent.L === p) parent.L = q; else parent.R = q;
|
5087
|
+
} else {
|
5088
|
+
tree._ = q;
|
5089
|
+
}
|
5090
|
+
q.U = parent;
|
5091
|
+
p.U = q;
|
5092
|
+
p.L = q.R;
|
5093
|
+
if (p.L) p.L.U = p;
|
5094
|
+
q.R = p;
|
5095
|
+
}
|
5096
|
+
function d3_geom_voronoiRedBlackFirst(node) {
|
5097
|
+
while (node.L) node = node.L;
|
5098
|
+
return node;
|
5099
|
+
}
|
5100
|
+
function d3_geom_voronoi(sites, bbox) {
|
5101
|
+
var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
|
5102
|
+
d3_geom_voronoiEdges = [];
|
5103
|
+
d3_geom_voronoiCells = new Array(sites.length);
|
5104
|
+
d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
|
5105
|
+
d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
|
4889
5106
|
while (true) {
|
4890
|
-
|
4891
|
-
|
4892
|
-
|
4893
|
-
|
4894
|
-
|
4895
|
-
|
4896
|
-
|
4897
|
-
|
4898
|
-
|
4899
|
-
|
4900
|
-
p = Geom.intersect(lbnd, bisector);
|
4901
|
-
if (p) {
|
4902
|
-
EventQueue.del(lbnd);
|
4903
|
-
EventQueue.insert(lbnd, p, Geom.distance(p, newSite));
|
4904
|
-
}
|
4905
|
-
lbnd = bisector;
|
4906
|
-
bisector = EdgeList.createHalfEdge(e, "r");
|
4907
|
-
EdgeList.insert(lbnd, bisector);
|
4908
|
-
p = Geom.intersect(bisector, rbnd);
|
4909
|
-
if (p) {
|
4910
|
-
EventQueue.insert(bisector, p, Geom.distance(p, newSite));
|
4911
|
-
}
|
4912
|
-
newSite = Sites.list.shift();
|
4913
|
-
} else if (!EventQueue.empty()) {
|
4914
|
-
lbnd = EventQueue.extractMin();
|
4915
|
-
llbnd = EdgeList.left(lbnd);
|
4916
|
-
rbnd = EdgeList.right(lbnd);
|
4917
|
-
rrbnd = EdgeList.right(rbnd);
|
4918
|
-
bot = EdgeList.leftRegion(lbnd);
|
4919
|
-
top = EdgeList.rightRegion(rbnd);
|
4920
|
-
v = lbnd.vertex;
|
4921
|
-
Geom.endPoint(lbnd.edge, lbnd.side, v);
|
4922
|
-
Geom.endPoint(rbnd.edge, rbnd.side, v);
|
4923
|
-
EdgeList.del(lbnd);
|
4924
|
-
EventQueue.del(rbnd);
|
4925
|
-
EdgeList.del(rbnd);
|
4926
|
-
pm = "l";
|
4927
|
-
if (bot.y > top.y) {
|
4928
|
-
temp = bot;
|
4929
|
-
bot = top;
|
4930
|
-
top = temp;
|
4931
|
-
pm = "r";
|
4932
|
-
}
|
4933
|
-
e = Geom.bisect(bot, top);
|
4934
|
-
bisector = EdgeList.createHalfEdge(e, pm);
|
4935
|
-
EdgeList.insert(llbnd, bisector);
|
4936
|
-
Geom.endPoint(e, d3_geom_voronoiOpposite[pm], v);
|
4937
|
-
p = Geom.intersect(llbnd, bisector);
|
4938
|
-
if (p) {
|
4939
|
-
EventQueue.del(llbnd);
|
4940
|
-
EventQueue.insert(llbnd, p, Geom.distance(p, bot));
|
4941
|
-
}
|
4942
|
-
p = Geom.intersect(bisector, rrbnd);
|
4943
|
-
if (p) {
|
4944
|
-
EventQueue.insert(bisector, p, Geom.distance(p, bot));
|
4945
|
-
}
|
5107
|
+
circle = d3_geom_voronoiFirstCircle;
|
5108
|
+
if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
|
5109
|
+
if (site.x !== x0 || site.y !== y0) {
|
5110
|
+
d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
|
5111
|
+
d3_geom_voronoiAddBeach(site);
|
5112
|
+
x0 = site.x, y0 = site.y;
|
5113
|
+
}
|
5114
|
+
site = sites.pop();
|
5115
|
+
} else if (circle) {
|
5116
|
+
d3_geom_voronoiRemoveBeach(circle.arc);
|
4946
5117
|
} else {
|
4947
5118
|
break;
|
4948
5119
|
}
|
4949
5120
|
}
|
4950
|
-
|
4951
|
-
|
5121
|
+
if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
|
5122
|
+
var diagram = {
|
5123
|
+
cells: d3_geom_voronoiCells,
|
5124
|
+
edges: d3_geom_voronoiEdges
|
5125
|
+
};
|
5126
|
+
d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
|
5127
|
+
return diagram;
|
5128
|
+
}
|
5129
|
+
function d3_geom_voronoiVertexOrder(a, b) {
|
5130
|
+
return b.y - a.y || b.x - a.x;
|
5131
|
+
}
|
5132
|
+
d3.geom.voronoi = function(points) {
|
5133
|
+
var x = d3_svg_lineX, y = d3_svg_lineY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
|
5134
|
+
if (points) return voronoi(points);
|
5135
|
+
function voronoi(data) {
|
5136
|
+
var polygons = [];
|
5137
|
+
d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
|
5138
|
+
(polygons[i] = cell.edges.length ? cell.edges.map(function(edge) {
|
5139
|
+
var start = edge.start();
|
5140
|
+
return [ start.x, start.y ];
|
5141
|
+
}) : [ [ clipExtent[0][0], clipExtent[1][1] ], [ clipExtent[1][0], clipExtent[1][1] ], [ clipExtent[1][0], clipExtent[0][1] ], [ clipExtent[0][0], clipExtent[0][1] ] ]).point = data[i];
|
5142
|
+
});
|
5143
|
+
return polygons;
|
5144
|
+
}
|
5145
|
+
function sites(data) {
|
5146
|
+
return data.map(function(d, i) {
|
5147
|
+
return {
|
5148
|
+
x: fx(d, i),
|
5149
|
+
y: fy(d, i),
|
5150
|
+
i: i
|
5151
|
+
};
|
5152
|
+
});
|
4952
5153
|
}
|
5154
|
+
voronoi.links = function(data) {
|
5155
|
+
return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
|
5156
|
+
return edge.l && edge.r;
|
5157
|
+
}).map(function(edge) {
|
5158
|
+
return {
|
5159
|
+
source: data[edge.l.i],
|
5160
|
+
target: data[edge.r.i]
|
5161
|
+
};
|
5162
|
+
});
|
5163
|
+
};
|
5164
|
+
voronoi.triangles = function(data) {
|
5165
|
+
var triangles = [];
|
5166
|
+
d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
|
5167
|
+
var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
|
5168
|
+
while (++j < m) {
|
5169
|
+
e0 = e1;
|
5170
|
+
s0 = s1;
|
5171
|
+
e1 = edges[j].edge;
|
5172
|
+
s1 = e1.l === site ? e1.r : e1.l;
|
5173
|
+
if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
|
5174
|
+
triangles.push([ data[i], data[s0.i], data[s1.i] ]);
|
5175
|
+
}
|
5176
|
+
}
|
5177
|
+
});
|
5178
|
+
return triangles;
|
5179
|
+
};
|
5180
|
+
voronoi.x = function(_) {
|
5181
|
+
return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
|
5182
|
+
};
|
5183
|
+
voronoi.y = function(_) {
|
5184
|
+
return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
|
5185
|
+
};
|
5186
|
+
voronoi.clipExtent = function(_) {
|
5187
|
+
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
|
5188
|
+
clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
|
5189
|
+
return voronoi;
|
5190
|
+
};
|
5191
|
+
voronoi.size = function(_) {
|
5192
|
+
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
|
5193
|
+
return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
|
5194
|
+
};
|
5195
|
+
return voronoi;
|
5196
|
+
};
|
5197
|
+
var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
|
5198
|
+
function d3_geom_voronoiTriangleArea(a, b, c) {
|
5199
|
+
return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
|
4953
5200
|
}
|
5201
|
+
d3.geom.delaunay = function(vertices) {
|
5202
|
+
return d3.geom.voronoi().triangles(vertices);
|
5203
|
+
};
|
4954
5204
|
d3.geom.quadtree = function(points, x1, y1, x2, y2) {
|
4955
5205
|
var x = d3_svg_lineX, y = d3_svg_lineY, compat;
|
4956
5206
|
if (compat = arguments.length) {
|
@@ -4996,7 +5246,7 @@ d3 = function() {
|
|
4996
5246
|
if (n.leaf) {
|
4997
5247
|
var nx = n.x, ny = n.y;
|
4998
5248
|
if (nx != null) {
|
4999
|
-
if (
|
5249
|
+
if (abs(nx - x) + abs(ny - y) < .01) {
|
5000
5250
|
insertChild(n, d, x, y, x1, y1, x2, y2);
|
5001
5251
|
} else {
|
5002
5252
|
var nPoint = n.point;
|
@@ -5242,7 +5492,7 @@ d3 = function() {
|
|
5242
5492
|
var i = name.indexOf("-"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : "in";
|
5243
5493
|
t = d3_ease.get(t) || d3_ease_default;
|
5244
5494
|
m = d3_ease_mode.get(m) || d3_identity;
|
5245
|
-
return d3_ease_clamp(m(t.apply(null,
|
5495
|
+
return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
|
5246
5496
|
};
|
5247
5497
|
function d3_ease_clamp(f) {
|
5248
5498
|
return function(t) {
|
@@ -5751,7 +6001,7 @@ d3 = function() {
|
|
5751
6001
|
return force;
|
5752
6002
|
};
|
5753
6003
|
force.start = function() {
|
5754
|
-
var i,
|
6004
|
+
var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
|
5755
6005
|
for (i = 0; i < n; ++i) {
|
5756
6006
|
(o = nodes[i]).index = i;
|
5757
6007
|
o.weight = 0;
|
@@ -5777,13 +6027,8 @@ d3 = function() {
|
|
5777
6027
|
charges = [];
|
5778
6028
|
if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
|
5779
6029
|
function position(dimension, size) {
|
5780
|
-
var neighbors = neighbor(i), j = -1, m = neighbors.length, x;
|
5781
|
-
while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
|
5782
|
-
return Math.random() * size;
|
5783
|
-
}
|
5784
|
-
function neighbor() {
|
5785
6030
|
if (!neighbors) {
|
5786
|
-
neighbors =
|
6031
|
+
neighbors = new Array(n);
|
5787
6032
|
for (j = 0; j < n; ++j) {
|
5788
6033
|
neighbors[j] = [];
|
5789
6034
|
}
|
@@ -5793,7 +6038,9 @@ d3 = function() {
|
|
5793
6038
|
neighbors[o.target.index].push(o.source);
|
5794
6039
|
}
|
5795
6040
|
}
|
5796
|
-
|
6041
|
+
var candidates = neighbors[i], j = -1, m = candidates.length, x;
|
6042
|
+
while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;
|
6043
|
+
return Math.random() * size;
|
5797
6044
|
}
|
5798
6045
|
return force.resume();
|
5799
6046
|
};
|
@@ -7848,9 +8095,10 @@ d3 = function() {
|
|
7848
8095
|
};
|
7849
8096
|
++lock.count;
|
7850
8097
|
d3.timer(function(elapsed) {
|
7851
|
-
var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, tweened = [];
|
8098
|
+
var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];
|
8099
|
+
timer.t = delay + time;
|
7852
8100
|
if (delay <= elapsed) return start(elapsed - delay);
|
7853
|
-
|
8101
|
+
timer.c = start;
|
7854
8102
|
function start(elapsed) {
|
7855
8103
|
if (lock.active > id) return stop();
|
7856
8104
|
lock.active = id;
|
@@ -7860,8 +8108,10 @@ d3 = function() {
|
|
7860
8108
|
tweened.push(value);
|
7861
8109
|
}
|
7862
8110
|
});
|
7863
|
-
|
7864
|
-
|
8111
|
+
d3.timer(function() {
|
8112
|
+
timer.c = tick(elapsed || 1) ? d3_true : tick;
|
8113
|
+
return 1;
|
8114
|
+
}, 0, time);
|
7865
8115
|
}
|
7866
8116
|
function tick(elapsed) {
|
7867
8117
|
if (lock.active !== id) return stop();
|
@@ -8765,7 +9015,7 @@ d3 = function() {
|
|
8765
9015
|
pm: 1
|
8766
9016
|
});
|
8767
9017
|
function d3_time_zone(d) {
|
8768
|
-
var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(
|
9018
|
+
var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(abs(z) / 60), zm = abs(z) % 60;
|
8769
9019
|
return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
|
8770
9020
|
}
|
8771
9021
|
function d3_time_parseLiteralPercent(date, string, i) {
|