d3js-plugins-rails 0.0.1

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.
Files changed (152) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +28 -0
  5. data/Rakefile +1 -0
  6. data/d3js-plugins-rails.gemspec +21 -0
  7. data/lib/d3js-plugins-rails/version.rb +7 -0
  8. data/lib/d3js-plugins-rails.rb +10 -0
  9. data/vendor/assets/javascripts/d3/plugins/.gitignore +1 -0
  10. data/vendor/assets/javascripts/d3/plugins/LICENSE +26 -0
  11. data/vendor/assets/javascripts/d3/plugins/Makefile +87 -0
  12. data/vendor/assets/javascripts/d3/plugins/README.md +19 -0
  13. data/vendor/assets/javascripts/d3/plugins/box/box.js +301 -0
  14. data/vendor/assets/javascripts/d3/plugins/bullet/README.md +14 -0
  15. data/vendor/assets/javascripts/d3/plugins/bullet/bullet.js +241 -0
  16. data/vendor/assets/javascripts/d3/plugins/chernoff/README.md +15 -0
  17. data/vendor/assets/javascripts/d3/plugins/chernoff/chernoff.js +176 -0
  18. data/vendor/assets/javascripts/d3/plugins/cie/README.md +54 -0
  19. data/vendor/assets/javascripts/d3/plugins/cie/cie.js +155 -0
  20. data/vendor/assets/javascripts/d3/plugins/fisheye/README.md +43 -0
  21. data/vendor/assets/javascripts/d3/plugins/fisheye/fisheye.js +85 -0
  22. data/vendor/assets/javascripts/d3/plugins/force_labels/README.md +29 -0
  23. data/vendor/assets/javascripts/d3/plugins/force_labels/force_labels.js +56 -0
  24. data/vendor/assets/javascripts/d3/plugins/geo/polyhedron/README.md +7 -0
  25. data/vendor/assets/javascripts/d3/plugins/geo/polyhedron/polyhedron.js +436 -0
  26. data/vendor/assets/javascripts/d3/plugins/geo/projection/README.md +107 -0
  27. data/vendor/assets/javascripts/d3/plugins/geo/projection/aitoff.js +40 -0
  28. data/vendor/assets/javascripts/d3/plugins/geo/projection/armadillo.js +79 -0
  29. data/vendor/assets/javascripts/d3/plugins/geo/projection/august.js +15 -0
  30. data/vendor/assets/javascripts/d3/plugins/geo/projection/baker.js +28 -0
  31. data/vendor/assets/javascripts/d3/plugins/geo/projection/berghaus.js +60 -0
  32. data/vendor/assets/javascripts/d3/plugins/geo/projection/boggs.js +27 -0
  33. data/vendor/assets/javascripts/d3/plugins/geo/projection/bonne.js +29 -0
  34. data/vendor/assets/javascripts/d3/plugins/geo/projection/bromley.js +5 -0
  35. data/vendor/assets/javascripts/d3/plugins/geo/projection/collignon.js +17 -0
  36. data/vendor/assets/javascripts/d3/plugins/geo/projection/conic-conformal.js +29 -0
  37. data/vendor/assets/javascripts/d3/plugins/geo/projection/conic-equidistant.js +27 -0
  38. data/vendor/assets/javascripts/d3/plugins/geo/projection/craig.js +24 -0
  39. data/vendor/assets/javascripts/d3/plugins/geo/projection/craster.js +18 -0
  40. data/vendor/assets/javascripts/d3/plugins/geo/projection/cylindrical-equal-area.js +23 -0
  41. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert1.js +18 -0
  42. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert2.js +17 -0
  43. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert3.js +17 -0
  44. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert4.js +24 -0
  45. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert5.js +17 -0
  46. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert6.js +22 -0
  47. data/vendor/assets/javascripts/d3/plugins/geo/projection/eisenlohr.js +16 -0
  48. data/vendor/assets/javascripts/d3/plugins/geo/projection/end.js +1 -0
  49. data/vendor/assets/javascripts/d3/plugins/geo/projection/gringorten.js +111 -0
  50. data/vendor/assets/javascripts/d3/plugins/geo/projection/guyou.js +46 -0
  51. data/vendor/assets/javascripts/d3/plugins/geo/projection/hammer-retroazimuthal.js +75 -0
  52. data/vendor/assets/javascripts/d3/plugins/geo/projection/hammer.js +51 -0
  53. data/vendor/assets/javascripts/d3/plugins/geo/projection/hatano.js +25 -0
  54. data/vendor/assets/javascripts/d3/plugins/geo/projection/healpix.js +64 -0
  55. data/vendor/assets/javascripts/d3/plugins/geo/projection/hill.js +64 -0
  56. data/vendor/assets/javascripts/d3/plugins/geo/projection/homolosine.js +17 -0
  57. data/vendor/assets/javascripts/d3/plugins/geo/projection/interrupt.js +111 -0
  58. data/vendor/assets/javascripts/d3/plugins/geo/projection/kavrayskiy7.js +15 -0
  59. data/vendor/assets/javascripts/d3/plugins/geo/projection/lagrange.js +27 -0
  60. data/vendor/assets/javascripts/d3/plugins/geo/projection/larrivee.js +39 -0
  61. data/vendor/assets/javascripts/d3/plugins/geo/projection/laskowski.js +31 -0
  62. data/vendor/assets/javascripts/d3/plugins/geo/projection/littrow.js +21 -0
  63. data/vendor/assets/javascripts/d3/plugins/geo/projection/loximuthal.js +29 -0
  64. data/vendor/assets/javascripts/d3/plugins/geo/projection/miller.js +15 -0
  65. data/vendor/assets/javascripts/d3/plugins/geo/projection/mollweide.js +35 -0
  66. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-parabolic.js +21 -0
  67. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-quartic.js +23 -0
  68. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-sinusoidal.js +25 -0
  69. data/vendor/assets/javascripts/d3/plugins/geo/projection/natural-earth.js +22 -0
  70. data/vendor/assets/javascripts/d3/plugins/geo/projection/nell-hammer.js +20 -0
  71. data/vendor/assets/javascripts/d3/plugins/geo/projection/parallel1.js +12 -0
  72. data/vendor/assets/javascripts/d3/plugins/geo/projection/parallel2.js +13 -0
  73. data/vendor/assets/javascripts/d3/plugins/geo/projection/peirce-quincuncial.js +14 -0
  74. data/vendor/assets/javascripts/d3/plugins/geo/projection/polyconic.js +25 -0
  75. data/vendor/assets/javascripts/d3/plugins/geo/projection/projection.js +29 -0
  76. data/vendor/assets/javascripts/d3/plugins/geo/projection/robinson.js +83 -0
  77. data/vendor/assets/javascripts/d3/plugins/geo/projection/satellite.js +68 -0
  78. data/vendor/assets/javascripts/d3/plugins/geo/projection/sinu-mollweide.js +19 -0
  79. data/vendor/assets/javascripts/d3/plugins/geo/projection/sinusoidal.js +15 -0
  80. data/vendor/assets/javascripts/d3/plugins/geo/projection/start.js +1 -0
  81. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/aitoff-test.js +26 -0
  82. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/armadillo-test.js +28 -0
  83. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/baker-test.js +26 -0
  84. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/boggs-test.js +26 -0
  85. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/bonne-test.js +45 -0
  86. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/craig-test.js +25 -0
  87. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/craster-test.js +25 -0
  88. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/env.js +32 -0
  89. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/equirectangular-test.js +97 -0
  90. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hammer-test.js +29 -0
  91. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hatano-test.js +25 -0
  92. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hill-test.js +26 -0
  93. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/larrivee-test.js +25 -0
  94. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/laskowski-test.js +26 -0
  95. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/littrow-test.js +24 -0
  96. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/loximuthal-test.js +25 -0
  97. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mollweide-test.js +26 -0
  98. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-parabolic-test.js +25 -0
  99. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-quartic-test.js +25 -0
  100. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-sinusoidal-test.js +25 -0
  101. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/natural-earth-test.js +26 -0
  102. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/quartic-authalic-test.js +0 -0
  103. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/robinson-test.js +26 -0
  104. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/wagner6-test.js +25 -0
  105. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/winkel3-test.js +26 -0
  106. data/vendor/assets/javascripts/d3/plugins/geo/projection/van-der-grinten.js +41 -0
  107. data/vendor/assets/javascripts/d3/plugins/geo/projection/van-der-grinten4.js +22 -0
  108. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner4.js +9 -0
  109. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner6.js +15 -0
  110. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner7.js +22 -0
  111. data/vendor/assets/javascripts/d3/plugins/geo/projection/wiechel.js +14 -0
  112. data/vendor/assets/javascripts/d3/plugins/geo/projection/winkel3.js +40 -0
  113. data/vendor/assets/javascripts/d3/plugins/geo/tile/README.md +6 -0
  114. data/vendor/assets/javascripts/d3/plugins/geo/tile/tile.js +53 -0
  115. data/vendor/assets/javascripts/d3/plugins/geodesic/README.md +3 -0
  116. data/vendor/assets/javascripts/d3/plugins/geodesic/geodesic.js +130 -0
  117. data/vendor/assets/javascripts/d3/plugins/geom/contour/README.md +5 -0
  118. data/vendor/assets/javascripts/d3/plugins/geom/contour/contour.js +72 -0
  119. data/vendor/assets/javascripts/d3/plugins/graph/README.md +148 -0
  120. data/vendor/assets/javascripts/d3/plugins/graph/data/cities-matrix.json +37 -0
  121. data/vendor/assets/javascripts/d3/plugins/graph/data/cities.csv +36 -0
  122. data/vendor/assets/javascripts/d3/plugins/graph/data/miserables.json +338 -0
  123. data/vendor/assets/javascripts/d3/plugins/graph/graph.js +161 -0
  124. data/vendor/assets/javascripts/d3/plugins/graph/index.html +37 -0
  125. data/vendor/assets/javascripts/d3/plugins/hexbin/README.md +58 -0
  126. data/vendor/assets/javascripts/d3/plugins/hexbin/hexbin.js +96 -0
  127. data/vendor/assets/javascripts/d3/plugins/hive/README.md +5 -0
  128. data/vendor/assets/javascripts/d3/plugins/hive/hive.js +80 -0
  129. data/vendor/assets/javascripts/d3/plugins/horizon/README.md +11 -0
  130. data/vendor/assets/javascripts/d3/plugins/horizon/horizon.js +192 -0
  131. data/vendor/assets/javascripts/d3/plugins/interpolate-zoom/README.md +11 -0
  132. data/vendor/assets/javascripts/d3/plugins/interpolate-zoom/interpolate-zoom.js +75 -0
  133. data/vendor/assets/javascripts/d3/plugins/jsonp/README.md +26 -0
  134. data/vendor/assets/javascripts/d3/plugins/jsonp/jsonp.js +25 -0
  135. data/vendor/assets/javascripts/d3/plugins/keybinding/README.md +17 -0
  136. data/vendor/assets/javascripts/d3/plugins/keybinding/keybinding.js +120 -0
  137. data/vendor/assets/javascripts/d3/plugins/longscroll/README.md +10 -0
  138. data/vendor/assets/javascripts/d3/plugins/longscroll/longscroll.js +75 -0
  139. data/vendor/assets/javascripts/d3/plugins/package.json +20 -0
  140. data/vendor/assets/javascripts/d3/plugins/qq/README.md +3 -0
  141. data/vendor/assets/javascripts/d3/plugins/qq/qq.js +249 -0
  142. data/vendor/assets/javascripts/d3/plugins/rollup/README.md +5 -0
  143. data/vendor/assets/javascripts/d3/plugins/rollup/rollup.js +131 -0
  144. data/vendor/assets/javascripts/d3/plugins/sankey/README.md +17 -0
  145. data/vendor/assets/javascripts/d3/plugins/sankey/sankey.js +292 -0
  146. data/vendor/assets/javascripts/d3/plugins/simplify/README.md +6 -0
  147. data/vendor/assets/javascripts/d3/plugins/simplify/simplify-test.js +193 -0
  148. data/vendor/assets/javascripts/d3/plugins/simplify/simplify.js +446 -0
  149. data/vendor/assets/javascripts/d3/plugins/superformula/superformula.js +98 -0
  150. data/vendor/assets/javascripts/d3/plugins/urlencode/urlencode-test.js +68 -0
  151. data/vendor/assets/javascripts/d3/plugins/urlencode/urlencode.js +37 -0
  152. metadata +218 -0
