d3_rails 3.3.6 → 3.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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) {
|