"use strict"; function showEPForRoute(node) { const points = []; debug.select("#controlPoints").selectAll("circle").each(function() { const i = findCell(this.getAttribute("cx"), this.getAttribute("cy")); points.push(i); }); const routeLen = node.getTotalLength() * distanceScaleInput.value; showElevationProfile(points, routeLen, false); } function showEPForRiver(node) { const points = []; debug.select("#controlPoints").selectAll("circle").each(function() { const i = findCell(this.getAttribute("cx"), this.getAttribute("cy")); points.push(i); }); const riverLen = (node.getTotalLength() / 2) * distanceScaleInput.value; showElevationProfile(points, riverLen, true); } function closeElevationProfile() { modules.elevation = false; } function showElevationProfile(data, routeLen, isRiver) { // data is an array of cell indexes, routeLen is the distance (in actual metres/feet), isRiver should be true for rivers, false otherwise document.getElementById("epScaleRange").addEventListener("change", draw); document.getElementById("epCurve").addEventListener("change", draw); $("#elevationProfile").dialog({ title: "Elevation profile", resizable: false, width: window.width, close: closeElevationProfile, position: {my: "left top", at: "left+20 bottom-500", of: window, collision: "fit"} }); // prevent river graphs from showing rivers as flowing uphill - remember the general slope var slope = 0; if (isRiver) { if (pack.cells.h[data[0]] < pack.cells.h[data[data.length-1]]) { slope = 1; // up-hill } else if (pack.cells.h[data[0]] > pack.cells.h[data[data.length-1]]) { slope = -1; // down-hill } } const chartWidth = window.innerWidth-280; const chartHeight = 200; // height of our land/sea profile, excluding the biomes data below const xOffset = 160; const yOffset = 140; // this is our drawing starting point from top-left (y = 0) of SVG const biomesHeight = 40; let chartData = {biome:[], burg:[], cell:[], height:[], mi:1000000, ma:0, points:[] } for (let i=0, prevB=0, prevH=-1; i prevH) h = prevH; } } prevH = h; // river up-hill checks stop here let b = pack.cells.burg[cell]; if (b == prevB) b = 0; else prevB = b; chartData.biome[i] = pack.cells.biome[cell]; chartData.burg[i] = b; chartData.cell[i] = cell; let sh = getHeight(h); chartData.height[i] = parseInt(sh.substr(0, sh.indexOf(' '))); chartData.mi = Math.min(chartData.mi, chartData.height[i]); chartData.ma = Math.max(chartData.ma, chartData.height[i]); } draw(); function draw() { chartData.points = []; let heightScale = 100 / parseInt(epScaleRange.value); heightScale *= 0.90; // curves cause the heights to go slightly higher, adjust here const xscale = d3.scaleLinear().domain([0, data.length]).range([0, chartWidth]); const yscale = d3.scaleLinear().domain([0, (chartData.ma-chartData.mi) * heightScale]).range([chartHeight, 0]); for (let i=0; i 0) { let b = chartData.burg[k]; var x1 = chartData.points[k][0]; y1+=add; if (y1 >= yOffset) { y1 = add; } var d1 = 0; // burg name g.append("text").attr("id", "ep" + b).attr("class", "epburglabel").attr("x", x1).attr("y", y1).attr("text-anchor", "middle"); document.getElementById("ep" + b).innerHTML = pack.burgs[b].name; // arrow from burg name to graph line g.append("path").attr("id", "eparrow" + b).attr("d", "M" + x1.toString() + "," + (y1+3).toString() + "L" + x1.toString() + "," + parseInt(chartData.points[k][1]-3).toString()).attr("stroke", "darkgray").attr("fill", "lightgray").attr("stroke-width", "1").attr("marker-end", "url(#arrowhead)"); } } } }