diff --git a/modules/routes-generator.js b/modules/routes-generator.js index dcaac978..9dbd6679 100644 --- a/modules/routes-generator.js +++ b/modules/routes-generator.js @@ -108,8 +108,6 @@ window.Routes = (function () { TIME && console.time("generateSeaRoutes"); const seaRoutes = []; - let skip = false; - for (const [featureId, featurePorts] of Object.entries(portsByFeature)) { const points = featurePorts.map(burg => [burg.x, burg.y]); const urquhartEdges = calculateUrquhartEdges(points); @@ -117,27 +115,6 @@ window.Routes = (function () { urquhartEdges.forEach(([fromId, toId]) => { const start = featurePorts[fromId].cell; const exit = featurePorts[toId].cell; - - if (skip) return; - if (start === 444 && exit === 297) { - // if (segment.join(",") === "124,122,120") debugger; - skip = true; - - for (const con of connections) { - const [from, to] = con[0].split("-").map(Number); - const [x1, y1] = cells.p[from]; - const [x2, y2] = cells.p[to]; - debug - .append("line") - .attr("x1", x1) - .attr("y1", y1) - .attr("x2", x2) - .attr("y2", y2) - .attr("stroke", "red") - .attr("stroke-width", 0.2); - } - } - const segments = findPathSegments({isWater: true, connections, start, exit}); for (const segment of segments) { addConnections(segment, ROUTES.SEA_ROUTE); @@ -195,8 +172,8 @@ window.Routes = (function () { const TYPE_MODIFIERS = { "-1": 1, // coastline "-2": 1.8, // sea - "-3": 3, // open sea - "-4": 5, // ocean + "-3": 4, // open sea + "-4": 6, // ocean default: 8 // far ocean }; @@ -209,8 +186,6 @@ window.Routes = (function () { const queue = new FlatQueue(); queue.push(start, 0); - const isDebug = start === 444 && exit === 297; - return isWater ? findWaterPath() : findLandPath(); function findLandPath() { @@ -219,26 +194,26 @@ window.Routes = (function () { const next = queue.pop(); for (const neibCellId of cells.c[next]) { - if (cells.h[neibCellId] < 20) continue; // ignore water cells + if (neibCellId === exit) { + from[neibCellId] = next; + return from; + } + if (cells.h[neibCellId] < 20) continue; // ignore water cells const habitability = biomesData.habitability[cells.biome[neibCellId]]; if (!habitability) continue; // inhabitable cells are not passable (eg. lava, glacier) const distanceCost = dist2(cells.p[next], cells.p[neibCellId]); - const habitabilityModifier = 1 + Math.max(100 - habitability, 0) / 1000; // [1, 1.1]; const heightModifier = 1 + Math.max(cells.h[neibCellId] - 25, 25) / 25; // [1, 3]; - const connectionModifier = connections.has(`${next}-${neibCellId}`) ? 1 : 3; + const connectionModifier = connections.has(`${next}-${neibCellId}`) ? 1 : 2; const burgModifier = cells.burg[neibCellId] ? 1 : 3; const cellsCost = distanceCost * habitabilityModifier * heightModifier * connectionModifier * burgModifier; const totalCost = priority + cellsCost; - if (from[neibCellId] || totalCost >= cost[neibCellId]) continue; + if (totalCost >= cost[neibCellId]) continue; from[neibCellId] = next; - - if (neibCellId === exit) return from; - cost[neibCellId] = totalCost; queue.push(neibCellId, totalCost); } @@ -251,16 +226,13 @@ window.Routes = (function () { while (queue.length) { const priority = queue.peekValue(); const next = queue.pop(); - isDebug && console.log("next", next); for (const neibCellId of cells.c[next]) { if (neibCellId === exit) { - isDebug && console.log(`neib ${neibCellId} is exit`); from[neibCellId] = next; return from; } - // if (from[neibCellId]) continue; // don't go back if (cells.h[neibCellId] >= 20) continue; // ignore land cells if (temp[cells.g[neibCellId]] < MIN_PASSABLE_SEA_TEMP) continue; // ignore too cold cells @@ -271,19 +243,8 @@ window.Routes = (function () { const cellsCost = distanceCost * typeModifier * connectionModifier; const totalCost = priority + cellsCost; - if (isDebug) { - const lost = totalCost >= cost[neibCellId]; - console.log( - `neib ${neibCellId}`, - `cellCost ${rn(cellsCost)}`, - `new ${rn(totalCost)} ${lost ? ">=" : "<"} prev ${rn(cost[neibCellId])}.`, - `${lost ? "lost" : "won"}` - ); - } - if (totalCost >= cost[neibCellId]) continue; from[neibCellId] = next; - cost[neibCellId] = totalCost; queue.push(neibCellId, totalCost); } diff --git a/modules/ui/layers.js b/modules/ui/layers.js index ad826bc7..34906c63 100644 --- a/modules/ui/layers.js +++ b/modules/ui/layers.js @@ -393,7 +393,6 @@ function drawTemp() { const start = findStart(i, t); if (!start) continue; used[i] = 1; - //debug.append("circle").attr("r", 3).attr("cx", vertices.p[start][0]).attr("cy", vertices.p[start][1]).attr("fill", "red").attr("stroke", "black").attr("stroke-width", .3); const chain = connectVertices(start, t); // vertices chain to form a path const relaxed = chain.filter((v, i) => i % 4 === 0 || vertices.c[v].some(c => c >= n)); @@ -1638,9 +1637,6 @@ function drawRoutes() { TIME && console.time("drawRoutes"); const {cells, burgs} = pack; - const SHARP_ANGLE = 135; - const VERY_SHARP_ANGLE = 115; - const points = adjustBurgPoints(); // mutable array of points const routePaths = {}; @@ -1651,27 +1647,12 @@ function drawRoutes() { searoutes: d3.curveCatmullRom.alpha(0.5), default: d3.curveCatmullRom.alpha(0.1) }; + const SHARP_ANGLE = 135; + const VERY_SHARP_ANGLE = 115; for (const {i, group, cells} of pack.routes) { - // if (group !== "searoutes") straightenPathAngles(cells); // mutates points - const pathPoints = getPathPoints(cells); - - // TODO: temporary view for searoutes - if (group) { - const pathPoints = cells.map(cellId => points[cellId]); - const color = getMixedColor("#000000", 0.6); - const line = "M" + pathPoints.join("L"); - pathPoints.forEach(([x, y]) => - debug.append("circle").attr("r", 0.7).attr("cx", x).attr("cy", y).attr("fill", color) - ); - if (!routePaths[group]) routePaths[group] = []; - routePaths[group].push(``); - - // lineGen.curve(curves[group] || curves.default); - // const path = round(lineGen(pathPoints), 1); - // routePaths[group].push(` `); - continue; - } + if (group !== "searoutes") straightenPathAngles(cells); // mutates points + const pathPoints = cells.map(cellId => points[cellId]); lineGen.curve(curves[group] || curves.default); const path = round(lineGen(pathPoints), 1); @@ -1685,8 +1666,6 @@ function drawRoutes() { routes.select("#" + group).html(routePaths[group].join("")); } - drawCellsValue(pack.cells.i); - TIME && console.timeEnd("drawRoutes"); function adjustBurgPoints() { @@ -1733,46 +1712,6 @@ function drawRoutes() { } } } - - function getPathPoints(cellIds) { - const pathPoints = cellIds.map(cellId => points[cellId]); - - if (pathPoints.length === 2) { - // curve and shorten 2-points line - const [[x1, y1], [x2, y2]] = pathPoints; - - const middleX = (x1 + x2) / 2; - const middleY = (y1 + y2) / 2; - - // add shifted point at the middle to curve the line a bit - const NORMAL_LENGTH = 0.3; - const normal = getNormal([x1, y1], [x2, y2]); - const sign = cellIds[0] % 2 ? 1 : -1; - const normalX = middleX + NORMAL_LENGTH * Math.cos(normal) * sign; - const normalY = middleY + NORMAL_LENGTH * Math.sin(normal) * sign; - - // make line shorter to avoid overlapping with other lines - const SHORT_LINE_LENGTH_MODIFIER = 0.8; - const distX = x2 - x1; - const distY = y2 - y1; - const nx1 = x1 + distX * SHORT_LINE_LENGTH_MODIFIER; - const ny1 = y1 + distY * SHORT_LINE_LENGTH_MODIFIER; - const nx2 = x2 - distX * SHORT_LINE_LENGTH_MODIFIER; - const ny2 = y2 - distY * SHORT_LINE_LENGTH_MODIFIER; - - return [ - [nx1, ny1], - [normalX, normalY], - [nx2, ny2] - ]; - } - - return pathPoints; - } - - function getNormal([x1, y1], [x2, y2]) { - return Math.atan2(y1 - y2, x1 - x2) + Math.PI / 2; - } } function toggleMilitary() {