refactor: drawCoastline

This commit is contained in:
Azgaar 2024-09-06 02:37:44 +02:00
parent 088faf9e26
commit ec236d146b
2 changed files with 14 additions and 25 deletions

View file

@ -15,20 +15,26 @@ function drawCoastline() {
for (const i of cells.i) { for (const i of cells.i) {
const startFromEdge = !i && cells.h[i] >= 20; const startFromEdge = !i && cells.h[i] >= 20;
if (!startFromEdge && cells.t[i] !== -1 && cells.t[i] !== 1) continue; // non-edge cell if (!startFromEdge && cells.t[i] !== -1 && cells.t[i] !== 1) continue; // non-edge cell
const f = cells.f[i]; const f = cells.f[i];
if (used[f]) continue; // already connected if (used[f]) continue; // already connected
if (features[f].type === "ocean") continue; // ocean cell if (features[f].type === "ocean") continue; // ocean cell
const type = features[f].type === "lake" ? 1 : -1; // type value to search for const type = features[f].type === "lake" ? 1 : -1; // type value to search for
const start = findStart(i, type); const ofSameType = cellId => cells.t[cellId] === type || cellId >= n;
if (start === -1) continue; // cannot start here
let vchain = connectVertices(start, type); const startingVertex = findStart(i, type);
if (startingVertex === -1) continue; // cannot start here
let vchain = connectVertices({vertices, startingVertex, ofSameType});
if (features[f].type === "lake") relax(vchain, 1.2); if (features[f].type === "lake") relax(vchain, 1.2);
used[f] = 1; used[f] = 1;
let points = clipPoly( let points = clipPoly(
vchain.map(v => vertices.p[v]), vchain.map(v => vertices.p[v]),
1 1
); );
const area = d3.polygonArea(points); // area with lakes/islands const area = d3.polygonArea(points); // area with lakes/islands
if (area > 0 && features[f].type === "lake") { if (area > 0 && features[f].type === "lake") {
points = points.reverse(); points = points.reverse();
@ -81,28 +87,6 @@ function drawCoastline() {
return index === -1 ? index : cells.v[i][index]; return index === -1 ? index : cells.v[i][index];
} }
// connect vertices to chain
function connectVertices(start, t) {
const chain = []; // vertices chain to form a path
for (let i = 0, current = start; i === 0 || (current !== start && i < 50000); i++) {
const prev = chain[chain.length - 1]; // previous vertex in chain
chain.push(current); // add current vertex to sequence
const c = vertices.c[current]; // cells adjacent to vertex
const v = vertices.v[current]; // neighboring vertices
const c0 = c[0] >= n || cells.t[c[0]] === t;
const c1 = c[1] >= n || cells.t[c[1]] === t;
const c2 = c[2] >= n || cells.t[c[2]] === t;
if (v[0] !== prev && c0 !== c1) current = v[0];
else if (v[1] !== prev && c1 !== c2) current = v[1];
else if (v[2] !== prev && c0 !== c2) current = v[2];
if (current === chain[chain.length - 1]) {
ERROR && console.error("Next vertex is not found");
break;
}
}
return chain;
}
// move vertices that are too close to already added ones // move vertices that are too close to already added ones
function relax(vchain, r) { function relax(vchain, r) {
const p = vertices.p, const p = vertices.p,

View file

@ -159,6 +159,11 @@ function connectVertices({vertices, startingVertex, ofSameType, addToChecked, cl
else if (v2 !== previous && c2 !== c3) next = v2; else if (v2 !== previous && c2 !== c3) next = v2;
else if (v3 !== previous && c1 !== c3) next = v3; else if (v3 !== previous && c1 !== c3) next = v3;
if (!vertices.c[next]) {
ERROR && console.error("ConnectVertices: next vertex is out of bounds");
break;
}
if (next === current) { if (next === current) {
ERROR && console.error("ConnectVertices: next vertex is not found"); ERROR && console.error("ConnectVertices: next vertex is not found");
break; break;