render.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const fs = require('fs');
  2. const readline = require('readline');
  3. const MARGIN = 20;
  4. const GRID_STROKE_BASE_LENGTH = 15;
  5. let ISO_FACTOR = 1.85;
  6. const ALTI_FACTOR = 8;
  7. function getPos(px, py, alt) {
  8. let result = [ GRID_STROKE_BASE_LENGTH * px - GRID_STROKE_BASE_LENGTH * py, GRID_STROKE_BASE_LENGTH * (py +px) ];
  9. result[0] *= ISO_FACTOR;
  10. result[1] += ALTI_FACTOR * alt;
  11. return result;
  12. }
  13. function getColor() {
  14. return '#11a5f3';
  15. }
  16. async function main() {
  17. let map = [];
  18. for await (let line of readline.createInterface({ input: process.stdin })) {
  19. map.push(line.split('').map((i, pos) => {
  20. if (i === 'S') i = 'a';
  21. if (i === 'E') i = 'z';
  22. return i.charCodeAt(0) - 'a'.charCodeAt(0);}));
  23. }
  24. lines = [];
  25. for (let i =1; i < map.length; ++i) {
  26. let prev = getPos(0, i -1, map[i -1][0]);
  27. let next = getPos(0, i, map[i][0]);
  28. lines.push([prev[0], prev[1], next[0], next[1], getColor(map[i -1][0]), getColor(map[i][0])]);
  29. }
  30. for (let i =1; i < map[0].length; ++i) {
  31. let prev = getPos(i-1, 0, map[0][i-1]);
  32. let next = getPos(i, 0, map[0][i]);
  33. lines.push([prev[0], prev[1], next[0], next[1], getColor(map[0][i-1]), getColor(map[0][i])]);
  34. }
  35. for (let i =1; i < map.length; ++i) {
  36. for (let j=1; j < map[i].length; ++j) {
  37. let prev = getPos(j-1, i, map[i][j-1]);
  38. let next = getPos(j, i, map[i][j]);
  39. lines.push([prev[0], prev[1], next[0], next[1], getColor(map[i][j-1]), getColor(map[i][j])]);
  40. prev = getPos(j, i -1, map[i -1][j]);
  41. lines.push([prev[0], prev[1], next[0], next[1], getColor(map[i-1][j]), getColor(map[i][j])]);
  42. }
  43. }
  44. let maxX = lines.map(x => Math.max(x[0], x[2])).reduce((a, b) => a ? Math.max(a, b) : b);
  45. let minX = lines.map(x => Math.min(x[0], x[2])).reduce((a, b) => a ? Math.min(a, b) : b);
  46. let maxY = lines.map(x => Math.max(x[1], x[3])).reduce((a, b) => a ? Math.max(a, b) : b);
  47. let minY = lines.map(x => Math.min(x[1], x[3])).reduce((a, b) => a ? Math.min(a, b) : b);
  48. const height = maxY - minY;
  49. let draw = require('svg-builder').width(maxX - minX + 2* MARGIN).height(height + 4* MARGIN);
  50. lines.forEach(l => {
  51. //img.stroke(l[4], 3);
  52. draw.line({
  53. x1: l[0]- minX + MARGIN,
  54. y1: height - (l[1] -minY) + MARGIN,
  55. x2: l[2] - minX + MARGIN,
  56. y2: height - (l[3] -minY) + MARGIN,
  57. stroke: l[4],
  58. 'stroke-width': 3
  59. });
  60. });
  61. draw.render();
  62. console.log(draw.root + draw.elements.join('')+'</svg>');
  63. };
  64. (main());
  65. module.exports = {};