Wpis z mikrobloga

Jak byście ograli coś takiego.
Macie planszę 2d, o wymiarach AxB.
każdy punkt da się zdefiniować jako współrzędna x,y oraz można na nim ustawić wartość, dla uproszczenia 0 albo 1.
Chciałbym wygenerować na planszy losową drogę.
Warunki do spełnienia:
1) Droga ma mieć początek w na losowej współrzędnej na krawędzi mapy oraz kończyć na losowej współrzędnej na krawędzi mapy.
2) Droga ma mieć wężowaty kształt, jak serpentyna albo rzeka. Nie powinna mieć widocznych załamań. Musi być kręta.
Potrzebuje zrobić to w JavaScript, ale poradzę sobie z przełożenia z dowolnego języka programowania.
Na razie mam coś takiego i jest to dalekie od ideału, bo droga ma załamania i nie jest kręta.

Obecna klasa generatora drogi nie działa dobrze, bo droga nie jest kręta.

export default class RoadGenerator {
constructor(map) {
this.map = map;
}

generateRandomCurvedRoad() {
let startX = Math.floor(Math.random() * this.map.width);
let startY = Math.random() < 0.5 ? 0 : this.map.height - 1;

let endX = Math.floor(Math.random() * this.map.width);
let endY = startY === 0 ? this.map.height - 1 : 0;

let direction = Math.random() < 0.5 ? -1 : 1;
let numChanges = Math.floor(Math.random() * (this.map.height - 1)) + 1;

let x = startX;
let y = startY;
this.map.setPointInfo(x, y, 3);

while (y !== endY || x !== endX) {
x += direction;

if (numChanges > 0 && Math.random() < 0.5) {
direction *= -1;
numChanges--;
}

y = y < endY ? y + 1 : y - 1;

if (x < 0 || x >= this.map.width || this.map.getPointInfo(x, y) === 3) {
break;
}

this.map.setPointInfo(x, y, 3);
}
}
}

#javascript #programowanie
czlowiekzlisciemnaglowie - Jak byście ograli coś takiego.
Macie planszę 2d, o wymiar...
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@czlowiek_z_lisciem_na_glowie: funkcja sinus: y = a sin(bx + c) i przekładasz ja na matryce swojej planszy

a = „dłuższa sinusoida” (większy zakres Y)
b = więcej zakrętów
c = przesunięcie w X

Możesz podzielić swoją plansze na wiele matryc a potem to jakoś „ładnie” połączyć z różnymi sinusoidami
  • Odpowiedz