Länge einer Bezierkurve
-
Hallo zusammen!
Wäre schön, wenn mir jemand bei folgendem Problem weiterhelfen könnte.
Ausgangslage:
Es ist mir bis jetzt möglich, die Länge einer Bezierkurve, mit 2,3 u. 6
Kontrollpunkten mit Hilfe der NR(Numerical Recipes)-Bibliotheken zu
berechnen.
d.h.: ich gebe den Betrag der ersten Ableitung der Bezierkurve in Form
einer C-Funktion vor und lasse diese dann mit einer entsprechenden
Integralroutine von NR bearbeiten und die Länge numerisch ermitteln.Soweit bin ich schon mal sehr zufrieden!
Jetzt hätte ich es aber auch noch ganz gerne, dass ich nicht nur für einen
vorgegebenen Wertebereich 0 bis t die Länge l sondern auch umgekehrt für
eine vorgegebene Länge l die Größe t ermitteln kann.
--> Dafür bräuchte ich aber die Umkehrfunktion der Längenfunktion l(t)!
--> und dafür wiederum bräuchte ich zwangsläufig das Integral von
t=0 bis beliebiges t über dem Betrag der ersten Ableitung der Bezier-
kurve (den Betrag der ersten Ableitung hab ich!!!)Gibt es irgendeine Möglichkeit an die Umkehrfunktion der Längenfunktion
der Bezierkurve heranzukommen oder kann man auch t in Abhängigkeit von l
numerisch berechnen?Ich wäre sehr dankbar, wenn mir jemand weiterhelfen könnte!
Grüße,
TOM++
-
wäre vielleicht einfacher, wenn Deine Ausgangsfunktion hier stehen würde.. dann könnte man sie umstellen..
-
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ützstellenBn'(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)