Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Kontrollpunktberechnung bei quadratischen/kubischen Beziers
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Mathe-Forum -> Kontrollpunktberechnung bei quadratischen/kubischen Beziers
 
Autor Nachricht
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 27 Jun 2005 - 19:35:16    Titel:

Für kubische geht es analog:

x_2 = (x-x_0 (1-u)^3-x_1 3u(1-u)^2-x_3 u^3)/(3u^2(1-u))
y_2 = (y-y_0 (1-u)^3-y_1 3u(1-u)^2-y_3 u^3)/(3u^2(1-u))

Wenn Du beide Kontrollpunkte rauskriegen willst anhand zweier Punkte, (und u's) die Gegeben sind, so wird es auf ein lineares Gleichungssystem hinauslaufen.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 27 Jun 2005 - 22:09:48    Titel:

Wenn ich das richtig verstehe, berechnet das nur einen von zwei in der kubischen Kurve vorhandenen Kontrollpunkte. Mit deinem letzten Satzkann ich leider nicht viel anfangen, kannst du es vielleicht genauer ausdrücken?

Ich bezweifle, das sich beide Kontrollpunkte durch zwei Ankerpunkte und nur einen Punkt auf der Kurve definieren lassen. Jetzt wird das ganze auch etwas schwieriger als mit der quadratischen Kurve. Ist es aber möglich die beiden Kontrollpunkte anhand der beiden Ankerpunkte und zwei Punkten auf der Kurve zu berechnen?

Vielen Dank
sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 27 Jun 2005 - 22:26:19    Titel:

Ja das geht, wie ich es oben bereits erwähnt habe Smile Die kubische Kurve ist definiert durch

x = x_0 (1-u)^3 + x_1 3u(1-u)^2 + x_2 3u^2(1-u) + x_3 u^3
y = y_0 (1-u)^3 + y_1 3u(1-u)^2 + y_2 3u^2(1-u) + y_3 u^3

Gegeben sind zwei paare (x,y,u) und (x',y',u') von (verschiedenen) Punkten auf der Kurve und entsprechende u-Werte. Gesucht sind dann x_1,x_2,y_1,y_2. Es ergibt sich durch Einsetzen das folgende LGS

x = x_0 (1-u)^3 + x_1 3u(1-u)^2 + x_2 3u^2(1-u) + x_3 u^3
y = y_0 (1-u)^3 + y_1 3u(1-u)^2 + y_2 3u^2(1-u) + y_3 u^3
x' = x_0 (1-u')^3 + x_1 3u'(1-u')^2 + x_2 3u'^2(1-u') + x_3 u'^3
y' = y_0 (1-u')^3 + y_1 3u'(1-u')^2 + y_2 3u'^2(1-u') + y_3 u'^3

Umordnen nach unbekannten ergibt

x_1 [3u(1-u)^2] + x_2 [3u^2(1-u)] = x - x_0 (1-u)^3 - x_3 u^3
y_1 [3u(1-u)^2] + y_2 [3u^2(1-u)] = y - y_0 (1-u)^3 - y_3 u^3
x_1 [3u'(1-u')^2] + x_2 [3u'^2(1-u')] = x' - x_0 (1-u')^3 - x_3 u'^3
y_1 [3u'(1-u')^2] + y_2 [3u'^2(1-u')] = y' - y_0 (1-u')^3 - y_3 u'^3

Eingeben in ein CAS ergibt:

Code:

