Gateway_man Geschrieben 25. April 2016 Teilen Geschrieben 25. April 2016 (bearbeitet) 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 Bearbeitet 25. April 2016 von Gateway_man Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mqr Geschrieben 26. April 2016 Teilen Geschrieben 26. April 2016 (bearbeitet) 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 26. April 2016 von mqr Kleinigkeiten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 10. Mai 2016 Autor Teilen Geschrieben 10. Mai 2016 (bearbeitet) 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 10. Mai 2016 von Gateway_man Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mqr Geschrieben 10. Mai 2016 Teilen Geschrieben 10. Mai 2016 (bearbeitet) 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 10. Mai 2016 von mqr Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 12. Mai 2016 Teilen Geschrieben 12. Mai 2016 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mqr Geschrieben 12. Mai 2016 Teilen Geschrieben 12. Mai 2016 (bearbeitet) 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 12. Mai 2016 von mqr Buchstabe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.