@@ -0,0 +1,14 @@
1
+ function wiechel(λ, φ) {
2
+ var cosφ = Math.cos(φ),
3
+ sinφ = Math.cos(λ) * cosφ,
4
+ sin1_φ = 1 - sinφ,
5
+ cosλ = Math.cos(λ = Math.atan2(Math.sin(λ) * cosφ, -Math.sin(φ))),
6
+ sinλ = Math.sin(λ);
7
+ cosφ = asqrt(1 - sinφ * sinφ);
8
+ return [
9
+ sinλ * cosφ - cosλ * sin1_φ,
10
+ -cosλ * cosφ - sinλ * sin1_φ
11
+ ];
12
+ }
13
+
14
+ (d3.geo.wiechel = function() { return projection(wiechel); }).raw = wiechel;
@@ -0,0 +1,40 @@
1
+ // @import aitoff
2
+
3
+ function winkel3(λ, φ) {
4
+ var coordinates = aitoff(λ, φ);
5
+ return [
6
+ (coordinates[0] + λ * 2 / π) / 2,
7
+ (coordinates[1] + φ) / 2
8
+ ];
9
+ }
10
+
11
+ winkel3.invert = function(x, y) {
12
+ var λ = x, φ = y, i = 25;
13
+ do {
14
+ var cosφ = Math.cos(φ),
15
+ sinφ = Math.sin(φ),
16
+ sin_2φ = Math.sin(2 * φ),
17
+ sin2φ = sinφ * sinφ,
18
+ cos2φ = cosφ * cosφ,
19
+ sinλ = Math.sin(λ),
20
+ cosλ_2 = Math.cos(λ / 2),
21
+ sinλ_2 = Math.sin(λ / 2),
22
+ sin2λ_2 = sinλ_2 * sinλ_2,
23
+ C = 1 - cos2φ * cosλ_2 * cosλ_2,
24
+ E = C ? acos(cosφ * cosλ_2) * Math.sqrt(F = 1 / C) : F = 0,
25
+ F,
26
+ fx = .5 * (2 * E * cosφ * sinλ_2 + λ * 2 / π) - x,
27
+ fy = .5 * (E * sinφ + φ) - y,
28
+ δxδλ = .5 * F * (cos2φ * sin2λ_2 + E * cosφ * cosλ_2 * sin2φ) + .5 * 2 / π,
29
+ δxδφ = F * (sinλ * sin_2φ / 4 - E * sinφ * sinλ_2),
30
+ δyδλ = .125 * F * (sin_2φ * sinλ_2 - E * sinφ * cos2φ * sinλ),
31
+ δyδφ = .5 * F * (sin2φ * cosλ_2 + E * sin2λ_2 * cosφ) + .5,
32
+ denominator = δxδφ * δyδλ - δyδφ * δxδλ,
33
+ δλ = (fy * δxδφ - fx * δyδφ) / denominator,
34
+ δφ = (fx * δyδλ - fy * δxδλ) / denominator;
35
+ λ -= δλ, φ -= δφ;
36
+ } while ((Math.abs(δλ) > ε || Math.abs(δφ) > ε) && --i > 0);
37
+ return [λ, φ];
38
+ };
39
+
40
+ (d3.geo.winkel3 = function() { return projection(winkel3); }).raw = winkel3;
@@ -0,0 +1,6 @@
1
+ # Zoomable Tiles
2
+
3
+ * Panning & Zooming Demo: <http://bl.ocks.org/4132797>
4
+ * Clipping Demo: <http://bl.ocks.org/4150951>
5
+
6
+ A layout for determining which 256x256 quadtree tiles to display in a rectangular viewport, based on a scale and translate. This layout can be used to create a simple slippy map, or render standard map tiles (e.g., MapBox, CloudMade) as a base layer behind a geographic projection.
@@ -0,0 +1,53 @@
1
+ d3.geo.tile = function() {
2
+ var size = [960, 500],
3
+ scale = 256,
4
+ translate = [size[0] / 2, size[1] / 2],
5
+ zoomDelta = 0;
6
+
7
+ function tile() {
8
+ var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
9
+ z0 = Math.round(z + zoomDelta),
10
+ k = Math.pow(2, z - z0 + 8),
11
+ origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
12
+ tiles = [],
13
+ cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
14
+ rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
15
+
16
+ rows.forEach(function(y) {
17
+ cols.forEach(function(x) {
18
+ tiles.push([x, y, z0]);
19
+ });
20
+ });
21
+
22
+ tiles.translate = origin;
23
+ tiles.scale = k;
24
+
25
+ return tiles;
26
+ }
27
+
28
+ tile.size = function(_) {
29
+ if (!arguments.length) return size;
30
+ size = _;
31
+ return tile;
32
+ };
33
+
34
+ tile.scale = function(_) {
35
+ if (!arguments.length) return scale;
36
+ scale = _;
37
+ return tile;
38
+ };
39
+
40
+ tile.translate = function(_) {
41
+ if (!arguments.length) return translate;
42
+ translate = _;
43
+ return tile;
44
+ };
45
+
46
+ tile.zoomDelta = function(_) {
47
+ if (!arguments.length) return zoomDelta;
48
+ zoomDelta = +_;
49
+ return tile;
50
+ };
51
+
52
+ return tile;
53
+ };
@@ -0,0 +1,3 @@
1
+ # Geodesic Grid
2
+
3
+ Example: <http://bl.ocks.org/3057239>
@@ -0,0 +1,130 @@
1
+ (function() {
2
+ var φ = 1.618033988749895,
3
+ ρ = 180 / Math.PI;
4
+
5
+ var vertices = [
6
+ [1,φ,0], [-1,φ,0], [1,-φ,0], [-1,-φ,0],
7
+ [0,1,φ], [0,-1,φ], [0,1,-φ], [0,-1,-φ],
8
+ [φ,0,1], [-φ,0,1], [φ,0,-1], [-φ,0,-1]
9
+ ];
10
+
11
+ var faces = [
12
+ [0,1,4], [1,9,4], [4,9,5], [5,9,3], [2,3,7],
13
+ [3,2,5], [7,10,2], [0,8,10], [0,4,8], [8,2,10],
14
+ [8,4,5], [8,5,2], [1,0,6], [11,1,6], [3,9,11],
15
+ [6,10,7], [3,11,7], [11,6,7], [6,0,10], [9,1,11]
16
+ ].map(function(face) {
17
+ return face.map(function(i) {
18
+ return vertices[i];
19
+ });
20
+ });
21
+
22
+ d3.geodesic = {
23
+ multipolygon: function(n) {
24
+ return {
25
+ type: "MultiPolygon",
26
+ coordinates: subdivideFaces(~~n).map(function(face) {
27
+ face = face.map(project);
28
+ face.push(face[0]);
29
+ return [face];
30
+ })
31
+ };
32
+ },
33
+ polygons: function(n) {
34
+ return d3.geodesic.multipolygon(~~n).coordinates.map(function(face) {
35
+ return {type: "Polygon", coordinates: face};
36
+ });
37
+ },
38
+ multilinestring: function(n) {
39
+ return {
40
+ type: "MultiLineString",
41
+ coordinates: subdivideEdges(~~n).map(function(edge) {
42
+ return edge.map(project);
43
+ })
44
+ };
45
+ }
46
+ };
47
+
48
+ function subdivideFaces(n) {
49
+ return d3.merge(faces.map(function(face) {
50
+ var i01 = interpolate(face[0], face[1]),
51
+ i02 = interpolate(face[0], face[2]),
52
+ faces = [];
53
+
54
+ faces.push([
55
+ face[0],
56
+ i01(1 / n),
57
+ i02(1 / n)
58
+ ]);
59
+
60
+ for (var i = 1; i < n; ++i) {
61
+ var i1 = interpolate(i01(i / n), i02(i / n)),
62
+ i2 = interpolate(i01((i + 1) / n), i02((i + 1) / n));
63
+ for (var j = 0; j <= i; ++j) {
64
+ faces.push([
65
+ i1(j / i),
66
+ i2(j / (i + 1)),
67
+ i2((j + 1) / (i + 1))
68
+ ]);
69
+ }
70
+ for (var j = 0; j < i; ++j) {
71
+ faces.push([
72
+ i1(j / i),
73
+ i1((j + 1) / i),
74
+ i2((j + 1) / (i + 1))
75
+ ]);
76
+ }
77
+ }
78
+
79
+ return faces;
80
+ }));
81
+ }
82
+
83
+ function subdivideEdges(n) {
84
+ var edges = {};
85
+
86
+ subdivideFaces(n).forEach(function(face) {
87
+ add(face[0], face[1]);
88
+ add(face[1], face[2]);
89
+ add(face[2], face[0]);
90
+ });
91
+
92
+ function add(p0, p1) {
93
+ var t;
94
+ if (p0[0] < p1[0] || (p0[0] == p1[0] && (p0[1] < p1[1] || (p0[1] == p1[1] && p0[2] < p1[2])))) t = p0, p0 = p1, p1 = t;
95
+ edges[p0.map(round) + " " + p1.map(round)] = [p0, p1];
96
+ }
97
+
98
+ function round(d) {
99
+ return d3.round(d, 4);
100
+ }
101
+
102
+ return d3.values(edges);
103
+ }
104
+
105
+ function interpolate(p0, p1) {
106
+ var x0 = p0[0],
107
+ y0 = p0[1],
108
+ z0 = p0[2],
109
+ x1 = p1[0] - x0,
110
+ y1 = p1[1] - y0,
111
+ z1 = p1[2] - z0;
112
+ return function(t) {
113
+ return [
114
+ x0 + t * x1,
115
+ y0 + t * y1,
116
+ z0 + t * z1
117
+ ];
118
+ };
119
+ }
120
+
121
+ function project(p) {
122
+ var x = p[0],
123
+ y = p[1],
124
+ z = p[2];
125
+ return [
126
+ Math.atan2(y, x) * ρ,
127
+ Math.acos(z / Math.sqrt(x * x + y * y + z * z)) * ρ - 90
128
+ ];
129
+ }
130
+ })();
@@ -0,0 +1,5 @@
1
+ # Contour Plots
2
+
3
+ Demo: <http://bl.ocks.org/4241134>
4
+
5
+ Computes a contour for a given *grid function* using the [marching squares](http://en.wikipedia.org/wiki/Marching_squares) algorithm. Returns the contour polygon as an array of points. The grid function takes two arguments, *x* and *y*, and returns true if the specified point is inside the contour, and false for points outside the contour. The contour plugin can also take an optional starting point [x, y] on the grid.
@@ -0,0 +1,72 @@
1
+ (function() {
2
+
3
+ d3.geom.contour = function(grid, start) {
4
+ var s = start || d3_geom_contourStart(grid), // starting point
5
+ c = [], // contour polygon
6
+ x = s[0], // current x position
7
+ y = s[1], // current y position
8
+ dx = 0, // next x direction
9
+ dy = 0, // next y direction
10
+ pdx = NaN, // previous x direction
11
+ pdy = NaN, // previous y direction
12
+ i = 0;
13
+
14
+ do {
15
+ // determine marching squares index
16
+ i = 0;
17
+ if (grid(x-1, y-1)) i += 1;
18
+ if (grid(x, y-1)) i += 2;
19
+ if (grid(x-1, y )) i += 4;
20
+ if (grid(x, y )) i += 8;
21
+
22
+ // determine next direction
23
+ if (i === 6) {
24
+ dx = pdy === -1 ? -1 : 1;
25
+ dy = 0;
26
+ } else if (i === 9) {
27
+ dx = 0;
28
+ dy = pdx === 1 ? -1 : 1;
29
+ } else {
30
+ dx = d3_geom_contourDx[i];
31
+ dy = d3_geom_contourDy[i];
32
+ }
33
+
34
+ // update contour polygon
35
+ if (dx != pdx && dy != pdy) {
36
+ c.push([x, y]);
37
+ pdx = dx;
38
+ pdy = dy;
39
+ }
40
+
41
+ x += dx;
42
+ y += dy;
43
+ } while (s[0] != x || s[1] != y);
44
+
45
+ return c;
46
+ };
47
+
48
+ // lookup tables for marching directions
49
+ var d3_geom_contourDx = [1, 0, 1, 1,-1, 0,-1, 1,0, 0,0,0,-1, 0,-1,NaN],
50
+ d3_geom_contourDy = [0,-1, 0, 0, 0,-1, 0, 0,1,-1,1,1, 0,-1, 0,NaN];
51
+
52
+ function d3_geom_contourStart(grid) {
53
+ var x = 0,
54
+ y = 0;
55
+
56
+ // search for a starting point; begin at origin
57
+ // and proceed along outward-expanding diagonals
58
+ while (true) {
59
+ if (grid(x,y)) {
60
+ return [x,y];
61
+ }
62
+ if (x === 0) {
63
+ x = y + 1;
64
+ y = 0;
65
+ } else {
66
+ x = x - 1;
67
+ y = y + 1;
68
+ }
69
+ }
70
+ }
71
+
72
+ })();
@@ -0,0 +1,148 @@
1
+ # d3.graph
2
+
3
+ A plugin for manipulating [graph data structures](http://opendatastructures.org/ods-cpp/12_Graphs.html). This plugin is unstable and in development.
4
+
5
+ ## Todo
6
+
7
+ * link nodes by name. see this [discussion on the force layout](https://groups.google.com/forum/?fromgroups#!topic/d3-js/LWuhBeEipz4)
8
+
9
+ * adjacency list
10
+ * graph traversal
11
+ * hypergraph
12
+
13
+ ## Matrix
14
+
15
+ Create a matrix
16
+
17
+ ```js
18
+ var matrix = d3.graph.matrix([
19
+ [1,1,0],
20
+ [0,0,0],
21
+ [2,1,1]
22
+ ]);
23
+ ```
24
+
25
+ Get an edge value
26
+
27
+ ```js
28
+ matrix(i,j)
29
+ ```
30
+
31
+ Check if edge exists (non-zero)
32
+
33
+ ```js
34
+ matrix.has(i,j)
35
+ ```
36
+
37
+ Set an edge value
38
+
39
+ ```js
40
+ matrix.set(i,j,value)
41
+ ```
42
+
43
+ Remove an edge
44
+
45
+ ```js
46
+ matrix.remove(i,j)
47
+ ```
48
+
49
+ Get outgoing edge indices
50
+
51
+ ```js
52
+ matrix.outE(i)
53
+ ```
54
+
55
+ Get incoming edge indices
56
+
57
+ ```js
58
+ matrix.inE(i)
59
+ ```
60
+
61
+ ### todo
62
+
63
+ * documentation
64
+ * changing size
65
+
66
+ ## Basics
67
+
68
+ Convert [matrix](http://en.wikipedia.org/wiki/Adjacency_matrix) to [list](http://opendatastructures.org/ods-cpp/12_2_Graph_as_Collection_Li.html)
69
+
70
+ ```js
71
+ d3.graph.matrixToList([
72
+ [0,1,0],
73
+ [1,0,0],
74
+ [1,1,1]
75
+ ])
76
+ /*
77
+ [
78
+ {"source":0,"target":0,"value":0},{"source":0,"target":1,"value":1},{"source":0,"target":2,"value":0},
79
+ {"source":1,"target":0,"value":1},{"source":1,"target":1,"value":0},{"source":1,"target":2,"value":0},
80
+ {"source":2,"target":0,"value":1},{"source":2,"target":1,"value":1},{"source":2,"target":2,"value":1}
81
+ ]
82
+ */
83
+ ```
84
+
85
+ Convert list to matrix
86
+
87
+ ```js
88
+ d3.graph.listToMatrix([
89
+ {"source":0,"target":1,"value":1},
90
+ {"source":1,"target":0,"value":1},
91
+ {"source":2,"target":0,"value":1},
92
+ {"source":2,"target":1,"value":1},
93
+ {"source":2,"target":2,"value":1}
94
+ ])
95
+ /*
96
+ [0,1,0],
97
+ [1,0,0],
98
+ [1,1,1]
99
+ */
100
+ ```
101
+
102
+ ## Stateful Use
103
+
104
+ ```js
105
+ var graph = d3.graph();
106
+ ```
107
+
108
+ Load a matrix
109
+
110
+ ```js
111
+ graph.matrix([
112
+ [0,1,0],
113
+ [1,0,0],
114
+ [1,1,1]
115
+ ]);
116
+ ```
117
+
118
+ Get the graph as list of links
119
+
120
+ ```js
121
+ graph.links();
122
+ ```
123
+
124
+ Get the graph as matrix
125
+
126
+ ```js
127
+ graph.matrix();
128
+ ```
129
+
130
+ Nodes and links can be modified by passing in a value. This will overwrite existing data.
131
+
132
+ ```js
133
+ graph.nodes(['red', 'purple', 'orange']);
134
+ graph.links([{"source":0,"target":0,"value":0},{"source":0,"target":1,"value":1},{"source":0,"target":2,"value":0}]);
135
+ ```
136
+
137
+ Get a description of the graph
138
+
139
+ ```js
140
+ graph.description();
141
+ // "d3.graph with 3 nodes and 9 links"
142
+ ```
143
+
144
+ Basic node filters. These currently filter the original node set, so subsequent filters won't stack. See [Gremlin](https://github.com/tinkerpop/gremlin/wiki/Basic-Graph-Traversals).
145
+
146
+ ```js
147
+ graph.traverse().filter(function(d) { return d.indexOf('urp') > -1 }).value();
148
+ ```