Testen Sie, ob der Punkt in manchen Rechteck
Ich habe eine große Sammlung von Rechtecken, die alle die gleiche Größe. Ich bin Generierung von Zufallszahlen Punkte, die nicht fallen in diese Rechtecke, also, was ich tun möchte, ist zu testen, ob der erzeugte Punkt liegt in einem der Rechtecke, und wenn es das tut, erzeugen Sie einen neuen Punkt ein.
Verwendung von R-Bäumen zu arbeiten scheinen, aber Sie sind eigentlich für Rechtecke und keine Punkte. Ich könnte mit einer modifizierten version eines R-Baum-Algorithmus, das funktioniert mit den Punkten zu, aber ich möchte lieber nicht das Rad neu erfinden, wenn es schon einige bessere Lösung. Ich bin nicht sehr vertraut mit Daten-Strukturen, also vielleicht es gibt schon eine gewisse Struktur, die funktioniert für mein problem?
In der Zusammenfassung, im Grunde, was ich Frage, ist, ob jemand weiß, von einem guten Algorithmus, das funktioniert in Python, das kann verwendet werden, um zu überprüfen, ob ein Punkt liegt in jedes Rechteck in einem gegebenen Satz von Rechtecken.
edit: Das ist in 2D, und die Rechtecke sind nicht verdreht.
Sie sind alle ausgerichtet, keine rotation oder etwas Phantasie, wie
tun die Rechtecke überlappen?
Ja, es ist durchaus möglich, dass sich die Rechtecke überlappen
InformationsquelleAutor pafcu | 2009-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesem Reddit-thread-Adressen Ihr problem:
Ich habe eine Reihe von Rechtecken, und benötigen, um zu bestimmen, ob ein Punkt enthalten ist, innerhalb einer von Ihnen. Was sind einige gute Daten-Strukturen, um dies zu tun, mit schnellen lookup-sein wichtig?
Wenn Ihr Universum ist integer, oder wenn die Präzision ist gut bekannt und wird nicht zu hoch sein, können Sie abelsson's Vorschlag aus dem thread, mit O(1) lookup mit Farbstoff:
Ich empfehle Euch, geht zu post und vollständig gelesen ModernRonin's Antwort, die am meisten akzeptierte. Ich klebte es hier:
Wieder Kredit zu ModernRonin...
Die Vektor-Produkt ermöglicht ein Rechteck beliebiger Orientierung; ich bin sicher, dass andere Methoden besser geeignet sind, wenn alle Rechtecke sind, ausgerichtet an den Achsen von einem Koordinatensystem.
Auch die Vektor-Produkt-Methode ermöglicht ein um zu überprüfen, ob ein Punkt im inneren eines jeden 4-seitige Form, ob oder nicht es ist ein Rechteck.
InformationsquelleAutor Roee Adler
Für Rechtecke, die ausgerichtet sind mit den Achsen, brauchen Sie nur zwei Punkte (vier Ziffern) zu identifizieren, die Rechteck - konventionell, unteren linken und oberen rechten Ecken. Um festzustellen, ob einem gegebenen Punkt (Xtest, Ytest) überlappt mit einem Rechteck (XBL, YBL, XTR, YTR) Test:
Klar, für eine ausreichend große Anzahl von Punkten zu testen, könnte dies ziemlich zeitaufwendig. Die Frage ist also, wie die Optimierung der Tests.
Klar, eine Optimierung ist die Festlegung der minimalen und maximalen X-und Y-Werte für das Feld um alle Rechtecke (bounding box): eine schnelle test auf dieser zeigt, ob es gibt keine Notwendigkeit, weiter zu suchen.
Je nachdem, wie viel von der gesamten Oberfläche bedeckt ist mit Rechtecken, die Sie vielleicht in der Lage sein zu finden, nicht überlappende Teilbereiche, die Rechtecke enthalten, und Sie können dann vermeiden, auf der Suche diesen sub-Gebieten, die nicht enthalten ein Rechteck überlappen der Punkt, wieder speichern vergleichen während der Suche auf Kosten der pre-Berechnung von geeigneten Datenstrukturen. Wenn die Menge der Rechtecke ist spärlich genug, kann es keine überschneidungen, in welchem Fall diese degeneriert in der brute-force-Suche. Ebenso, wenn die Menge der Rechtecke ist so dicht, dass es keine sub-Bereiche, die in der bounding-box, kann aufgeteilt werden, ohne zu brechen Rechtecke.
Jedoch, Sie könnte auch willkürlich brechen die Begrenzungsrahmen in, sagen wir, Viertel (die Hälfte in jede Richtung). Dann könnten Sie über eine Liste von Feldern, die mit mehr Boxen als im original-set (zwei oder vier Boxen für jede box, überlappt eine der willkürlichen Grenzziehungen). Dies hat den Vorteil, dass Sie könnten, dann beseitigen Sie drei der vier Quartale von der Suche, die Verringerung der Menge des Suchens getan werden, insgesamt - auf Kosten der auxiliary storage.
So, es gibt Raum-Zeit-trade-offs, wie immer. Und pre-computation-versus-Suche von trade-offs. Wenn man Pech hat, sind die pre-Berechnung bringt nichts (es gibt zum Beispiel zwei Boxen nur, und Sie sich nicht überlappen, auf beide Achsen). Auf der anderen Seite, könnte es zu erheblicher such-Zeit profitieren.
InformationsquelleAutor Jonathan Leffler
Warum nicht versuchen, diese. Es scheint vielmehr Licht auf die Berechnung und Speicher.
Betrachten Sie die Projektionen aller Rechtecke auf der base line von Ihrem Platz. Zu zeigen, dass Satz von Linien-Abständen, wie
Nehmen wir nun an, dein Punkt ist (x, y), starten Sie eine Suche bei den Links von dieser Reihe, bis Sie eine Zeile Intervall, das enthält den Punkt x.
Wenn keiner wird, der Punkt (x,y) ist, die außerhalb aller Rechtecke.
Wenn es einige tun, sagen, [Rlk, Rrk], ..., [Rlh, Rrh], (k <= h), dann prüfen Sie einfach, ob y ist innerhalb der vertikalen Ausdehnung jedes dieser Rechtecke.
Getan.
Glück.
John Döner
InformationsquelleAutor John R Doner
Ich schlage vor, Sie nehmen einen Blick auf BSP-Bäume (und möglich quadtrees oder octrees, links auf dieser Seite). Sie werden verwendet, um die partition, die den gesamten Raum rekursiv und ermöglichen es Ihnen, schnell zu überprüfen, ob ein Punkt, mit dem die Rechtecke, die Sie brauchen, um zu überprüfen, zu alle.
Mindestens Sie müssen nur mit einer großen partition und überprüfen müssen, um alle Rechtecke, höchstens deine Partitionen so klein, dass Sie runter, um die Größe der einzelnen Rechtecke. Natürlich feiner die partition, desto länger benötigen Sie zu Fuß nach unten den Baum um zu finden, die Rechtecke, die Sie überprüfen möchten.
Allerdings können Sie frei entscheiden, wie viele Rechtecke, die geeignet sind, überprüft werden, für einen Punkt und erstellen Sie dann eine entsprechende Struktur.
Achten Sie auf sich überlappende Rechtecke obwohl. Als die BSP-Baum werden muss vorausberechnete sowieso, kann man da auch "überlappungen entfernen" während dieser Zeit, so können Sie Partitionen löschen.
InformationsquelleAutor Frank
Ihre R-tree-Ansatz ist der beste Ansatz, den ich kenne (das ist der Ansatz, den ich wählen würde, über quadtrees, B+ - Bäume, BSP-Bäume, R-Bäume scheinen bequem zu bauen, in deinem Fall). Caveat: ich bin kein Experte, obwohl ich erinnere mich an ein paar Dinge von meinem senior-Jahr an der Universität-Klasse von algorithmischen!
InformationsquelleAutor Eric O Lebigot