Ich bekomme eine Übung, die mir leider nicht gelungen ist.
Es gibt eine Reihe von Rechtecken und ein Rechteck R 0 . Bestimmen Sie mithilfe des Ebenen-Sweeping-Algorithmus, ob R 0 vollständig von der Menge von R 1 abgedeckt ist . . R n .
Weitere Einzelheiten zum Prinzip der Sweep-Line-Algorithmen finden Sie hier .
Fangen wir von vorne an. Zunächst kennen wir den Sweep-Line-Algorithmus als den Algorithmus zum Auffinden von Liniensegmentkreuzungen, der zwei Datenstrukturen erfordert:
- eine Menge von Ereignispunkten (es speichert Endpunkte von Segmenten und Schnittpunkten)
- ein Status (dynamische Struktur für die Menge von Segmenten, die die Sweep-Linie schneidet)
Die allgemeine Idee: Nehmen Sie an, dass die Sweep-Linie eine vertikale Linie ist, die sich der Menge der Rechtecke von links nähert. Sortieren Sie alle x- Koordinaten von Rechtecken und speichern Sie sie in aufsteigender Reihenfolge in Q - sollte O ( n log n ) annehmen . Beginnen Sie mit dem ersten Ereignispunkt. Bestimmen Sie für jeden Punkt die Menge der Rechtecke, die sich an einer bestimmten x- Koordinate schneiden , identifizieren Sie fortlaufende Segmente von Schnittrechtecken und prüfen Sie, ob sie R 0 an der aktuellen x- Koordinate vollständig abdecken . Mit T als Binärbaum wird O ( log . Wenn ein Teil von R 0 unbedeckt bleibt, ist R 0 nicht vollständig abgedeckt.
Details: Die Idee des Segmentschnittalgorithmus war, dass sich nur benachbarte Segmente schneiden. Basierend auf dieser Tatsache haben wir den Status und ihn während des gesamten Algorithmus beibehalten. Ich habe in diesem Fall versucht, eine ähnliche Idee zu finden, und bisher ohne Erfolg kann ich nur sagen, dass sich zwei Rechtecke schneiden, wenn sich ihre entsprechenden x- und y- Koordinaten überlappen.
Das Problem ist, wie und gewartet wird und wie komplex das Erstellen und Verwalten von T ist. Ich gehe davon aus, dass R-Bäume in diesem Fall sehr nützlich sein können, aber wie ich festgestellt habe, ist es sehr schwierig, das minimale Begrenzungsrechteck mithilfe von R-Bäumen zu bestimmen.
Haben Sie eine Idee, wie Sie dieses Problem lösen und insbesondere wie Sie bauen können ?
Antworten:
Für den allgemeinen Fall ist der offensichtliche Trick nicht ganz so schnell. Verwenden Sie den Standard-Sweep-Line-Algorithmus, um die gesamte durch die Rechtecke induzierte planare Unterteilung zu berechnen.
quelle