>> solve({eq1,eq2,eq3,eq4},{x_1,x_2,y_1,y_2});

         / { --          2       3      2        3        2       3
piecewise| { |  x_1 = (u1  x - u1  x + u  x_0 - u  x_0 - u  xs + u  xs -
         \ { --

     2         3             2          2                3
   u1  x_0 + u1  x_0 + 3 u u1  x_0 - 3 u  u1 x_0 - 3 u u1  x_0 +

      3             2   3          3   2        2   3        3   2
   3 u  u1 x_0 + 2 u  u1  x_0 - 2 u  u1  x_0 + u  u1  x_3 - u  u1  x_3) /

          2      2            3      3         2   3      3   2
   (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),

                  2       3        2        3          2       3
   x_2 = - (- 2 u1  x + u1  x - 2 u  x_0 + u  x_0 + 2 u  xs - u  xs +

       2         3                                            2
   2 u1  x_0 - u1  x_0 + u1 x + u x_0 - u xs - u1 x_0 - 3 u u1  x_0 +

      2                3          3              3        3
   3 u  u1 x_0 + 2 u u1  x_0 - 2 u  u1 x_0 + u u1  x_3 - u  u1 x_3 -

    2   3        3   2          2   3          3   2
   u  u1  x_0 + u  u1  x_0 - 2 u  u1  x_3 + 2 u  u1  x_3) /

          2      2            3      3         2   3      3   2
   (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),

            2       3      2        3        2       3        2
   y_1 = (u1  y - u1  y + u  y_0 - u  y_0 - u  ys + u  ys - u1  y_0 +

     3             2          2                3          3
   u1  y_0 + 3 u u1  y_0 - 3 u  u1 y_0 - 3 u u1  y_0 + 3 u  u1 y_0 +

      2   3          3   2        2   3        3   2
   2 u  u1  y_0 - 2 u  u1  y_0 + u  u1  y_3 - u  u1  y_3) /

          2      2            3      3         2   3      3   2
   (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),

                  2       3        2        3          2       3
   y_2 = - (- 2 u1  y + u1  y - 2 u  y_0 + u  y_0 + 2 u  ys - u  ys +

       2         3                                            2
   2 u1  y_0 - u1  y_0 + u1 y + u y_0 - u ys - u1 y_0 - 3 u u1  y_0 +

      2                3          3              3        3
   3 u  u1 y_0 + 2 u u1  y_0 - 2 u  u1 y_0 + u u1  y_3 - u  u1 y_3 -

    2   3        3   2          2   3          3   2
   u  u1  y_0 + u  u1  y_0 - 2 u  u1  y_3 + 2 u  u1  y_3) /

          2      2            3      3         2   3      3   2  -- }
   (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 )  | } if
                                                                 -- }

           2                2       3
   - 3 u u1  + 3 u u1 - 3 u1  + 3 u1  <> 0 and u in C_ minus {0, 1},

   { --                      2         3           2           3
   { |  x_1 = (x - x_0 - 3 u1  x_0 + u1  x_0 - 3 u1  x_2 + 3 u1  x_2 -
   { --

     3                               2       3
   u1  x_3 + 3 u1 x_0) / (3 u1 - 6 u1  + 3 u1 ),

                           2         3           2           3
   y_1 = - (y_0 - ys + 3 u1  y_0 - u1  y_0 + 3 u1  y_2 - 3 u1  y_2 +

     3                               2       3  -- }
   u1  y_3 - 3 u1 y_0) / (3 u1 - 6 u1  + 3 u1 )  | } if
                                                -- }

           2                2       3
   - 3 u u1  + 3 u u1 - 3 u1  + 3 u1  = 0 and x - xs = 0 and

   y - ys = 0 and u1 <> 0 and u1 <> 1, {} if

                                              2                2       3
   (- x + xs <> 0 or y - ys <> 0) and - 3 u u1  + 3 u u1 - 3 u1  + 3 u1  =

     \
   0 |
     /
>>   


Dabei ist xs = x', ys = y', u1 = u'.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 27 Jun 2005 - 23:22:07    Titel:

Ach du heilige Wildsau !

Hab mir zwar gedacht, dass es mit mehr Komponenten etwas größer wird, aber SO groß ?! Aber da kann man garantiert noch was dran machen was ?! Shocked Shocked Shocked

Hab die Ausgabe deines CAS mal überflogen. Ich kenn mich nicht mit deinem CAS aus, aber kann es sein, dass es die Bedingungen zu den jeweiligen Berechnung nach den Berechnungen schreibt ?

MfG sHo

