Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.01.2009, 14:26

Nachbarschaftsrelation von Polygonen

Hallo,

ich habe in meinem Projekt das Problem, eine automatische Nachbarschaftsrelation von allen Polygonen in einer Karte berechnen zu müssen. Die Karte besteht aus bis zu tausenden Polygonen, die normalerweise alle aneinandergrenzen.

Leider ist das Kartenformat eine spezifische Art von XML, die zwar größtenteils hierarchisch (kleiner Elemente sind in größeren enthalten) sind, aber keine wirkliche geometrische Ordnung besitzen (man kann nicht sagen, welche Polygone sich in der Nachbarschaft eines anderen Polygons befinden).

Ich brauche das Ganze, um eine Routenplanung zu erstellen (mittels A*-Algorithmus), die Polygone übernehmen dann die Funktion der Knoten des Graphen.

Im Web habe ich einiges zur automatischen Generierung von Navigation Meshes gefunden, allerdings löst dies nicht das Problem des Auffindens der Adjazenz der Polygone.

Eine vorgeschlagene Lösung bestand (im Web) darin, jedem Vertex eines Polygons einen Hash mit Indizes auf die beteiligten Polygone mitzugeben, dies funktioniert allerdingds nur, wenn wirklich alle Polygone aneinandergrenzen und mit Integerzahlen gearbeitet wird. Beides ist in meinem Fall nicht sichergestellt, d.h. es handelt sich um Float-Werte, die voneinander abweichen können und in Ausnahmefällen können die Polygone auch einen (kleinen) Abstand haben.

Bin für alle Hinweise/Tipps dankbar,

AlGaN

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

13.01.2009, 15:26

Dann frage ich dich, wie du dir das vorstellst. Denn wie würdest du dann einen Nachbarn definieren, wenn die Polygonen noch nicht mal gleiche Eckpunkte nutzen müssen (so verstehe ich das mit dem Abstand).
Also intuitiv würde ich nach deiner Beschreibung als erstes schauen welche Eckpunkte identisch sind (also übereinander oder nahe aneinander liegen). Danach würde ich alle Polygone per Indices beschreiben (ähnlich wie die Index/Vertexgeschichte bei 3D Modellen). Wenn du das geschafft hast, sollten sich die Nachbarschaften leicht rausfinden lassen, aber es ist halt nicht sonderlich performant. Auf welcher Hardware und wie oft soll denn das ganze geschehen?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

13.01.2009, 15:50

Hallo nox,

es ist klar, dass sich die Nachbar-Polygone in der Nähe des betreffenden Polygons befinden müssen; ich habe schon mal eine Implementierung gesehen, bei der eine Art "unscharfe Grenze" definiert wurde (also etwa, alles was bis zu +/- 5 Einheiten von der Kante des Polygons weg ist, wird noch als Nachbar definiert), aber klar - das kompliziert die Sache noch.

Das Problem ist, dass die Karte aus einem anderen Format konvertiert wird (AutoCAD) und es aufgrund von Bugs in der Export-Funktion nicht sichergestellt werden kann, dass keine "Lücken" zwischen den Elementen auftreten.

Ich habe die Polygone schon komplett in Elementen/Klassen namens "Polygon", in der ein privates Datenmember eine Liste mit den Punkten hält.

Die Hardware ist ein normaler Windows Ultra Mobile PC (UMPC) (Sony VGN-UX1XN), keine Ahnung, was da für eine CPU drin ist (so ~ 1 GHz), mit Windows Vista. Die Berechnung der Nachbarschaftsrelationen muss allerdings auch nicht zur Laufzeit passieren, es würde ein Preprocessing-Schritt reichen...

Danke für alle Tipps,
AlGaN

4

13.01.2009, 17:13

Also, du hast eine Liste an Polygone und jedes Polygon soll ein Knoten sein, ja?
Jetzt brauchst du quasi noch die Kanten und willst dafür herausfinden, ob die Polygone benachbart sind?
Könnte man dann sagen, Polygone sind benachbart, wenn sie eine gemeinsame Kannte (oder auch 2 gemeinsame Eckpunkte) haben?
Ich meine, es sollt ja nun nicht so schwierig sein, einen Test zu schreiben, der alle Kanten des einen Polygons mit allen Kannten eines anderen vergleicht. Man müsste zwar jedes mit jedem Vergleichen, aber wenn du die vorher in einen Octree einsortierst und die Berechnung eh zeitunkritisch ist (und nur sagen wir innerhalb eines Tages oder so fertig sein sollte) dürfte dass doch kein allzu großes Problem darstellen.
Lieber dumm fragen, als dumm bleiben!

