T
Also, dann wollen wir mal:
Ich stelle zunächst einmal mein Problem und eine mögliche Lösung
anhand einer Bezierkurve mit 2 Stützpunkten dar.
l(t):
-----
gesucht: l(t) = Integral(0;t) über | B'(t) | dt
- B'(t) ist die erste Ableitung einer Bezierkurve mit 2 Stützstellen
Bsp.:
B'(t) = ( x1-x0 , y1-y0 , z1-z0 )
- demzufolge entspricht der Betrag | B'(t) | :
Wurzel aus ( (x1-x0)(x1-x0)+(y1-y0)(y1-y0)+(z1-z0)*(z1-z0) )
--> für das Integral(0;t) über | B'(t) | ergibt sich demzufolge:
l(t) = Integral(0;t) über | B'(t) | dt
= Wurzel aus ((x1-x0)(x1-x0)+(y1-y0)(y1-y0)+(z1-z0)*(z1-z0)) * t LE
--> die Umkehrfunktion zu l(t) lässt sich demzufolge relativ leicht ermitteln:
t(l) = l / Wurzel aus ( (x1-x0)(x1-x0)+(y1-y0)(y1-y0)+(z1-z0)*(z1-z0) )
-------------------------------------------------------------------------------
=> Soviel zum Fall n=1 (also eine Bezierkurve mit 2 Stützpunkten)
Erhöhe ich jedoch nun n auf 2 oder gar 5, so wird die Rechnung schon
wesentlich komplizierter:
Bsp.: n=2:
B'(t)=
((x1-x0)*(1-t)+(x2-x1)*t ; (y1-y0)*(1-t)+(y2-y1)*t ; (z1-z0)*(1-t)+(z2-z1)*t)
--> der Betrag von B'(t) berechnet sich wie im ersten Beispiel.
--> nun bräuchte ich um nach l(t) = Integral(0;t) über |B'(t)| dt zu
kommen wiederum das Integral!
==> um dies zu umgehen nutzte ich bisher aus den Mathematikbibliotheken
von NR (Numerical Recipes -> www.nr.com)) die Funktion 'qromo'
(Romberg-Integral) um das Integral von 0 bis t numerisch zu
berechnen.
Dies hat bisher, auch bei 6 Stützstellen, wunderbar funktioniert.
Allerdings nützt mir nun der numerische Ansatz nichts mehr, da
ja für die Ermittlung der Umkehrfunktion t(l) zu l(t) das Integral
von 0 bis t über | B'(t) | dt tatsächlich vorliegen muss.
Dieses Integral jetzt per Hand zu berechnen, erweist sich als
äußerst aufwendig, besonders im Fall n=5.
Da wir Informatiker aber i.d.R. faul sind, bin ich auf der Suche
nach einem anderen Ansatz. Oder vielleicht existieren ja bereits
entsprechende Abhandlungen bezüglich diverser Längenoperationen
auf Bezierkurven.
Wäre schön, wenn jemand einen kleinen Tipp für mich hätte!
Danke!
TS++
P.S.:
zur Info (allgemeine Definition der ersten Ableitung einer Bezierkurve)
-> bei n+1 Stützstellen
Bn'(t) = n * Summe(i=0;n-1) (Pi+1 - Pi) * bi,n-1(t)
bi,n(t) = (n über i) * (t hoch i) * ((1-t) hoch (n-i))
(Bem.: Pi ist die Stützstelle(also Vektor) der Bezierkurve an der Stelle i)