PS.: Kannst du mir sagen was "u in C_ minus {0, 1}" in der ersten Bedingung zu bedeuten hat?
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 27 Jun 2005 - 23:33:53    Titel:

Ja genau. Ich drösle das mal ein wenig auf

Für den Fall, daß

Code:
 
            2                2       3
    - 3 u u1  + 3 u u1 - 3 u1  + 3 u1  <> 0 and u in C_ minus {0, 1},


C_ bedeutet u ist komplex Smile ohne der 0 und der 1, aber das habe ich ja bereits vorausgesetzt, indem ich gesagt habe, daß die Punkte keine Ankerpunkte sein dürfen. In diesem Fall ergibt sich für die Werte:

Wert von x_1

Code:

         / { --          2       3      2        3        2       3
 piecewise| { |  x_1 = (u1  x - u1  x + u  x_0 - u  x_0 - u  xs + u  xs -
          \ { --
 
      2         3             2          2                3
    u1  x_0 + u1  x_0 + 3 u u1  x_0 - 3 u  u1 x_0 - 3 u u1  x_0 +
 
       3             2   3          3   2        2   3        3   2
    3 u  u1 x_0 + 2 u  u1  x_0 - 2 u  u1  x_0 + u  u1  x_3 - u  u1  x_3) /
 
           2      2            3      3         2   3      3   2
    (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),


Wert von x2:

Code:

                   2       3        2        3          2       3
    x_2 = - (- 2 u1  x + u1  x - 2 u  x_0 + u  x_0 + 2 u  xs - u  xs +
 
        2         3                                            2
    2 u1  x_0 - u1  x_0 + u1 x + u x_0 - u xs - u1 x_0 - 3 u u1  x_0 +
 
       2                3          3              3        3
    3 u  u1 x_0 + 2 u u1  x_0 - 2 u  u1 x_0 + u u1  x_3 - u  u1 x_3 -
 
     2   3        3   2          2   3          3   2
    u  u1  x_0 + u  u1  x_0 - 2 u  u1  x_3 + 2 u  u1  x_3) /
 
           2      2            3      3         2   3      3   2
    (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),


Wert von y_1

Code:

             2       3      2        3        2       3        2
    y_1 = (u1  y - u1  y + u  y_0 - u  y_0 - u  ys + u  ys - u1  y_0 +
 
      3             2          2                3          3
    u1  y_0 + 3 u u1  y_0 - 3 u  u1 y_0 - 3 u u1  y_0 + 3 u  u1 y_0 +
 
       2   3          3   2        2   3        3   2
    2 u  u1  y_0 - 2 u  u1  y_0 + u  u1  y_3 - u  u1  y_3) /
 
           2      2            3      3         2   3      3   2
    (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 ),


Wert von y2

Code:

                   2       3        2        3          2       3
    y_2 = - (- 2 u1  y + u1  y - 2 u  y_0 + u  y_0 + 2 u  ys - u  ys +
 
        2         3                                            2
    2 u1  y_0 - u1  y_0 + u1 y + u y_0 - u ys - u1 y_0 - 3 u u1  y_0 +
 
       2                3          3              3        3
    3 u  u1 y_0 + 2 u u1  y_0 - 2 u  u1 y_0 + u u1  y_3 - u  u1 y_3 -
 
     2   3        3   2          2   3          3   2
    u  u1  y_0 + u  u1  y_0 - 2 u  u1  y_3 + 2 u  u1  y_3) /
 
           2      2            3      3         2   3      3   2  -- }
    (3 u u1  - 3 u  u1 - 3 u u1  + 3 u  u1 + 3 u  u1  - 3 u  u1 )  | } if
                                                                  -- }


Diesen, sowie den letzten Fall habe ich ausgeschlossen indem ich gesagt habe, daß die zwei Punkte verschieden sind.

Code:

             2                2       3
    - 3 u u1  + 3 u u1 - 3 u1  + 3 u1  = 0 and x - xs = 0 and
 
    y - ys = 0 and u1 <> 0 and u1 <> 1


usw.