5

13.01.2009, 17:22

Das Problem ist, wie afaik bereits erwähnt wurde, das die Polygone kein zusammenhängendes Mesh bilden, sondern ben nur an einander grenzen, also nicht die selben Vertieces für die entsprechenden Eckpunkte verwenden, und nach den Koordinaten kannst du wegen ugenauigkeiten der Konvertierung nicht gehen

6

13.01.2009, 17:31

Ei, die Ungenauigkeiten sind doch egal, baut man eben ein bisschen Toleranz ein, etwa:
|Punkt1-Punkt2|<=0.001
Als vergleich ob 2 Punkte gleich sind.
Und wenn man 2 Punkte miteinander vergleichen kann, kann man auch locker herausfinden, ob 2 Polygone eine gemeinsame Kannte haben, bei nem Dreieck und eine Fünfeck, käme man dann z.B. auf 15 Ecken, die man miteinander vergleicht, was durchaus nicht zuu viel sein sollte, außerdem kann man da bestimmt noch was optimieren.
Lieber dumm fragen, als dumm bleiben!

7

13.01.2009, 19:35

Zitat von »"Jonathan_Klein"«

Ei, die Ungenauigkeiten sind doch egal, baut man eben ein bisschen Toleranz ein, etwa:
|Punkt1-Punkt2|<=0.001
Als vergleich ob 2 Punkte gleich sind.
Und wenn man 2 Punkte miteinander vergleichen kann, kann man auch locker herausfinden, ob 2 Polygone eine gemeinsame Kannte haben, bei nem Dreieck und eine Fünfeck, käme man dann z.B. auf 15 Ecken, die man miteinander vergleicht, was durchaus nicht zuu viel sein sollte, außerdem kann man da bestimmt noch was optimieren.

Das war ja das, was er mit unscharfer Grenze meinte ;)

8

15.01.2009, 10:23

vieleicht bringt dir das hier was:
http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

der einfachheit halber könntest du polygonschwerpunkte anstatt die polygone selber benutzen, oder du wandelst halt den algorithmus so ab, dass er nur die nächsten punkte von ANDEREN polygonen betrachtet

ansonsten kannst du polygone noch in nen quadtree oder sowas sortieren und bruteforce-mäßig drübersuchen...
brauchste ja bloß eine zelle betrachten, wenn du darin das räumlich nächste polygon gefunden hast, musst du testen, ob der abstand auch in eine benachbarte zelle reichen würde, wenn ja, musst du auch diese zelle testen.

9

16.01.2009, 11:32

Hallo,

danke für eure Tipps,

ok einen Brute-Force-Vergleich zu schreiben, dürfte nicht allzu schwierig sein, nur hatte ich gedacht, man könnte den Aufwand etwas reduzieren mit spz. Algorithmen etc. Auch eine Art Unschärfe bei der Abstandsberechnung einzubauen dürfte nicht das Problem sein.

@WarMuuh!!: Danke für den Tipp, ich hatte schon vor einiger Zeit mal nach Nachbarn-Algorithmen gesucht, und auch diesen Nearest Neighor Algo angeschaut, ihn dann aber wieder verworfen, da er meiner Erinnerung nach Punkte als Mengenelemente voraussetzte, aber den Tipp mit den Schwerpunkten der Polygone werd ich mir nochmals duch den Kopf gehen lassen...

Hintergrund des ganzen ist: Die Karte enthält verschiedene Arten von Polygon-"Elementen", Räume, Gänge, Treppen, Türen usw. in Gebäuden; Straßen, Wege, Grünflächen usw. draußen... davon sind manche begehbar, manche nicht; ich hoffte dadurch gleichzeitig auch die Kollisionsbehandlung mit erledigen zu können neben der Routenführung...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

16.01.2009, 13:27

Den schwerpunkt zu nehmen ist nicht sehr präzise. Man stelle sich nur ein sehr großes Polygon zwischen vielen kleinen vor. Beim großen würde dann seinen Schwerpunkt z.B. in der Mitte liegen und damit ggf. sehr weit weg von den Schwerpunkten der anderen Polys -> es wird keine Nachbarschaft gefunden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige