PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : effiziente Bezier-Curves/Patches Tesslation (Achtung Mathe :-)


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!

zeckensack
2004-04-16, 04:10:52
:|

Gegenvorschlag:
zweite Ableitung des Polynoms bilden (Krümmung ist eigentlich das Kriterium hier ...), Betragsmaxima suchen, Polynom dort ausrechnen, zwei Geraden ziehen, vom Polyonom abziehen
=> neue Polynome gleichen Grades in eingeschränkten Wertebereichen

Rekursion bis das Betragsmaximum der Krümmung einen gewählten Schwellwert unterschreitet.

Vorteil: die Ableitung ist IMO ein bisserl einfacher zu implementieren als dieses Integral-Zeug ;)
Nachteil: tja, äh, keiner? ?(

Corrail
2004-04-16, 13:13:28
Ja, das mit dem zwei mal ableiten und die neue Funktion dort betrachten hab ich mir auch schon überlegt. Nur das Problem bei dieer Methode ist, dass es nicht allgemein anwendbar ist. Man muss sich immer die Wendepunkte ausrechnen und hat dadurch wieder Spezialfälle, die man berücksichtigen muss.
Mir ist dann im Bett noch was eingefallen... :-)
sei
f(x) = sqrt(mx(x)² + my(x)² + mz(x)²)
g(a) = integral f(x) von 0 bis a

g(a) erfüllt folgende Eigenschaften:
Bijektion
strikt monoton steigend
g(0) = 0
g(1) = H

Wenn ich jetzt mein g(a) durch H dividiere bekomm ich eine Bijektion von [0;1] -> [0;1].
Jetzt könnte ich von g(a)/H explizit eine Umkehrfunktion finden. Diese ist natürlich emens komplex. Aber ich brauche die Genauigkeit nicht unbedingt, also kann ich sie nach z.B. Taylor entwickeln. Wenn mein Bezier-Patch statisch ist, kann ich das alles vorher machen (nicht in Echtzeit). Also hab ich dann in Echtzeit eigentlich nur folgendes zu tun:
sei t(x) meine Umkehrfunktion von g(a)/H nach Taylor entwickelt
Dann teil ich das Interval [0;1] in f Teile und setze diese Teile mal in t(x) ein. Erst dieses Ergebnis wiederum setze ich in meinem Bezier-Polynom p(x) ein.

Vorteil von der Methode ist, dass sie allgemein gehandelbar ist. Man kann einen Großteil im Vorfeld abhandeln und hat nachher nur 2 Polynome
Nachteil ist, dass es nur auf statischen Patches/Curves funktioniert.

Frank
2004-04-17, 22:39:17
Original geschrieben von zeckensack
Vorteil: die Ableitung ist IMO ein bisserl einfacher zu implementieren als dieses Integral-Zeug ;)
Nachteil: tja, äh, keiner? ?( Wobei es für die Integration einer Bézierkurve auch eine feste Formel gibt - genau wie bei der Ableitung. Generell ist letzteres aber natürlich 1000x einfacher.

Haarmann
2004-04-18, 08:46:01
Nur so Nebenher... ist das nicht "etwas" viel Aufwand? Das müsste man ja "online" machen und nicht vorher.

Corrail
2004-04-18, 12:51:22
Original geschrieben von Haarmann
Nur so Nebenher... ist das nicht "etwas" viel Aufwand? Das müsste man ja "online" machen und nicht vorher.

Nein, eigentlich nicht. In Echtzeit hat man (wenn man es richtig vorbreitet) nur zwei Polynome und das ist IMHO nicht allzu viel Aufwand.