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: 07 Jul 2005 - 13:30:52    Titel:

Bei mir sind es jetzt ca. 75%. Aber es fehlt ein Vergleichskriterium zu dem, was vorher war, denn ich glaube fürher war die Bildgröße nicht eingeschränkt. Ich prüfe im Vollbildmodus.

Ich schaue mir den Code an. Mein Tipp ist es die Steigung der Kurve zu berechnen für jeden Punkt und abhängig davon und von der Größe einer Einheit (z.B. 0.01) im Bild längere bzw. kürzere Linien zu zeichnen. Z.B. Wenn Du eine Gerade hast, dann brauchst Du die nicht punktweise Zeichnen und jedes Mal die Bezier-Formel auszuwerten. Die interne line-Methode ist sowieso besser.

Um das zu bewerkstelligen brauchst Du eine Schnelle Abschätzung für S_a^b = sup{|B'(t)| | a <= t <= b}. Diese gibt dann an, wie stark die Kurve im Intervall [a,b] rumirrt. Da Du eine Kubische hast, kannst Du aus obiger Formel schließen, wie lange die Linie sein muss. Ich denke, so spart man ca. 80% der Rechen und Zeichenarbeit im Durschnitt.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 07 Jul 2005 - 13:52:33    Titel:

Na immerhin! Very Happy

Du kannst dir das ganze auf [gelöscht] auch im Vollbild anschauen. Wobei die kleine Version die eigentliche größe ist, wenn man was SWF ohne HTML-Einbettung aufruft skaliert es sich automatisch auf die volle Fenstergröße und somit frisst es noch mehr Leistung. Ich habe zusätzlich zum code noch die FPS von erst 45 auf 20 herrabgesetzt, was auch ein klein wenig für Speed sorgt.

Deine Idee zum Zeichnen möchte ich auch noch umsetzten - danke anbei für den Ansatz - jedoch möchte ich mich in dem Thread um die Berechnung der Kontrollpunkte zuwenden.

mfg sHo


Zuletzt bearbeitet von sHo am 18 Okt 2013 - 11:56:57, insgesamt einmal bearbeitet
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 08 Jul 2005 - 15:29:43    Titel:

Kannst du das 'S_a^b = sup{|B'(t)| | a <= t <= b}' bitte mal in Worten oder Quelltext ausdrücken? Mit der mathematischen Schreibweise komm ich nicht ganz klar. Rolling Eyes

mfg sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 08 Jul 2005 - 17:09:46    Titel:

sup{|B'(t)| | a <= t <= b} bedeutet die kleinste obere Schranke für den Betrag (in dem Fall ist es eine Norm. Z.B. euklidische) der Ableitung der Kurve zwischen den Punkten a und b. Ableitung sagt aus, wie "steil" die Kurve in einem Punkt verläuft. S_a^b sagt dann aus, wie steil maximal die Kurve in einem Intervall sein kann. Dadurch kann man z.B. durch Bisektion Intervalle rausfinden, in denen die Kurve flach verläuft. Wenn der Wert S_a^b klein genug ist, so kann man die Kurve durch eine Linie ersetzen.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 11 Jul 2005 - 23:13:17    Titel:

Kannst du das bitte ein mal in Quelltext ausdrücken, ich versteh was du meinst, jedoch harperts am 'sup{|B'(t)| | a <= t <= b}'. Was ist z.B. sup und B'(t)? Vielleicht ein kleiner Codeschnippsel, indem das mal in etwa bechrieben ist wie sich was verhält. Aber mit Bisektion an das Problem herranzutreten ist eine sehr gute Idee, derer werd ich mich garantiert annehmen!

mfg sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 12 Jul 2005 - 09:44:22    Titel:

Ich schreibe Dir eine komplette Formel für die Abschätzung. Dazu muss Du Dich ein wenig gedulden, denn ich suche mal in der Literatur, ob es nicht schon so was gibt (ich bin mir da irgendwie sehr sicher, dass es der Fall ist) bevor ich anfange selbst zu rechnen. Naja, die Rechnung ist auch nicht besonders schwer.
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 12 Jul 2005 - 10:01:30    Titel:

Ich habe für Dich noch einen "Optimierungsschritt", den ich hätte schon am Anfang posten sollen. Naja. Dein Gleichungssystem ist ja:

Zitat:

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


Setze nun

a_11 = 3u(1-u)^2
a_12 = 3u^2(1-u)
b_1 = x - x_0 (1-u)^3 - x_3 u^3
a_23 = 3u(1-u)^2
a_24 = 3u^2(1-u)
b_2 = y - y_0 (1-u)^3 - y_3 u^3
a_31 = 3u'(1-u')^2
a_32 = 3u'^2(1-u')
b_3 = x' - x_0 (1-u')^3 - x_3 u'^3
a_43 = 3u'(1-u')^2
a_44 = 3u'^2(1-u')
b_4 = y' - y_0 (1-u')^3 - y_3 u'^3

Dann ist den System mit diesen Bezeichnungen

a_11 x_1 + a_12 x_2 = b_1
a_23 y_1 + a_24 y_2 = b_2
a_31 x_1 + a_32 x_2 = b_3
a_43 y_1 + a_44 y_2 = b_4

Und die Lösung ist auch entsprechend kürzer:

Code:

> eq1 := a_11 * x_1 + a_12 * x_2 = b_1;
                  eq1 := a_11 x_1 + a_12 x_2 = b_1

> eq2 := a_23 * y_1 + a_24 * y_2 = b_2;
                  eq2 := a_23 y_1 + a_24 y_2 = b_2

> eq3 := a_31 * x_1 + a_32 * x_2 = b_3;
                  eq3 := a_31 x_1 + a_32 x_2 = b_3

> eq4 := a_43 * y_1 + a_44 * y_2 = b_4;
                  eq4 := a_43 y_1 + a_44 y_2 = b_4

> solve({eq1,eq2,eq3,eq4},{x_1,x_2,y_1,y_2});
        a_23 b_4 - a_43 b_2          a_11 b_3 - a_31 b_1
{y_2 = ---------------------, x_2 = ---------------------,
       a_23 a_44 - a_43 a_24        a_11 a_32 - a_31 a_12

             a_24 b_4 - b_2 a_44            a_12 b_3 - b_1 a_32
    y_1 = - ---------------------, x_1 = - ---------------------}
            a_23 a_44 - a_43 a_24          a_11 a_32 - a_31 a_12


wobei diese die generische Ist. D.h. die Sonderfälle, dass die Nenner 0 sind nicht enthalten (Scheiß MuPAD, diese ist mit Maple 9.5 gerechnet worden).

Offenbar enthält obige Lösung viel weniger Additionen und Multiplikationen, also "meine" erste. Und wenn ich mich nicht verschrieben habe, müsste sie auch gehen Smile
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 12 Jul 2005 - 20:59:05    Titel:

Also du machst deinem Namen alle Ehre was? Wink

Hab dein Vorschlag mal umgeschrieben, konnte dabei auch noch ein paar Elemente zusammenfassen und terminieren. Die Sonderfälle fang ich vorher schon ab, das ist kein Problem. Nur irgendwie schein ich noch ein Fehler im Script zu haben, bin aber anscheinend total blind. Vielleicht hab ich in der Variablenschieberei was durcheinander gebracht oder die falschen Variablen. Es funktioniert, aber nicht so wie es sollte. Confused

Aber wenn:
x_0, y_0 = Ankerpunkt 1
x, y = Punkt auf Linie 1
x', y' = Punkt auf Linie 1
x_3, y_3 = Ankerpunkt 2
u = Parameter für Punkt auf Linie 1
u' = Parameter für Punkt auf Linie 2
.. dann kann es nur an etwas anderem liegen.

