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: 29 Jun 2005 - 18:51:01    Titel:

Wie zeichnest Du denn die Kurve? Dein Programm fordert bei meinem 2600+ Athlon Mobile fast 100% der Systemleistung!
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 29 Jun 2005 - 23:20:35    Titel:

Was echt? Na bin noch am experimentieren mit verschiedenen Sachen.
Mein 'Manko' nennt dich Dual-Opteron-System aber im Win auf 32bit.
Aber eigentlich sollte es nicht so krasse unterschiede geben. Vielleicht
liegts am System. Was hast du für ein OS und Flash Player?

Hier mal ein paar Code-Schnippsel.

Punkt auf Kurve berechnen :
Code:

   function getCubicPt (p0:Object, p1:Object, p2:Object, p3:Object, t:Number) : Object {
      // Formel: P(t) = P0 * (1-t)^3 + P1 * 3 * (1-t)^2 * t + P2 * 3 * (1-t) * t^2 + P3 * t
      var t2  = t * t;
      var t3  = t2 * t;
      var t12 = (1-t) * (1-t);
      var t13 = t12 * (1-t);
      var x = p0.x * t13 + p1.x * 3 * t12 * t + p2.x * 3 * (1-t) * t2 + p3.x * t3;
      var y = p0.y * t13 + p1.y * 3 * t12 * t + p2.y * 3 * (1-t) * t2 + p3.y * t3;
      return { _x:x, _y:y };
   }

   // p0 = Ankerpunkt 1
   // p1 = Kontrollpunkt 1
   // p2 = Kontrollpunkt 2
   // p3 = Ankerpunkt 2



Kontrollpunkte berechnen :
Code:

function getCubicControlPoints2(A:Object, E:Object, TE:Number, F:Object, TF:Number, D:Object):Object {
   // TE^2 & TE^3
   var TE2 = TE * TE;
   var TE3 = TE * TE * TE;
   
   // TF^2 & TF^3
   var TF2 = TF * TF;
   var TF3 = TF * TF * TF;
   
   // nenner
   var n = -3 * (TE -1) * TE * (TE - TF) * (-1 + TF) * TF;
   _root.tf_n = "nenner: "+ Math.round(n*10000)/10000 +"~";
   
   // B
   var xval1 = (F.x * (-1 + TE) * TE2 + TF2 * (E.x - E.x * TF + D.x * TE2 * (-TE + TF)) - A.x * (-1 + TE) * (-1 + TF) * (TF2 - 2 * TE * TF2 + TE2 * (-1 + 2 * TF))) / n;
   var yval1 = (F.y * (-1 + TE) * TE2 + TF2 * (E.y - E.y * TF + D.y * TE2 * (-TE + TF)) - A.y * (-1 + TE) * (-1 + TF) * (TF2 - 2 * TE * TF2 + TE2 * (-1 + 2 * TF))) / n;
   
   // C
   var xval2 = (F.x * ((-1 + TE)*(-1 + TE)) * TE - A.x * ((-1 + TE)*(-1 + TE)) * (TE - TF) * ((-1 + TF)*(-1 + TF)) - TF * (E.x * ((-1 + TF)*(-1 + TF)) + D.x * TE * (TF2 - 2 * TE * TF2 + TE2 * (-1 + 2 * TF)))) / n;
   var yval2 = (F.y * ((-1 + TE)*(-1 + TE)) * TE - A.y * ((-1 + TE)*(-1 + TE)) * (TE - TF) * ((-1 + TF)*(-1 + TF)) - TF * (E.y * ((-1 + TF)*(-1 + TF)) + D.y * TE * (TF2 - 2 * TE * TF2 + TE2 * (-1 + 2 * TF)))) / n;
   
   // return
   return {x1: xval1, y1: yval1,
         x2: xval2, y2: yval2}

   // A = Ankerpunkt 1
   // D = Ankerpunkt 2
   // E = Punkt auf Kurve 1
   // TE = t-Param fuer E
   // F = Punkt auf Kurve 2
   // TF = t-Param fuer F
}




Zeichnen :
Code:

   function draw(mc:MovieClip, n:Number) : Boolean {
      var pt = 0;
      var n ++;
      
      // zeichnen
      for(var i = 0, end   = this._points.length-3; i < end; i += 3) {
         for(var m=0; m<=1-.0001; m+=1/n) {
            if(pt==0) pt = getCubicPt(this._points[i], this._points[i+1], this._points[i+2], this._points[i+3], m);
            mc.moveTo( pt._x, pt._y );
                      pt = getCubicPt(this._points[i], this._points[i+1], this._points[i+2], this._points[i+3], m+1/n);
            mc.lineTo( pt._x, pt._y );
         }
      }
      
      return true;
   }

   // Anker- und Kontrollpunkte sind als Objekt mit _x und _y im Array _pints gespeichert
   // moveTo und lineTo sind Flash-Player-interne Zeichenfunktionen


Aloha! sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 29 Jun 2005 - 23:29:52    Titel:

Ich sehe nichts böses. Das n sollte vielleicht bei größeren Bildmaßen etwas großzügiger gewählt werden.

Ich habe Linux 2.6.8 und benutze Konqueror von KDE 3.3.0. Flash-Player ist ziemlich aktuell (vor ein paar Monaten runtergeladen). Ich habe das Prog. im Vollbildmodus gestartet und ständig den Refresh-Event ausgelöst indem ich einen der Punkte bewegte. Daraufhin fängt mein Notebook-Kühler zu kochen!
Serpico
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 12.06.2005
Beiträge: 63

