Laden...

Datenstruktur gesucht (Überlappung in 2D)

Erstellt von Uwe81 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.483 Views
U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren
Datenstruktur gesucht (Überlappung in 2D)

Hallo!

Ich suche eine Datenstruktur, um 2D-Rechtecke zu verwalten.

Die Datenstruktur soll folgendes möglichst performant leisten

  • Initialisieren mit Rechtecken
  • Hinzufügen von Rechtecken
  • Entfernen von Rechtecken
  • Abfrage: Welche Recktecke überlappen mit einem gegebenen Rechteck.

Die Abfrage ist das wichtigste.

Es werden bis etwa 1000 Rechtecke gespeichert, eine Abfrage sollte maximal wenige Millisekunden dauern.

Beim Googlen bin ich auf R tree, R+ tree, R* tree, Quad Tree, A tree usw. gestoßen.

Kennt jemand von euch eine C# implementierung einer datenstruktur, die obige Anforderungen erfüllt? Möglichst nicht kostenpflichtig?

Vielen Dank,
Uwe

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

zB C# QuadTree
Das Rectangle auch nicht (ganz) vergessen 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren

Hallo!

Danke für den Link. Das Problem ist, dass ich vermutlich mich in den Datenstrukturen nicht genau auskenne, aber ich weiß nicht, ob mir ein QuadTree wirklich hilft (er macht zwar was ähnliches, aber ich weiß nicht, wie ich ihn anwenden soll).

Mir ist klar, wie ich punkte in QuadTrees sortieren kann. Aber wie funktioniert die Überlappungs-Abfrage?

5.658 Beiträge seit 2006
vor 13 Jahren

Schau dir doch erstmal die Links an, die dir rausgesucht werden! Dann hättest du auch die Rectangle.Intersect-Methode gefunden.

Weeks of programming can save you hours of planning

U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren

Schau dir doch erstmal die Links an, die dir rausgesucht werden! Dann hättest du auch die Rectangle.Intersect-Methode gefunden.

Ähm, ja. Den link habe ich gesehen, aber der nützt ja nix. Damit kann ich überprüfen, ob sich zwei Rechtecke überlappen. Aber wie man nun effizient eine Menge von Rechtecken verwalten kann, steht da nicht. Ich will die ja nicht paarweise prüfen (dann hätte eine Abfrage lineare Laufzeit!).

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo Uwe81,

naja – MrSparkles Post ist durchaus eine sinnvolle Antwort auf deine Frage:

Aber wie funktioniert die Überlappungs-Abfrage?

Aber zurück zu deiner Frage:

Aber wie man nun effizient eine Menge von Rechtecken verwalten kann, steht da nicht

Du musst natürlich nicht jedes einzelne Rechteck des QuadTrees durchlaufen und auf eine eventuelle Überschneidung mit einem gegebenen Rechteck prüfen, sondern kannst dir die skalierbare Auflösungsfähigkeit des QuadTrees zunutze machen. So kannst du prüfen, ob sich ein Quadrant mit dem gegebenen Rechteck überschneidet. Tut er das nicht, tut es auch keins seiner Kind-Rechtecke. Tut er es doch, durchläufst du diesen Vorgang rekursiv und testest die Kind-Rechtecke, bis alle durchlaufen worden sind.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg