Ich habe eine prozedural erzeugte Karte mit Voronoi-Zellen, mit einem definierten Meeresspiegel und einer glaubwürdigen Höhenkarte.
Bisher konnte ich bestimmte geografische Merkmale erfolgreich kennzeichnen: Land, Meer, Seen, Flüsse, Flussmündungen, Zusammenflüsse, Berge und Biome. Zu den Biomes zählen Tundra, boreale Wälder, Wiesen und gemäßigte Wälder. Es gibt dort auch ein paar andere Biome, aber für meine Zwecke sind sie momentan nicht wichtig.
Ich würde gerne Buchten und Meerengen als nächstes bezeichnen, aber ich weiß nicht, wie ich das richtig machen soll. Eine Bucht ist ein versenktes Küstengewässer, das direkt mit dem Ozean verbunden ist.
Eine Meerenge ist eine natürlich geformte, schmale Wasserstraße, die zwei Teile des Ozeans verbindet. Grundsätzlich dort, wo sich zwei Landstücke fast berühren und es auf beiden Seiten Ozean gibt. Wird auch als "Kanal" bezeichnet.
Zum Ermitteln von Features kann ich jedes Feature nach Typ wie folgt durchlaufen:
for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
// loop through lands
for each (var cell:Cell in feature.cells)
// loop through cells
for each (var neighbor:Cell in cell.neighbors)
// loop through a cell's neighbors
trace(neighbor.hasFeatureType(Geography.LAND));
quelle
Antworten:
Die Art und Weise, wie Dragons Abound Buchten identifiziert, besteht darin, entlang der Küste zu gehen und zwei Stellen an der Küste zu finden, an denen der Abstand zwischen den Stellen in gerader Linie geringer ist als der Abstand zwischen den Stellen entlang der Küste. Dies ist die Verkrümmung der Küste zwischen den beiden Punkten. Durch Auswahl einer Sinuositätsgrenze und von Grenzen für den geradlinigen Abstand zwischen den Punkten können Sie schmale tiefe Buchten, breite flache Buchten usw. identifizieren.
In diesem Bild zeigen die roten und violetten Punkte die beiden Kandidatenpunkte, und die grüne Linie ist die Küstenlinie zwischen den Punkten. Die Sinuosität ist das Verhältnis dieser beiden Längen:
Alternativ können Sie zwei Punkte an der Küste auswählen und ein Polygon erstellen, indem Sie die beiden Punkte und die Küstenlinie zwischen den beiden Punkten verbinden (dh die grüne Linie oben vom roten Punkt zum violetten Punkt verbinden). Messen Sie die Fläche dieses Polygons. Eine Bucht hat eine größere Fläche als eine Nicht-Bucht.
Nach meiner Erfahrung war eine Kombination dieser beiden Maßnahmen am besten geeignet, um zuverlässig zu identifizieren, was die Menschen als Buchten betrachten.
Beachten Sie, dass dies auch Punkte erkennt. Um nur Buchten zu finden, müssen Sie überprüfen, ob das "Innere" der Bucht Wasser und kein Land enthält. Eine schnelle und einfache Möglichkeit, dies zu tun, besteht darin, den Mittelpunkt der Linie zwischen den beiden Punkten zu überprüfen, um festzustellen, ob es sich um Wasser handelt. (Dies kann getäuscht werden, ist aber im Allgemeinen ausreichend.)
Ein verwandtes Problem besteht darin, die "Mündung" der Bucht zu identifizieren - dh die beste Wahl für die beiden Punkte, die die Öffnung zur Bucht markieren. In der Regel haben Sie eine Reihe von Kandidaten für den "Mund". In der obigen Beispielkarte können Sie die Mündung dieser Bucht weiter hinein- oder herausschieben. Im Allgemeinen spielt es wahrscheinlich keine große Rolle, aber eine Heuristik, die einigermaßen gut funktioniert, ist die Minimierung des geradlinigen Abstands über den Mund.
Ich habe noch keine Meerengen geschafft, aber ich habe die Absicht, Punkte entlang der Küste zu überprüfen, um den nächstgelegenen Punkt an einer anderen Küste zu finden. Wenn dies unter einer festgelegten Grenze liegt, ist es eine Meerenge.
quelle
Im Folgenden finden Sie eine ungefähre Vorstellung davon, wie Sie mithilfe von Bildverarbeitungstransformationen die relevanten Funktionen isolieren können:
Wenden Sie eine Überflutungsfüllung aus einer Ozeanzelle an, um eine Maske aus allen Ozeanzellen zu erstellen. Je nachdem, wie Ihre Flüsse eingerichtet sind, benötigen Sie möglicherweise ein zusätzliches Höhen- oder Freiraumkriterium, um zu verhindern, dass die Ozeanmaske ins Landesinnere fließt. ;)
Wenden Sie eine lokale Glättung am Rand dieser Maske an, wobei die Verbundenheit / Topologie gleich bleibt, aber kleine verrauschte Küstenlinienelemente geglättet werden, die ablenken können. So können wir uns auf große Buchten über winzigen Einlässen konzentrieren. Sie können die Breite Ihres Filterkerns / die Anzahl der Iterationen verwenden, um die Skala der Features, die Sie beibehalten, genau zu steuern.
Hier habe ich einige Male einen Medianfilter angewendet. Zellularautomaten sind eine weitere beliebte Methode, um glatte Formen von einer verrauschten Eingabe zu entfernen.
Verwandeln Sie die Maske in ein Distanzfeld, in dem jede Zelle ihre Distanz von der geglätteten Küste speichert.
Jetzt sehen wir einige vielversprechende Feature-Highlights. In einem signierten Distanzfeld erscheinen sowohl Buchten als auch Meerengen als scharfe Grate, wobei die Distanz zu den Seiten abfällt. Wir können einen Kantenerkennungsfilter verwenden, um diese Kanten auszublenden:
Sie können dann zwischen Buchten und Meerengen unterscheiden, indem Sie dem Grat folgen, um die Konnektivität zu bestimmen. Eine Bucht ist ein Grat, der in Richtung Küste verläuft und immer flacher (vom Land entfernt) wird, bis er in einem Punkt endet. Eine Meerenge ist ein Grat, der eine Fernregion mit einer anderen Fernregion verbindet und auf dem Weg durch eine Fernregion verläuft.
Eine andere Möglichkeit besteht darin, jeder Insel eine ID zuzuweisen (Suche verbundener Komponenten). Wenn Sie dann Ihr Entfernungsfeld erstellen, geben Sie die "nächste Insel-ID" entlang der Entfernungsgrenze weiter. Eine Bucht oder ein Einlass ist dann ein Grat in Wasser neben derselben Landmasse auf beiden Seiten, während ein Kanal ein Grat ist, der Wasser neben zwei verschiedenen Landmassen trennt.
Sie können Mindest- und Höchstwerte für den Abstand zum Ufer oder die Länge des Firsts festlegen, um zu steuern, welche Features zu kennzeichnen sind, wenn Sie beispielsweise übermäßig enge / breite Meerengen ausschließen müssen.
quelle
Grundsätzlich müssen Sie darüber nachdenken, was Sie genau mit einer Bucht oder Meerenge meinen und warum Sie sie unterscheiden möchten (dient dies zur AI-Berechnung oder zur Kennzeichnung von Orientierungspunkten oder etwas anderem?). Probieren Sie ein paar Definitionen aus, um die zu finden, die Ihnen am besten gefällt. Formulieren Sie dann Bedingungen, um Ihre Voronoi-Zellen zu überprüfen. Ein paar Vorschläge:
Bucht
Straße
quelle