script.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. window.onload = function () {
  2. var editor = CodeMirror(document.getElementById('editor'), {
  3. value: '[\n' +
  4. ' [1, 1, 1, 1, 1, 1, 1],\n' +
  5. ' [1, 5, 5, 5, 5, 5, 1],\n' +
  6. ' [1, 5, 15, 15, 15, 5, 1],\n' +
  7. ' [1, 5, 10, 10, 10, 5, 1],\n' +
  8. ' [1, 5, 5, 5, 5, 5, 1],\n' +
  9. ' [1, 1, 1, 1, 1, 1, 1]\n' +
  10. ']',
  11. mode: "javascript",
  12. styleActiveLine: true,
  13. matchBrackets: true,
  14. lineNumbers: true,
  15. });
  16. var output = CodeMirror(document.getElementById('output'), {
  17. styleActiveLine: true,
  18. matchBrackets: true,
  19. readOnly: true,
  20. });
  21. var intervalsInput = document.getElementById('intervals');
  22. var getIntervals = function () {
  23. var content = intervalsInput.value;
  24. var intervals;
  25. try {
  26. intervals = JSON.parse('[' + content + ']');
  27. } catch (e) {
  28. intervals = [];
  29. }
  30. return intervals;
  31. };
  32. var boundaries = function (data) {
  33. return {
  34. xs: d3.range(0, data[0].length),
  35. ys: d3.range(0, data.length)
  36. };
  37. };
  38. var changeIntervals = function (e) {
  39. try {
  40. var intervals = JSON.parse('[' + e.target.value + ']');
  41. } catch (e) {
  42. output.doc.setValue('Invalid intervals.');
  43. return;
  44. }
  45. try {
  46. var data = JSON.parse(editor.doc.getValue());
  47. } catch (e) {
  48. output.doc.setValue('Invalid intervals.');
  49. return;
  50. }
  51. run(data, intervals);
  52. };
  53. var processData = function (editor) {
  54. var intervals = getIntervals();
  55. try {
  56. var data = JSON.parse(editor.doc.getValue());
  57. } catch (e) {
  58. output.doc.setValue(e.message);
  59. return;
  60. }
  61. run(data, intervals);
  62. };
  63. var run = function (data, intervals) {
  64. if (!data) return;
  65. var bandWidths = intervals.reduce(function (bw, upperBand, i, intervals) {
  66. if (i > 0) {
  67. var lowerBand = intervals[i - 1];
  68. bw.push(upperBand - lowerBand);
  69. }
  70. return bw;
  71. }, []);
  72. try {
  73. var bands = MarchingSquaresJS
  74. .isoBands(data, intervals.slice(0, -1), bandWidths,);
  75. } catch (e) {
  76. output.doc.setValue(e.message);
  77. return;
  78. }
  79. output.doc.setValue(JSON.stringify(bands, undefined, 2));
  80. var isoBandObjects = bands.map(function (band, i) {
  81. return {
  82. "coords": band,
  83. "level": i,
  84. "val": intervals[i]
  85. };
  86. });
  87. document.getElementById('isobands').innerText = '';
  88. drawLines('#isobands', isoBandObjects, intervals, boundaries(data));
  89. };
  90. editor.on('change', processData);
  91. intervalsInput.addEventListener('keyup', changeIntervals);
  92. processData(editor);
  93. };