diff --git a/main.js b/main.js index 347670c4..1b64d1a2 100644 --- a/main.js +++ b/main.js @@ -795,11 +795,11 @@ function addLakesInDeepDepressions() { for (const n of c[q]) { if (checked[n]) continue; + if (h[n] >= treshold) continue; if (h[n] < 20) { deep = false; break; } - if (h[n] >= treshold) continue; checked[n] = true; queue.push(n); @@ -808,7 +808,6 @@ function addLakesInDeepDepressions() { // if not, add a lake if (deep) { - debug.append("circle").attr("cx", points[i][0]).attr("cy", points[i][1]).attr("r", 1).attr("fill", "red"); const lakeCells = [i].concat(c[i].filter(n => h[n] === h[i])); addLake(lakeCells); } diff --git a/modules/lakes.js b/modules/lakes.js index 0c91ca67..cf73b5dc 100644 --- a/modules/lakes.js +++ b/modules/lakes.js @@ -45,7 +45,7 @@ delete feature.shoreline; delete feature.outCell; delete feature.closed; - feature.height = rn(feature.height); + feature.height = rn(feature.height, 3); const inlets = feature.inlets?.filter(r => pack.rivers.find(river => river.i === r)); if (!inlets || !inlets.length) delete feature.inlets; diff --git a/modules/river-generator.js b/modules/river-generator.js index 91566f52..b6152544 100644 --- a/modules/river-generator.js +++ b/modules/river-generator.js @@ -27,13 +27,50 @@ TIME && console.timeEnd("generateRivers"); function prepareLakeData() { + const ELEVATION_LIMIT = 10; + features.forEach(f => { if (f.type !== "lake") return; delete f.flux; delete f.inlets; delete f.outlet; delete f.height; + delete f.closed; !f.shoreline && Lakes.getShoreline(f); + + // lake surface height is as lowest land cells around + const min = f.shoreline.sort((a, b) => h[a] - h[b])[0]; + f.height = h[min] - 0.1; + + // check if lake can be open (not in deep depression) + let deep = true; + const treshold = f.height + ELEVATION_LIMIT; + const queue = [min]; + const checked = []; + checked[min] = true; + + // check if elevated lake can potentially pour to another water body + while (deep && queue.length) { + const q = queue.pop(); + + for (const n of cells.c[q]) { + if (checked[n]) continue; + if (h[n] >= treshold) continue; + + if (h[n] < 20) { + const nFeature = features[cells.f[n]]; + if (nFeature.type === "ocean" || f.height > nFeature.height) { + deep = false; + break; + } + } + + checked[n] = true; + queue.push(n); + } + } + + f.closed = deep; }); }