Generowanie układu miasta w siatce


9

Chcę wygenerować układ miasta w kwadratowej siatce (renderowanej izometrycznie, ale to nie ma znaczenia) przy użyciu następujących elementów:

  • 2x2 domy
  • Drogi, szerokość 1 jednostki
  • Kanały o szerokości 1 jednostki

Przykładowy układ:

Przykładowy układ

  • Zawsze mam określoną liczbę domów i tyle dróg i kanałów, ile potrzeba do połączenia ich wszystkich.
  • Domy muszą mieć dwa odcinki drogi przed drzwiami wejściowymi (które zawsze są skierowane w prawo)
  • Byłoby miło mieć między sobą pola trawy (pustki).

Czy jest na to gotowy algorytm? Jeśli nie, w jakim kierunku powinienem myśleć o wdrożeniu tego?

Odpowiedzi:


8

Istnieje wiele sposobów, w zależności od tego, jak chcesz. Oto ogólny zarys jednego ze sposobów, który moim zdaniem pasuje do twojego opisu:

Najpierw wygeneruj kanały. Następnie zacznij losowo ustawiać domy, dla każdego domu, który stawiasz, umieść przed nim drogę i narysuj drogę z tego kawałka do istniejącej sieci dróg, jeśli albo nie jest to możliwe, albo umieszczenie drogi z przodu powoduje brzydki blok 2x2 zmiana położenia domu. Wykryj niektóre punkty drogi, które są blisko siebie, ale daleko od siebie, wzdłuż istniejących dróg i spróbuj dla nich zrobić skróty.

Tego rodzaju rzeczy wymagają przede wszystkim eksperymentów i doświadczenia. Często uzyskujesz dobre wyniki losowego tworzenia szczegółów, określania, czy spełnia on określone kryteria, i cofania i ponawiania, jeśli nie.

Do tego dokładnego zadania z pewnością będziesz potrzebować dobrego zrozumienia podstawowych ścieżek, chyba że jesteś już ekspertem, przeczytaj ten temat. I pamiętaj, że szukanie ścieżek nie musi być tylko najkrótszą ścieżką, w ostatniej części mojego opisu możesz chcieć przywrócić trochę uwagi ścieżkom, które już tam są.

Nie jest to wcale łatwe zadanie, jeśli utkniesz, wróć i pokaż nam swój kod oraz kilka przykładowych danych wyjściowych oraz wyjaśnij szczegółowo, jak chcesz, aby było inaczej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.