eXile hat geschrieben:Zudomon hat geschrieben:... Die Eingabevektoren bräuchten nicht normalisiert sein und wenn ich mich nicht irre, hat man ein Laufzeit von O(1) :D
Dann konstruiere ich einfach einen Eingabevektor, welcher nicht genau zwischen zwei vorhandenen Vektoren liegt, sondern um ein Epsilon daneben. Wenn man dabei das Machine-Epsilon für floats nimmt: Viel Spaß mit einer 2^23x2^23 Textur, um den Vektor korrekt zuzuordnen.
Ich verstehe das Problem nicht. Solange die unterschiede der Ausgangsvektoren groß genug sind, um von der Cubemap erfasst zu werden, hat man zwar eine gewisse Quantisierung, wie bei Shadowmaps auch, aber man erhält für jeden Eingabevektor einen Index zurück. Da ist es egal, um wie viele Epsilons der verschoben wird. ;)
Die Frage ist einfach, will man O(1) und wenn ja, ist man bereit, dafür einige Dinge in Kauf zu nehmen, wie etwa Quantisierung.
Aber vielleicht sollte man erstmal wissen, was GENAU hier gefordert ist, bzw. was realisiert werden soll.
EyDu hat geschrieben:Baut mein eine Cubemap auf, hat man allerdings ein kleines Speicherproblem: Angenommen, ein Punkt ist gleich einem anderen, wenn dieser eine Abweichung von < epsilon/2 hat. Sind wir aber mal großzügig und testen gegen Würfelgrößen mit der Kantenlänge epsilon. Hat man dazu noch die Ausdehnung si der Achsen i=1,..,n , so muss jede Achse ui=si/epsilon Unterteilungen enthalten. Damit erhält man für die gesamte Cubemap u1*u2*...*un Würfel. Zum Testen, ob ein Punkt bereits enthalten ist, müssten noch alle (3^n)-1 Würfel betrachtet werden, da ein Punkt natürlich am Rand eines Würfels liegen kann. Viel Problematischer ist allerdings, dass damit der Test nicht von der Anzahl N der Punkte abhängt sondern von der Verteilung der Punkte! Löst man das Problem über ein Dictionary (oder für die C++'ler eine Map), dann könnte man den Ansatz wahrscheinlich noch retten.
Vielleicht solltest du dir nochmal genau anschauen, wie mein Algo aussieht! Denn hier muss nichts geprüft werden, man hat die Texturkoordinate, welche den Eingangsvektor darstellt, sampelt damit die Cubemap und erhält den Index des Vektors, welcher ( Quantisierung beachten! ) am ehesten in die selbe Richtung zeigt, wie der Eingangsvektor.
Bei meinem Ansatz wird auch nicht getestet, ob ein Vektor schon enthalten ist, denn ich bin davon ausgegangen, dass man eine bestimmte Anzahl vorgegebener Richtungen hat. Diese werden dann vorher in die Cubemap eingetragen, diese anschließend angepasst, und dann fröhlich reingesampelt.
Zudomon hat geschrieben:... man nehme eine leere Cubemap, die müsste als Maximalauflösung so detailliert sein, dass sie alle Vektoren auflösen kann.
Mit diesem Satz wollte ich eigentlich darauf Aufmerksam machen, was gegeben sein muss. Das man mit diesem Ansatz nicht unendlich detailliert auflösen kann, sollte klar sein.
MfG
Zudo