Hier mal der Code :
Code:
function getCubicControlPoints(p0:Object, p1:Object, p2:Object, p3:Object, te:Number, tf:Number):Object {
   
   /***** Kommentar Anfang *****
   
   // uebersicht
   
   x, y     p1.x, p1.y // E = Punkt auf Linie 1
   x', y'   p2.x, p2.y // F = Punkt auf Linie 2
   u        te
   u'       tf
   x_0      p0.x   // A = Ankerpunkt 1
   x_1      ges   // B = Kontrollpunkt 1 (gesucht)
   x_2      ges.   // C = Kontrollpunkt 2 (gesucht)
   x_3      p3.x   // D = Ankerpunkt 2
   
   // ausgangsrechnung
   
   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
   
   // Setze nun
   
   var a_11 = 3 * u * ((1-u)*(1-u)) // #
   var a_12 = ((3 * u)*(3 * u)) * (1-u) // ##
   var b_1  = x - x_0 * ((1-u)*(1-u)*(1-u)) - x_3 * (u*u*u)
   var a_23 = 3 * u * ((1-u)*(1-u)) // #
   var a_24 = ((3 * u)*(3 * u)) * (1-u) // ##
   var b_2  = y - y_0 * ((1-u)*(1-u)*(1-u)) - y_3 * (u*u*u)
   var a_31 = 3 * u' * ((1-u')*(1-u')) // ###
   var a_32 = ((3 * u')*(3 * u')) * (1-u') // ####
   var b_3  = x' - x_0 * ((1-u')*(1-u')*(1-u')) - x_3 * (u'*u'*u')
   var a_43 = 3 * u' * ((1-u')*(1-u')) // ###
   var a_44 = ((3 * u')*(3 * u')) * (1-u') // ####
   var b_4  = y' - y_0 * ((1-u')*(1-u')*(1-u')) - y_3 * (u'*u'*u')
   
   
               a_24 b_4 - b_2 a_44            a_12 b_3 - b_1 a_32
   y_1 = - ---------------------, x_1 = - ---------------------
        a_23 a_44 - a_43 a_24          a_11 a_32 - a_31 a_12
   
   
       a_23 b_4 - a_43 b_2              a_11 b_3 - a_31 b_1
   y_2 = ---------------------, x_2   =   ---------------------
         a_23 a_44 - a_43 a_24            a_11 a_32 - a_31 a_12
   
   
   // umgeordnet
   
   var a_11 = 3 * u * ((1-u)*(1-u)) // #
   var a_23 = 3 * u * ((1-u)*(1-u)) // #
   var a_12 = ((3 * u)*(3 * u)) * (1-u) // ##
   var a_24 = ((3 * u)*(3 * u)) * (1-u) // ##
   var a_31 = 3 * u' * ((1-u')*(1-u')) // ###
   var a_43 = 3 * u' * ((1-u')*(1-u')) // ###
   var a_32 = ((3 * u')*(3 * u')) * (1-u') // ####
   var a_44 = ((3 * u')*(3 * u')) * (1-u') // ####
   
   var b_1  = x - x_0 * ((1-u)*(1-u)*(1-u)) - x_3 * (u*u*u)
   var b_2  = y - y_0 * ((1-u)*(1-u)*(1-u)) - y_3 * (u*u*u)
   var b_3  = x' - x_0 * ((1-u')*(1-u')*(1-u')) - x_3 * (u'*u'*u')
   var b_4  = y' - y_0 * ((1-u')*(1-u')*(1-u')) - y_3 * (u'*u'*u')
   
   // aufgeteilt in
   
   var u3 = 3 * u;
   var u'3 = 3 * u';
   
   var u32 = u3 * u3;
   var u'32 = u'3 * u'3;
   
   var u_3 = u * u * u;
   var u'_3 = u' * u' * u';
   
   var u_12 = (1-u)*(1-u);
   var u'_12 = (1-u')*(1-u');
   
   var u_13 = u_12 * (1-u);
   var u'_13 = u'_12 * (1-u');
   
   var a_11 = u3 * u_12 // #
   var a_23 = u3 * u_12 // #
   var a_12 = u32 * (1-u) // ##
   var a_24 = u32 * (1-u) // ##
   var a_31 = u'3 * u'_12 // ###
   var a_43 = u'3 * u'_12 // ###
   var a_32 = u'32 * (1-u') // ####
   var a_44 = u'32 * (1-u') // ####
   
   var b_1  = x - x_0 * u_13 - x_3 * u_3
   var b_2  = y - y_0 * u_13 - y_3 * u_3
   var b_3  = x' - x_0 * u'_13 - x_3 * u'_3
   var b_4  = y' - y_0 * u'_13 - y_3 * u'_3
   
   ***** Kommentar Ende *****/
   
   var te3 = 3 * te;
   var tf3 = 3 * tf;
   
   var te32 = te3 * te3;
   var tf32 = tf3 * tf3;
   
   var te_3 = te * te * te;
   var tf_3 = tf * tf * tf;
   
   var te_12 = (1-te) * (1-te);
   var tf_12 = (1-tf) * (1-tf);
   
   var te_13 =  te_12 * (1-te);
   var tf_13 =  tf_12 * (1-tf);
   
   var a_1 = te3  * te_12 ; // a_11 & a_23
   var a_2 = te32 * (1-te); // a_12 & a_24
   var a_3 = tf3  * tf_12 ; // a_31 & a_43
   var a_4 = tf32 * (1-tf); // a_32 & a_44
   
   var b_1  = p1.x - p0.x * te_13 - p3.x * te_3;
   var b_2  = p1.y - p0.y * te_13 - p3.y * te_3;
   var b_3  = p2.x - p0.x * tf_13 - p3.x * tf_3;
   var b_4  = p2.y - p0.y * tf_13 - p3.y * tf_3;
   
   
   var n = a_1 * a_4 - a_3 * a_2;
   
   // Kontrollpunkt 1
   var xval1 = - (a_2 * b_3 - b_1 * a_4) / n; // x_1
   var yval1 = - (a_2 * b_4 - b_2 * a_4) / n; // y_1
   
   // Kontrollpunkt 2
   var xval2 =   (a_1 * b_3 - a_3 * b_1) / n; // x_2
   var yval2 =   (a_1 * b_4 - a_3 * b_2) / n; // y_2
   
   // return
   return { x1: xval1, y1: yval1,
         x2: xval2, y2: yval2 }
}


