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ü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)


Anmelden zum Antworten