Ich versuche eine ziemlich große zweidimensionale Sternenkarte zu erstellen, die verschiedene Fraktionen / Zustände zeigt, die jeweils ein oder mehrere Sternensysteme besitzen. Ich möchte automatisch Grenzen / Gebiete für die Fraktionen erstellen.
Die Idee ist, im Wesentlichen von so etwas auszugehen (die Punkte repräsentieren Sternensysteme auf einer 2D-Ebene, Farben sind Fraktionszugehörigkeiten)
dazu
Das Generieren solcher Karten scheint eine ziemlich häufige Anforderung zu sein, daher lautet meine eigentliche Frage: Gibt es Standardalgorithmen zum Generieren von Zustandsbereichen wie gezeigt? Wenn ja, können Sie mich darauf hinweisen? Wenn nicht, können Sie sich einen guten Algorithmus vorstellen (Grundidee oder Pseudocode sind in Ordnung)?
Die Leistung des Algorithmus ist für mich kein Hauptanliegen, daher hätte ich lieber eine "schönere" Karte als eine schneller zu generierende. Diese ähnliche Frage bietet einen Ansatz, der wahrscheinlich auf mein Problem anwendbar ist, obwohl eine gewisse "Verschönerung" erforderlich ist: Wie erstelle eine Karte aus einem Diagramm
Lassen Sie mich erklären, was ich meine, wenn ich hübscher sage: Am Ende der verknüpften Frage präsentiert die Fragestellerin ihr Endergebnis, nachdem sie die akzeptierte Antwort implementiert hat. Mein erstes Problem hier: Die Bereiche für die Knoten Nr. 6, Nr. 9 und Nr. 12 sind sehr klein und merkwürdig geformt. Anstelle der scharfen Kanten würde ich auch einen glatteren, geschwungenen Look bevorzugen.
Meine eigenen Ideen, einschließlich der jeweiligen Nachteile / Fragen, die ich mit ihnen sehe:
- Generieren Sie für jede Fraktion ein "konvexes Rumpf" -Polygon und erweitern Sie es dann etwas nach außen. Probleme: Keine konkaven Funktionen. Wie gehen Sie mit Überschneidungen um?
- Generieren Sie ein Voronoi-Diagramm für die Punkte und verwenden Sie dann die Voronoi-Polygonkanten zwischen benachbarten Systemen verschiedener Fraktionen als Grenzen. Problem: Große Polygone an den Kartenrändern - wie identifiziere und behebe ich diese?
- Generieren Sie für jeden Punkt ein Polygon mit fester Größe und vereinen Sie alle Polygone für eine einzelne Fraktion (was zu einem großen, möglicherweise komplexen "Fraktionspolygon" führt). Dann tun Sie etwas, um überlappende Bereiche zwischen zwei Fraktionen in Einklang zu bringen. Probleme: Wie würde ich das genau machen? Nicht gerade ein trivialer Prozess. Was ist, wenn sich mehr als zwei Fraktionen überschneiden?
Deine Hilfe wird wertgeschätzt.
Nachtrag: Nachdem ich über die ersten beiden Antworten und ihre jeweiligen Lösungsansätze nachgedacht habe, habe ich festgestellt, dass meine obigen Anforderungen unvollständig sind.
Ich muss hinzufügen, dass die Karte dünn besiedelte Gebiete haben kann, was bedeutet, dass es einen isolierten Stern oder eine Gruppe von Sternen geben kann. Ich möchte jeden dieser Cluster mit einem eigenen zusammenhängenden farbigen Bereich anzeigen. Etwas wie das:
Mir ist klar, dass dies möglicherweise einen ersten Schritt erfordert, der Cluster identifiziert und dann den eigentlichen Algorithmus für jeden der Cluster ausführt.
Antworten:
Ich denke, die Voronoi-Idee ist gut. Jeder Stern wird zu einem Startpunkt für Voronoi, und dann zeigen die Voronoi-Regionen die Gebiete, die jeder Fraktion gehören. Es gibt jedoch einige Änderungen, die dafür sorgen, dass es besser funktioniert:
Hier ist die Ausgabe:
Ich habe auch eine Seite geschrieben, auf der Sie die Regionen malen können, um zu sehen, wie sie aussehen würden.
quelle
Eine von vielen Methoden ist eine Einflusskarte . Sie können nach bestimmten Code-Implementierungen suchen, aber der grundlegende Algorithmus ist ziemlich einfach.
Weisen Sie jedem Fraktionsobjekt (z. B. Sternensystem) einen positiven (heißen) Wert zu. Weisen Sie allen Objekten anderer Fraktionen einen negativen (kalten) Wert zu. Die Größe von heiß oder kalt sollte davon abhängen, wie viel Einfluss das Objekt Ihrer Meinung nach auf seine Umgebung und seine Nachbarn ausübt. Diese Werte müssen nicht proportional sein, wenn Sie letztendlich ein "dmz" zwischen Fraktionen beibehalten möchten.
Verwenden Sie diese Details, um ein temporäres Raster (z. B. ein Array) zu erstellen, das sich den Pixeln Ihrer Karte annähert. Sie können ein solches Raster mit der gewünschten Auflösung erstellen, einschließlich 1: 1.
Verwenden Sie als Nächstes die Wärme- / Feldübertragungsgleichung, um die Stärken der Fraktionsobjekte (Wärme) zu iterieren und gegen die Stärken der Objekte der Gegner (Kälte) für jede Nachbarzelle im Gitter zu verteilen.
Spüle und wiederhole für jede Fraktion auf deiner Karte, indem du für jede Fraktion separate Fraktionsgitter erstellst.
Interpolieren Sie schließlich die Fraktionsgitter zusammen, um für jede Fraktion eine Einflusskontur zu erstellen. Übertragen Sie dieses Raster dann mit der Auflösung, die Sie für das Raster verwendet haben (Hinzufügen fraktionsspezifischer Farben usw.), zurück auf Ihre Pixelkarte.
Die Kunst in diesem Prozess besteht darin, zu bestimmen, wie viel Einfluss jedes Objekt haben sollte und welche Spielelemente Sie verwenden, um diesen Wert zu quantifizieren.
Abgesehen davon können die Produkte dieser Methode für alle möglichen anderen Zwecke verwendet werden, z. B. für Ihre Entscheidungsfindung.
Zusätzliche Referenz: Diskussionsthread zu den Ursprüngen der Einflussabbildung .
quelle
Sie sollten sich Voronoi-Diagramme ansehen. Hier ist die Definition auf Wikipedia:
Die Basispunkte werden normalerweise zufällig generiert und oft als Knoten bezeichnet. In Ihrem Fall könnte jeder Knoten Ihre Sterne sein. Auf diese Weise kann die mit den Sternen verknüpfte Fraktion mit der den Stern umgebenden Voronoi-Zelle verknüpft werden. Wenn jede Zelle berechnet wurde, verbinden Sie diejenigen mit derselben Fraktion miteinander und sollten einen hübschen Rand um Ihre Sterne haben.
Die FastNoise-Bibliothek unterstützt Voronoi-Diagramme. Vielleicht sollten Sie sie sich ansehen.
Glättung der Regionen
Bewahren Sie Ihre Sterne in einem «sicheren Array» auf und verwenden Sie eine Kopie davon, in der Sie durch Interpolation der nächsten Nachbarn tatsächlich weitere Punkte hinzufügen und aus diesen Punkten das Diagramm erstellen. Es sollte Ihnen glattere Regionen geben.
Andere Ideen Der Fortune-Algorithmus basiert auf einer geraden Linie, die die kartesische Ebene fegt. Eine interessante Idee wäre, stattdessen einen Kreis zu verwenden, um die Ebene vom Zentrum Ihrer Galaxie / Ihres Raums zu fegen. Vielleicht könnte dies auch zu einigen interessanten Formen führen.
Geometriemanipulation
Ihre letzte Idee, kleinere Polygone zu größeren zu kombinieren und dann die Kanten zu fixieren, erfordert erweiterte Spline-Algorithmen, um die Formen zu ändern. Ich bin mir nicht sicher, ob das effizient oder gut aussehend wäre. Ich bin mir ziemlich sicher, dass das Voronoi-Diagramm mit zusätzlicher Tessellation der richtige Weg ist, da es das Kantenproblem selbst behebt und sogar einige zusätzliche Daten wie den Abstand von den Rändern (die zur Bestimmung der Zonen von verwendet werden könnten) selbst anbieten kann Konflikt zwischen den verschiedenen Fraktionen, die Wahrscheinlichkeit, auf verschiedene Schiffstypen zu stoßen usw.)
quelle