Oberhalb sind auskommentiert paar Schritte .. unten dann nur noch umgestellt in meine Variablen mit p0 - p3, t1,t2 usw. Vielleicht siehst du ja ein Fehler beim überfliegen. Werd mich aber dann nochma drannsetzten. Muss ja irgendwie gehen! Very Happy

Achja nach was suchst du denn in deiner Literatur genau? Hat das Verfahren einen Namen oder so? Vielleicht steht im Netz schon was dazu, weiß aber net recht nach was ich schauen soll.

besten Dank!
sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 12 Jul 2005 - 21:19:03    Titel:

Zitat:
Achja nach was suchst du denn in deiner Literatur genau? Hat das Verfahren einen Namen oder so? Vielleicht steht im Netz schon was dazu, weiß aber net recht nach was ich schauen soll.


Numerische/Differentielle Fehleranalyse bzw. Interpolations-Fehlerabschätzung bei kubischer Spline-Interpolation. Bei sowas müsste es drin stehen. Ich habe Spezialliteratur vom Lehrstuhl an dem ich arbeite. Ich denke aber, dass muss man sowieso anpassen.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 12 Jul 2005 - 21:41:33    Titel:

Klingt nach verdammt viel Stoff für nen Mathe-Legastheniker wie mich. Very Happy
Aber schon interessant, werd auch mal danach suchen. Was lehrst du denn eigentlich beruflich wenn man fragen darf?

mfg sHo
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 4 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