index.html 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>IsoBands example</title>
  6. <script src="https://d3js.org/d3.v3.min.js"></script>
  7. <script src="../../dist/marchingsquares.js"></script>
  8. <style>
  9. div.tooltip {
  10. position: absolute;
  11. text-align: center;
  12. padding: 5px;
  13. font: 12px sans-serif;
  14. background: #ededee;
  15. border: 0px;
  16. border-radius: 8px;
  17. pointer-events: none;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div id="vienna"></div>
  23. <script src="vienna_data.js"></script>
  24. <script>
  25. var useQuadTree = true;
  26. var intervals = []
  27. var bandWidths = []
  28. var intervals_lines = []
  29. var intervals_lines2 = []
  30. var isoBands = [];
  31. var isoLines = [];
  32. var isoLines2 = [];
  33. for (var i = 0; i < 256; i+=8) {
  34. intervals.push(i);
  35. bandWidths.push(8);
  36. }
  37. for (var i = 16; i < 256; i+=16)
  38. intervals_lines.push(i);
  39. for (var i = 8; i < 256; i+=16)
  40. intervals_lines2.push(i);
  41. data = d3.transpose(vienna_basin);
  42. var xs = d3.range(0, data[0].length);
  43. var ys = d3.range(0, data.length);
  44. var prepData = data;
  45. /* pre-process data to speed up multiple calls to isoBands/isoLines */
  46. if (useQuadTree)
  47. prepData = new MarchingSquaresJS.QuadTree(data);
  48. /*******************
  49. 1st: iso bands
  50. ********************/
  51. debugger
  52. MarchingSquaresJS
  53. .isoBands(
  54. prepData,
  55. intervals,
  56. bandWidths,
  57. { noQuadTree: !useQuadTree })
  58. .forEach(function(b, i) {
  59. isoBands.push({
  60. "coords": b,
  61. "level": i + 1,
  62. "val": intervals[i] + bandWidths[i]
  63. });
  64. });
  65. /*******************
  66. 2nd: iso lines
  67. ********************/
  68. /* iso line set A */
  69. MarchingSquaresJS
  70. .isoLines(
  71. prepData,
  72. intervals_lines,
  73. { linearRing: false, noQuadTree: !useQuadTree })
  74. .forEach(function(c, i) {
  75. isoLines.push({
  76. "coords": c,
  77. "level": i,
  78. "val": intervals_lines[i]
  79. });
  80. });
  81. /* iso line set B */
  82. MarchingSquaresJS
  83. .isoLines(
  84. prepData,
  85. intervals_lines2,
  86. { linearRing: false, noQuadTree: !useQuadTree })
  87. .forEach(function(c, i) {
  88. isoLines2.push({
  89. "coords": c,
  90. "level": i,
  91. "val": intervals_lines2[i]
  92. });
  93. });
  94. iso_lines_array = [];
  95. iso_lines_array.push({
  96. intervals: intervals_lines2,
  97. coords: isoLines2
  98. },{
  99. intervals: intervals_lines,
  100. coords: isoLines
  101. });
  102. drawLines('#vienna', isoBands, intervals, iso_lines_array);
  103. var div = d3.select("#vienna").append("div")
  104. .attr("class", "tooltip")
  105. .style("opacity", 0);
  106. // helper function
  107. function drawLines(divId, bands, intervals, isolines) {
  108. var marginBottomLabel = 0;
  109. var width = 800;
  110. var height = width * (ys.length / xs.length);
  111. var xScale = d3.scale.linear()
  112. .range([0, width])
  113. .domain([Math.min.apply(null, xs), Math.max.apply(null, xs)]);
  114. var yScale = d3.scale.linear()
  115. .range([0, height])
  116. .domain([Math.min.apply(null, ys), Math.max.apply(null, ys)]);
  117. var colours = d3.scale.linear().domain([intervals[0], intervals[2], intervals[4], intervals[Math.floor(intervals.length / 2)], intervals[intervals.length - 1]])
  118. .range(["blue", "darkgreen", "green", "brown", "grey"]);
  119. var svg = d3.select(divId)
  120. .append("svg")
  121. .attr("width", width)
  122. .attr("height", height + marginBottomLabel);
  123. svg.selectAll("path.bands")
  124. .data(bands)
  125. .enter().append("path")
  126. .style("fill", function (d) {
  127. return colours(d.val);
  128. })
  129. .style("stroke", "none")
  130. .style('opacity', 1.0)
  131. .attr("d", function (d) {
  132. var p = "";
  133. d.coords.forEach(function (aa) {
  134. p += (d3.svg.line()
  135. .x(function (dat) {
  136. return xScale(dat[0]);
  137. })
  138. .y(function (dat) {
  139. return yScale(dat[1]);
  140. })
  141. .interpolate("linear")
  142. )(aa) + "Z";
  143. });
  144. return p;
  145. })
  146. .on('mouseover', function () {
  147. d3.select(this).style('fill', d3.rgb(204, 185, 116));
  148. })
  149. .on('mouseout', function () {
  150. d3.select(this).style('fill', function (d1) {
  151. return colours(d1.val);
  152. })
  153. });
  154. isolines.forEach(function(l, i) {
  155. var intervals = l.intervals;
  156. var lines = l.coords;
  157. svg.selectAll("path.lines_" + i)
  158. .data(lines)
  159. .enter().append("path")
  160. .style("fill", "none")
  161. .style("stroke", "black")
  162. .style("stroke-width", i + 0.5)
  163. .style("stroke-dasharray", i == 0 ? "4,4" : "none")
  164. .style('opacity', 1.0)
  165. .attr("d", function (d) {
  166. var p = "";
  167. d.coords.forEach(function (aa) {
  168. p += (d3.svg.line()
  169. .x(function (dat) {
  170. return xScale(dat[0]);
  171. })
  172. .y(function (dat) {
  173. return yScale(dat[1]);
  174. })
  175. .interpolate("linear")
  176. )(aa);
  177. });
  178. return p;
  179. })
  180. .on('mouseover', function (d) {
  181. div.transition()
  182. .duration(50)
  183. .style("opacity", .97);
  184. div.html("Height: " + d.val + " of 255")
  185. .style("left", (d3.event.pageX) + "px")
  186. .style("top", (d3.event.pageY - 30) + "px");
  187. })
  188. .on('mouseout', function () {
  189. d3.select(this)
  190. .style('stroke', "black")
  191. .style("stroke-width", 1);
  192. div.transition()
  193. .duration(800)
  194. .style("opacity", 0);
  195. });
  196. });
  197. }
  198. </script>
  199. </body>
  200. </html>