Ich habe eine große Anzahl von 2D-Punkten und möchte schnell diejenigen finden, die in einem bestimmten Rechteck liegen. Nehmen wir an, ein '.' ist ein beliebiger Punkt und 'X' ist ein Punkt, den ich innerhalb eines Rechtecks finden möchte, das 'T' als TopLeft- und 'B' als BottomRight-Punkt hat:
. . . . . .
. T-----+ .
. | X X | .
. +-----B .
. . . . . .
Ich habe ein std::set mit einem Sortierfaktor ausprobiert, der den TopLeft-Punkt am Anfang und den BottomRight-Punkt am Ende des Sets sortiert. Wenn ich zuerst nach dem X-Wert sortiere, würde dies dazu führen, dass die folgenden Punkte gefunden werden.
. . . . . .
. T-----+ .
X | X X | X
. +-----B .
. . . . . .
Das bedeutet, dass ich für jeden gefundenen Punkt prüfen müsste, ob er wirklich innerhalb des Rechtecks liegt. Das ist nicht wirklich gut.
Wie könnte man das besser machen?
Meine Sprache ist C++ (Windows) und ich habe sowohl die STL als auch Boost zur Verfügung.
Update
Nachdem ich die bisherigen Antworten gelesen habe, ist mir aufgefallen, dass ich nicht alle Parameter meines Problems berücksichtigt habe: Es gibt nicht ein festes Rechteck. Die Rechtecke können vom Benutzer zur Laufzeit festgelegt werden. Das bedeutet, dass das Sortieren der Punktmenge effizienter zu sein verspricht als eine lineare Suche durch alle Punkte, wie sie Artelius vor dieser Aktualisierung vorgeschlagen hat. Ich werde es aber trotzdem versuchen! Ich erwarte nicht, dass der Benutzer ein Rechteck setzt sehr häufig. Im Hinblick auf den Implementierungsaufwand könnte sich das für mich also als gute Lösung erweisen.