Hallo.
Ich habe eine Input-Datei die folgendermaßen aussieht:
<22, 37, 68>, R:48
<24 5, 2>, R:200
<29, 1, 6>, R:57
...
Das sind kartesische Koordinaten mit einer Reichweitenangabe. Wenn man sich das bildlich vorstellt, ist das eine Ansammlung von Oktaedern im Raum.
Meine Aufgabe ist es, die Koordinate herauszufinden, welche am nächsten zum Ursprung liegt und von den meisten Oktaedern erfasst wird.
Das Problem ist, dass die Koordinaten in der Input-Datei extrem groß sind (im Milliardenbereich) und sehr weit außeinander liegen. Die Reichweiten sind ebenso extrem hoch. Eine (brute force) Suche nach jedem einzelnen Punkt wäre somit nicht möglich.
Ich habe mir gedacht, dass ich einen Octree benutzen könnte, aber wie finde ich damit den Punkt, den ich Suche? Ich müsste ja theoretisch den Raum in 8 teilen bis dieser eine Länge und Breite von 1 hat. Wenn ich dann jedesmal den "richtigen" Raum zum Teilen aussuche, würde ich irgendwann an dem Punkt ankommen.
Ich fange quasi mit dem ganzen Bereich an und stecke diesen in eine priority queue. Dann teile ich den Bereich in 8 Teile und berechne die Anzahl an Oktaederüberschneidungen in jedem der 8 Bereiche und wähle immer den Bereich, mit der größten Anzahl an Überschneidungen.
Quasi wie eine Binärsuche in 3D. Kennt jemand einen einfacheren weg? Die Koordinaten wurden ja nicht ohne Grund so hoch gewählt, gibt es hier einen mathematischen Trick mit dem man das ganze einfacher lösen kann?
Ich habe eine Input-Datei die folgendermaßen aussieht:
<22, 37, 68>, R:48
<24 5, 2>, R:200
<29, 1, 6>, R:57
...
Das sind kartesische Koordinaten mit einer Reichweitenangabe. Wenn man sich das bildlich vorstellt, ist das eine Ansammlung von Oktaedern im Raum.
Meine Aufgabe ist es, die Koordinate herauszufinden, welche am nächsten zum Ursprung liegt und von den meisten Oktaedern erfasst wird.
Das Problem ist, dass die Koordinaten in der Input-Datei extrem groß sind (im Milliardenbereich) und sehr weit außeinander liegen. Die Reichweiten sind ebenso extrem hoch. Eine (brute force) Suche nach jedem einzelnen Punkt wäre somit nicht möglich.
Ich habe mir gedacht, dass ich einen Octree benutzen könnte, aber wie finde ich damit den Punkt, den ich Suche? Ich müsste ja theoretisch den Raum in 8 teilen bis dieser eine Länge und Breite von 1 hat. Wenn ich dann jedesmal den "richtigen" Raum zum Teilen aussuche, würde ich irgendwann an dem Punkt ankommen.
Ich fange quasi mit dem ganzen Bereich an und stecke diesen in eine priority queue. Dann teile ich den Bereich in 8 Teile und berechne die Anzahl an Oktaederüberschneidungen in jedem der 8 Bereiche und wähle immer den Bereich, mit der größten Anzahl an Überschneidungen.
Quasi wie eine Binärsuche in 3D. Kennt jemand einen einfacheren weg? Die Koordinaten wurden ja nicht ohne Grund so hoch gewählt, gibt es hier einen mathematischen Trick mit dem man das ganze einfacher lösen kann?