Zum Inhalt springen

Zeichne eine Bezier Kurve


Gateway_man

Empfohlene Beiträge

Hallo Kollegen,

 

ich hab vor kurzem eine Aufgabenstellung von einem Freund bekommen und ich muss gestehen ich steig da überhaupt nicht dahinter.

Es geht darum eine Bezier Kurve vom Grad 2 zu berechnen und dann zu zeichnen.

Ich glaube ich verstehen die Aufgabenstellung schon nicht. Hier bezieht man sich auf nMax aber nirgends wird definiert was nMax ist.

Punkt zwei der mir unklar ist. Werden bei der Summierung der Punkte lediglich die x Koordinaten summiert?

        private void ZeichneBezier(Graphics g, int n, Point p1, Point p2, Point p3) 
        {
            //nMax unklar.
            if (n == nMax)
            {
                g.DrawLine(new Pen(new SolidBrush(Color.Black)), p1, p2);
                g.DrawLine(new Pen(new SolidBrush(Color.Black)), p2, p3);
            }
            else 
            {
                if (n > 0) 
                {
                    Point p12 = new Point();
                    Point p23 = new Point();
                    Point p123 = new Point();
                    //Brechnung der Punkte unklar.
                    //Abruchbedinung unklar. n > 0 ?!
                    ZeichneBezier(g, n--, p12, p23, p123); 
                }

            }

        }

