A corporation manager and dashboard for EVE Online
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

111 lines
3.7 KiB

  1. var get_bounds = function(galaxy) {
  2. var xmin = Infinity, xmax = -Infinity,
  3. ymin = Infinity, ymax = -Infinity;
  4. for (var sid in galaxy) {
  5. var system = galaxy[sid];
  6. var x = system["coords"][0];
  7. var y = system["coords"][2];
  8. if (x < xmin) xmin = x;
  9. if (x > xmax) xmax = x;
  10. if (y < ymin) ymin = y;
  11. if (y > ymax) ymax = y;
  12. }
  13. var xspan = xmax - xmin;
  14. var yspan = ymax - ymin;
  15. return [xmin, ymin, xspan, yspan];
  16. }
  17. $(function() {
  18. $("#map .preload").append($("<p>").text("Loading map data..."));
  19. $.getJSON( "map/data.json", data => {
  20. var galaxy = data["galaxy"];
  21. var systems = Object.values(galaxy);
  22. var jumps = [].concat
  23. .apply([], Object.keys(galaxy)
  24. .map(src => galaxy[src]["gates"]
  25. .map(dst => [parseInt(src), dst])))
  26. .filter(pair => pair[0] < pair[1]);
  27. var [xmin, ymin, xspan, yspan] = get_bounds(galaxy);
  28. var scale = 1000;
  29. var radius = scale / 2;
  30. var projx = x => ((x - xmin) / xspan - 0.5) * (scale * 0.99);
  31. var projy = y => -((y - ymin) / yspan - 0.5) * (scale * 0.99);
  32. $("#container > div").addClass("map-1");
  33. $("main").addClass("map-2");
  34. $("#map").addClass("map-3");
  35. $("#map .preload").remove();
  36. $("#map .controls").show();
  37. var svg = d3.select("#map").append("svg")
  38. .attr("viewBox", (-radius) + " " + (-radius) +
  39. " " + scale + " " + scale);
  40. var stars = svg.append("g");
  41. stars.selectAll("line")
  42. .data(jumps)
  43. .enter()
  44. .append("line")
  45. .attr("x1", d => projx(galaxy[d[0]]["coords"][0]))
  46. .attr("y1", d => projy(galaxy[d[0]]["coords"][2]))
  47. .attr("x2", d => projx(galaxy[d[1]]["coords"][0]))
  48. .attr("y2", d => projy(galaxy[d[1]]["coords"][2]))
  49. .attr("class", "jump")
  50. .style("stroke-width", 1);
  51. stars.selectAll("circle")
  52. .data(systems)
  53. .enter()
  54. .append("circle")
  55. .attr("cx", d => projx(d["coords"][0]))
  56. .attr("cy", d => projy(d["coords"][2]))
  57. .attr("r", 2)
  58. .attr("class", d => {
  59. var sec = d["security"];
  60. var klass = sec < 0.05 ? "null" :
  61. Number(sec).toFixed(1).replace(".", "_");
  62. return "system sec-" + klass;
  63. });
  64. var lastk = 1;
  65. var zoom = d3.zoom()
  66. .extent([[-radius, -radius], [radius, radius]])
  67. .scaleExtent([1, 63])
  68. .on("zoom", () => {
  69. var trans = d3.event.transform;
  70. var clamp = radius * (trans.k - 1);
  71. trans.x = Math.max(Math.min(trans.x, clamp), -clamp);
  72. trans.y = Math.max(Math.min(trans.y, clamp), -clamp);
  73. stars.attr("transform", trans);
  74. if (trans.k != lastk) {
  75. stars.selectAll("circle")
  76. .attr("r", 6 / (trans.k + 2));
  77. stars.selectAll("line")
  78. .style("stroke-width", 2 / (trans.k + 1));
  79. $("#map-scale").val(Math.log2(trans.k + 1));
  80. lastk = trans.k;
  81. }
  82. });
  83. svg.call(zoom);
  84. $("#map-scale").on("input", e => {
  85. var k = Math.pow(2, e.target.value) - 1;
  86. zoom.scaleTo(svg, k);
  87. })
  88. $(window).resize(() => {
  89. svg.style("display", "none")
  90. .attr("width", $("#map").width())
  91. .attr("height", $("#map").height())
  92. .style("display", "");
  93. });
  94. $(window).resize();
  95. });
  96. });