BeitragVerfasst am: 29 Jun 2005 - 23:54:49    Titel:

Komme bei meinem Rechner (2.6 GHz) auf 15% bis 20% CPU Auslastung bei ständiger Bewegung eines Punktes.

(Windows XP prof).

Also alles im grünen Bereich.

lg S.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 30 Jun 2005 - 00:10:35    Titel:

Ja, das n soll später dynamischer agieren - je nach den Ausmaßen der Kurve.

Werd mal bissel drann arbeiten. Meinungen sin herzlich Willkommen!

Aloha! sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 30 Jun 2005 - 00:55:13    Titel:

Zitat:
Komme bei meinem Rechner (2.6 GHz) auf 15% bis 20% CPU Auslastung bei ständiger Bewegung eines Punktes.


Auch ein Notebook?
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 30 Jun 2005 - 01:05:27    Titel:

Also, genauer gesagt schaut es so aus. Bei halbem Bild sind es 30% für den X-Server und 20% für den nspluginviewer (d.h. flash). Im Vollbildmodus sind es 40% für X-Server und 50% für den Viewer. Daher leite ich ab, daß der Netscape-Flash-Plugin für Linux einfach Kacke ist. Abgesehen davon sollte aber das Zeichnen einer solchen Kurve überhaupt keine Anstrengung für den Prozessor (auch nicht für den direkten Zugriff auf Grafik-Speicher) sein. Der XP-Plugin wird vermutlich auf Direct-X-Basis arbeiten, sodaß er etwas schneller zeichnet. Ich habe keine HD-Unterstützung.
Serpico
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 12.06.2005
Beiträge: 63

BeitragVerfasst am: 30 Jun 2005 - 07:19:20    Titel:

algebrafreak hat folgendes geschrieben:
Zitat:
Komme bei meinem Rechner (2.6 GHz) auf 15% bis 20% CPU Auslastung bei ständiger Bewegung eines Punktes.


Auch ein Notebook?


Nein, Fujitsu Siemens Scaleo.

Habe als Browser allerdings Firefox und nicht Netscape.

lg S.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 07 Jul 2005 - 12:36:36    Titel:

Hab jetz mal wieder Zeit gefunden das ganze zu überarbeiten und bissel zu optimieren.

Hier der Code :
Code:

/* method: getCubicControlPoints
 * params: p0:Object, p1:Object, p2:Object, p3:Object, te:Number, tf:Number
 * return: Object { x1, y1, x2, y2 }
 * desc  : Berechnet die Kontrollpunkte einer Kubischen Bezierkurve anhand íhrer Ankerpunkte (p0, p3),
 *         zwei auf der Kurve liegenden Punkte (p1, p2) und der zuhehoerigen t-Parameter (te fuer p1, tf fuer p2).
 * author: Stefan H.
 * date  : 2005-07-07
 */
function getCubicControlPoints(p0:Object, p1:Object, p2:Object, p3:Object, te:Number, tf:Number):Object {
   // te^2 & te^3
   var te2 = te  * te;
   var te3 = te2 * te;
   
   // tf^2 & tf^3
   var tf2 = tf  * tf;
   var tf3 = tf2 * tf;
   
   // te - 1 & tf - 1
   var te_1 = te - 1;
   var tf_1 = tf - 1;
   
   // te_1^2 & tf_1^2
   var te_12 = te_1 * te_1;
   var tf_12 = tf_1 * tf_1;
   
   //
   var tef1 = te2 * (tf - te);
   var tef2 = tf2 - 2 * te * tf2 + te2 * (-1 + 2 * tf);
   var tef3 = te_1 * tf_1 * tef2;
   var tef4 = te_12 * (te - tf) * tf_12;
   
   // n
   var n = -3 * te_1 * te * (te - tf) * tf_1 * tf;
   
   // Kontrollpunkt 1
   var xval1 = (p2.x * te_1 * te2 + tf2 * (p1.x - p1.x * tf + p3.x * tef1) - p0.x * tef3) / n;
   var yval1 = (p2.y * te_1 * te2 + tf2 * (p1.y - p1.y * tf + p3.y * tef1) - p0.y * tef3) / n;
   
   // Kontrollpunkt 2
   var xval2 = (p2.x * te_12 * te - p0.x * tef4 - tf * (p1.x * tf_12 + p3.x * te * tef2)) / n;
   var yval2 = (p2.y * te_12 * te - p0.y * tef4 - tf * (p1.y * tf_12 + p3.y * te * tef2)) / n;
   
   // return
   return { x1: xval1, y1: yval1,
         x2: xval2, y2: yval2 }
}

.. an der Kommentierung arbeite ich noch! Rolling Eyes

und hier das in Flash : [gelöscht]

Würd mich freuen wenn in den Thread verirrte Leute kurz Ihr System und die Auslastung des Programms Preis geben oder/und vleicht sogar noch ein paar Tipps zur optimierung auf Lager haben! Rein Rechnerisch denk ich habe ich es schon auf das Minimum zusammengesaucht. Dazu habe ich ein paar oft verwendete Berechnungsegmente in Variablen ausgelagert. Sind auch ein paar nciht so rechenaufwärdige Berechnungen rein der Übersicht halber in Variablen gespeichert.

mfg sHo


Zuletzt bearbeitet von sHo am 18 Okt 2013 - 11:56:49, insgesamt einmal bearbeitet
Whoooo
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 08.06.2005
Beiträge: 8988

BeitragVerfasst am: 07 Jul 2005 - 12:45:32    Titel:

hab 30-40% auf nem xp2000+ 512mb ram unter win xp.
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 3 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