Der Wikipedia Eintrag verwirrt mich nur noch mehr :(. Ich muss gestehen das ich solche mathematische Formeln zuletzt vor 12 Jahren genutzt habe. Soll heißen ich kann damit gar nichts mehr anfangen. Ob ihr mir das eventuell kurz erläutern könntet?

 

Beste Grüße

Gateway

Aufgabenstellung.jpg

wikipedia.jpg

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Gateway_man,

vor 6 Stunden schrieb Gateway_man:

Ob ihr mir das eventuell kurz erläutern könntet?

gerade bei "kurz" wird sich sicher keiner finden *grins*!

Allgemein:

Aber der Programmcode betrifft ja nur die Ausgabe der Kurve. In der Mathematik geht man allgemeinen von einem Koordinatenkreuz x,y aus bei dem genormter Weise X die Horizontale und Y die Vertikale ist. Insofern seh ich bei dem Programmteil schon ein Fragezeichen: Du fragst nach der Aufaddierung von X. Für einen Punkt X wird aber der dazugehörige Punkt Y berechnet.

Die Ausgabe:

ZeichneBezier(Graphics g, int n, Point p1, Point p2, Point p3)

wird an dieser Stelle definiert und hier: 

 

Zitat

ZeichneBezier(g, n--, p12, p23, p123)

 

werden im Selbstaufruf (rekursiv) die Werte übergeben.

Die Berechnungsergebnis übergibt dann:

 

Zitat

 new Point() 

 

Im Prinzip hat der Code nichts mit der Berechnung der Bezierkurve zu tun.

Für eine grafische Darstellung unterteilt man allgemein X in dem gewählten Bereich in angemessene Rechenschritte (Ich würde dann eine Berechnung von Y für jedes Pixel vorschlagen, also den gesamten Monitor (z.B. 1024 Punkte berechnen) und jeweils einen dazugehörigen Y-Bezierpunkt und einen Y-Kontrollpoligonpunkt).

Bis hier hin erst mal. so. "kurz" *grins*

Grüße

Micha

Bearbeitet von mqr
Kleinigkeiten
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Hallo mqr,

vielen Dank allerdings komm ich mit der Erklärung nicht ganz zurecht.

Zuerst einmal. Wie definiert sich nMax?

Das mit der Auf Addierung war eher eine Vermutung.

Laut Aufgabenstellung berechnen sich die neuen Punkte ja wie folgt:

Pn = 0.5 * (Px + Py)

Beispielsweise:

P12 = 0.5 * (P1 + P2)

wobei P1 lauf Aufgabenstellung (10, 300) und P2 (180, 50) ist.

Das verwirrt mich zunehmend. Wie kann man zwei Punkte addieren, den Wert dann noch multiplizieren um ein neues Wertepaar für einen neuen Punkt zu erhalten?!

Mir ist klar das ein Punkt aus zwei Werten besteht. Ich meinte mit der Addition auch nicht den Punkt X, sondern vielmehr die X Werte beider Punkte.

Ist das hier  (P1 + P2) zu verstehen als (P1.X + P2.X) + (P1.Y + P2.Y) ?

 

Beste Grüße

Gateway_man

 

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo  Gateway_man,

ich versuch es jetzt einmal mit Fließtext. nMax ist doch die Anzahl der Punkte, quasi die Auflösung, das Raster von X und damit sollte die Rekursion so oft aufgerufen werden bis alle Punkte berechnet sind, ist dann nMax erreicht erfolgt die Ausgabe. Allerdings müsste in dem THEN-Zweig die Bedingung für n=0 heißen und als Start n=nMax. Einige Angaben fehlen bei dem Quelltextausschnitt, so auch die Dimensionierung der Variablen. Vermutlich beinhaltet new Point() dann den errechneten Wert y für das Pixel von x in Anbhängigkeit von nMax, also z.B. Scalar P1(Ergebnis y, n). Die Eigentliche Berechnung ist nicht Bestandteil diese Codes, hier geht es nur um die Abfrage des Ergebnis der Berechnung und der Darstellung.

Grüße

Micha

Ps.: Versuch doch bitte noch die Dimensionierung der Variablen abzubilden, dann wissen wir wo sich die Berechnung versteckt. Ich kenne auch die Aufgabenstellung nicht, so ist das nur die Berechnung eines Mittelwerts. Ich hab noch einmal geschaut, das erste soll wohl die Aufgabe von Deinem Freund sein, allerdings scheint mir die Berechnung zu einfach vorgestellt.

 

Bearbeitet von mqr
Link zu diesem Kommentar
Auf anderen Seiten teilen

Wählt man nMax entsprechend NIEDRIG (z.B. nMax= 1) ergeben sich "weichere" Kurven als für n=3. Die Anzahl maximalen Iterationen betragt n - nMax.

Eigentlich wird das gut auf der Wikipediaseite mit den Grafiken ersichtlich.

Die Punkte werden addiert und mit 0,5 multipliziert um den Mittelpunkt zwischen den beiden Punkten zu erhalten. Das wird sooft wiederholt, bis es eben schön genug aussieht.

Wenn Du das in C# implementierst kannst Du z.B. über

Point p12  = new Point( (p1.X  + p2.X)/2, (p1.Y  + p2.Y)/2);

machen.

 

Wie kommst Du auf diesen Code?

 ZeichneBezier(g, n--, p12, p23, p123); 

 

Erstens: Vorsicht mit dem Operator "-- ": Steht dieser NACH der Variable, dekrementiert er diese auch erst NACHDEM er den Originalwert zurückgeliefert hat!

Bsp von https://msdn.microsoft.com/de-de/library/wc3z3k8c.aspx :

	 double x;
     x = 1.5;
     Console.WriteLine(--x);
     x = 1.5;
     Console.WriteLine(x--);
     Console.WriteLine(x);
/*
Output:
0.5
1.5
0.5
*/

So wird also "ZeichneBezier" immer mit dem selben Wert aufgerufen - das führt zu einer Endlosschleife!

Besser also "--n" oder "n-1" schreiben..

 

Zweitens: Im Text ist was anderes gefordert: "2. Rufe die Methode mit n-1 jeweils für die Punkte ... aus.."  also

 ZeichneBezier(g, n - 1, p1, p12, p123);
 ZeichneBezier(g, n - 1, p123, p23, p3);

Du musst ja die zwei "Äste" der Kurve zeichnen..

 

Hth, Ripper

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist eine quadratische Bezierkurve mit dem Grad n=2. Sie ist durch die drei Punkte (10,300)(180,50)(320,300) vorgegeben.

Nicht zu verwechseln mit der in der Aufgabe vorgegebenen Rechenschrittanzahl n=6 (nMAX wäre somit 6), die Anzahl hab ich als Auflösung (1024pixels) bezeichnet. Weichheit wäre eine anderer Begriff. Man erhält dann 6 Rechenwerte (2 sind aus erstem und letzen Punkt vorgegeben) und nimmt dann ein Kurvenlineal zum vervollständigen mit Bleistift. Hat man das soweit kann man aber problemlos im Programm mehr Rechenschritte wählen.

Die erste Kurve wären zwei Strecken mit einem gemeinsamen Punkt (180,50) und die zweite Kurve ist die eigentliche Bezierkurve.

Ich schlage daher vor, dass Du noch einmal mit dem Code neu beginnst (soviel war das ja noch nicht) und zunächst eine Matrix für die Rechenergebnisse definierst. Dann fragst Du die Werte ab, es folgt die Berechnung und dann die Ausgabe.

Beide Strecken des Kontrollpolygon werden durch 5 geteilt (nMax=6) dann erhälst Du jeweils 6 Punkte auf beiden Strecken, die Verbindung Ps1/1 mit Ps2/1 ergibt die Tangente der Bezierkurve im Punkt Pb1. Natürlich benötigst Du komplexe Rechnung dh. Du muss alle Punkte in ihren X und Y-Anteil zerlegen.

Grüße

Micha

 

Bearbeitet von mqr
Buchstabe
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...