D.h. für Dich ist nur der Fall 1 relevant (oben). Der Nenner wird bei allen Lösungen wohl gleich sein (da es sich wohl um die Determinantenlösung handelt) und hoffentlich ungleich 0. Daher ist es sinnvoll den Nenner zuerst zu berechnen und dann einfach dadurch teilen. Mach mal eine ASSERTION für den Nenner = 0 und sag mir, wenn's vorkommt. Dann überlege ich mir was das bedeutet Smile

Laut CAS gilt das für den Fall, daß die Punkte verschieden sind aber der Nenner gleich 0 ist (allerletzter case). Dann gibt es keine Lösung. Ich glaube aber, daß es eine geometrische Bedeutung hat.
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 27 Jun 2005 - 23:39:43    Titel:

Zitat:
Hab mir zwar gedacht, dass es mit mehr Komponenten etwas größer wird, aber SO groß ?!


Ich glaube der Wachstum ist exponentiell Smile
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 28 Jun 2005 - 00:07:25    Titel:

Ich glaube Du hast meine Warnung von oben nicht ganz ernstgenommen. Sowohl für den quadratischen als auch für den kubischen Fall dürfen die Punkte auf keinen Fall mit den Ankern übereinstimmen und gleich sein! Sonst passiert was ähnliches, wie jetzt in deinem Programm, wenn man mit u nach ganz rechts (1) oder ganz links (0) geht und dann versucht den Punkt zu bewegen Smile
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 28 Jun 2005 - 22:58:08    Titel:

Hat's funktioniert?
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 29 Jun 2005 - 13:56:29    Titel:

Sorry ich musst erst einmal das Wetter nutzen Cool .. aber jetz kanns weiter gehen! Very Happy

Zitat:
Ich glaube der Wachstum ist exponentiell

Gut, dass das Optimum zwischen Flexibilität und Rechenaufwand der Freiformkurven bei der kubischen liegt .. Wink

Dass einer der Punkte auf der Linie (oder beide) nicht gleich den Ankerpunkten (u > 0 && u < 1) sein dürfen ist klar. Wär aber auch unlogisch sowas zu berechnen .. daher hab ich das von vorn herrein auch ausgeschlossen. Genauso wie die beiden Punkte nicht an gleicher Position (u <> u') der Kurve liegen dürfen.

Ich habe deine Formeln mal etwas übersichtlicher aufgeschrieben.

nenner = -3 * (-1 + u) * u * (u - u1) * (-1 + u1) * u1

p1 = (ps * (u - 1) * u^2 + u1^2 * (p - p * u1 + p3 * u^2 * (-u + u1)) - p0 * (u - 1) * (u1 - 1) * (u1^2 - 2 * u * u1^2 + u^2 * (2 * u1 - 1))) / nenner

p2 = (ps * (u - 1)^2 * u - p0 * (u - 1)^2 * (u - u1) * (u1 - 1)^2 - u1 * (p * (u1 - 1)^2 + p3 * u * (u1^2 - 2 * u * u1^2 + u^2 * (2 * u1 - 1)))) / nenner

wobei ich deine bezeichungen verallgemeinert habe.

p0 = x_0, y_0
p1 = x_1, y_1
p2 = x_2, y_2
p3 = x_3, y_3
p = x , y
ps = xs , ys

Eine kleine Assertion hab ich auch mal gemacht, mit dem Ergebniss: Der Nenner wird nur 0 wenn ein Punkt auf einem Ankerpunkt oder ein Punkt auf dem anderen Punkt liegt. Also wenn die oben schon ausgeschlossenen Fälle vorliegen.

Soweit klappts auch super ! Bin nur noch dabei das Programm zu optimieren.

Vielen Dank nochmal!

MfG sHo
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 29 Jun 2005 - 14:33:55    Titel:

Hier mal zum anschauen : [gelöscht]

MfG sHo


Zuletzt bearbeitet von sHo am 18 Okt 2013 - 12:56:24, insgesamt einmal bearbeitet
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Mathe-Forum -> Kontrollpunktberechnung bei quadratischen/kubischen Beziers
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter
Seite 2 von 6

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum