Corrail
2004-04-16, 02:29:57
Hi all!
Ich hab mir mal ein bissi Gedanken über eine effiziente Bezier-Curve Tesslation gemacht. Und zwar ist es doch eine Verschwendung wenn man das Intervall [0;1] einfach x-mal unterteile (wobei x meine Feinheit ist). Es werden die Teile der Kurve, wo sich die Kurve viel ändert genauso unterteilt, wie dort, wo die Kurve ziehmlich gerade ist.
Nun, es gibt einige Möglichkeiten wie z.B. adaptive Tesslation. Nun ist mir aber ein anderer Gedanke gekommen:
Sei b(x) mein Bezier-Polynom. Nun bilde ich im Interval [0;1] ein Bijektion von b(x) auf eine Gerade, die durch den Anfangspunkt b(0) = P0 und durch den Endpunkt b(1) = Pn geht, wobei für diese Gerade gilt: g(0) = P0 und g(1) = Pn.
Nun subtrahiere ich mein Bezier-Polynom von meiner geraden und erhalte ein weiteres Polynom m(x) = b(x) - g(x). Dieses Polynom kann man sich jetzt als "Fläche" zwischen b(x) und g(x) vorstellen. Wenn ich jetzt den Satz von Pythagoras darauf anwende, um auf die Längen dieser Vekoren (im 3d Raum betrachtet) zu kommen bekomm ich:
f(x) = sqrt(mx(x)² + my(x)² + mz(x)²)
Wobei mx, my und mz die x, y und z Anteile der Vektoren sind. Diese Funktion einmal integriert ist im Interval [0;1] eine Bijektion, da f(x) monoton steigen ist. Wenn ich mir jetzt das bestimmte Integral an den Grenzen von 0 bis 1 ausrechne und es q-mal teile (wobei hier q meine Feinheit ist) kann ich von jedem Teil a*q (wobei a von 0 bis q läuft) auf den x-Wert im Interval [0;1] zurückschließen, da die integrierte Funktion von f(x) eine Bijektion ist. Nun hab ich meine "neuen" x, die ich dann in das ursprüngliche Bezier-Polynom einsetze.
Was ich damit erreicht habe ist, dass die Fläche zwischen der direkten Gerade und der Bezier-Kurve in jedem Teil konstant ist. Dies sollte bessere Zerlegung der Bezier-Kurve ergeben.
Theoretisch kann man das genau so für Bezier-Patches machen, wobei man hier das Volumen betrachen müsste.
Das Problem bei dem ganzen ist, dass es nicht gerade unaufwendig ist. Betrachtet man ein Bezier-Polynom des Grades 4, so hat das Quadrat den Grad 8. Das ganze Integriert ergibt Grad 9. Da die Bijektion (also vom y-Wert auf den x-Wert zurückrechnen) anzuwenden ist hart. Aber eventuell lässt sich da einiges vorberechnen, um das ganze effektiv in Echtzeit verwenden zu können.
Was hälts ihr davon? Bin für Fragen und jeden Feedback gerne offen!
Ich hab mir mal ein bissi Gedanken über eine effiziente Bezier-Curve Tesslation gemacht. Und zwar ist es doch eine Verschwendung wenn man das Intervall [0;1] einfach x-mal unterteile (wobei x meine Feinheit ist). Es werden die Teile der Kurve, wo sich die Kurve viel ändert genauso unterteilt, wie dort, wo die Kurve ziehmlich gerade ist.
Nun, es gibt einige Möglichkeiten wie z.B. adaptive Tesslation. Nun ist mir aber ein anderer Gedanke gekommen:
Sei b(x) mein Bezier-Polynom. Nun bilde ich im Interval [0;1] ein Bijektion von b(x) auf eine Gerade, die durch den Anfangspunkt b(0) = P0 und durch den Endpunkt b(1) = Pn geht, wobei für diese Gerade gilt: g(0) = P0 und g(1) = Pn.
Nun subtrahiere ich mein Bezier-Polynom von meiner geraden und erhalte ein weiteres Polynom m(x) = b(x) - g(x). Dieses Polynom kann man sich jetzt als "Fläche" zwischen b(x) und g(x) vorstellen. Wenn ich jetzt den Satz von Pythagoras darauf anwende, um auf die Längen dieser Vekoren (im 3d Raum betrachtet) zu kommen bekomm ich:
f(x) = sqrt(mx(x)² + my(x)² + mz(x)²)
Wobei mx, my und mz die x, y und z Anteile der Vektoren sind. Diese Funktion einmal integriert ist im Interval [0;1] eine Bijektion, da f(x) monoton steigen ist. Wenn ich mir jetzt das bestimmte Integral an den Grenzen von 0 bis 1 ausrechne und es q-mal teile (wobei hier q meine Feinheit ist) kann ich von jedem Teil a*q (wobei a von 0 bis q läuft) auf den x-Wert im Interval [0;1] zurückschließen, da die integrierte Funktion von f(x) eine Bijektion ist. Nun hab ich meine "neuen" x, die ich dann in das ursprüngliche Bezier-Polynom einsetze.
Was ich damit erreicht habe ist, dass die Fläche zwischen der direkten Gerade und der Bezier-Kurve in jedem Teil konstant ist. Dies sollte bessere Zerlegung der Bezier-Kurve ergeben.
Theoretisch kann man das genau so für Bezier-Patches machen, wobei man hier das Volumen betrachen müsste.
Das Problem bei dem ganzen ist, dass es nicht gerade unaufwendig ist. Betrachtet man ein Bezier-Polynom des Grades 4, so hat das Quadrat den Grad 8. Das ganze Integriert ergibt Grad 9. Da die Bijektion (also vom y-Wert auf den x-Wert zurückrechnen) anzuwenden ist hart. Aber eventuell lässt sich da einiges vorberechnen, um das ganze effektiv in Echtzeit verwenden zu können.
Was hälts ihr davon? Bin für Fragen und jeden Feedback gerne offen!