C# Kurve einer Funktion zeichnen lassen

New member
Hallo zusammen,

seit einiger Zeit rätzele ich an einem kleinen Problem. Zu meinem Programm:

Das Programm errechnet die verschiedenen X bzw. Y Werte einer Funktion und gibt diese in einer Tabelle aus. Diese sollen nun verwendet werden um eine Kurve zu zeichnen.
Der Nutzer kann Max/Min Werte von X angeben. Hier mal der Code:
Spoiler:
Code:
namespace Datagrid_PaintEvent
{
    public partial class Form1 : Form
    {
        int z = 0;
        public Form1()
        {
            InitializeComponent();
        }
             
        private void button1_Click(object sender, EventArgs e)
        {

            // Funktion
            dataGridView1.Rows.Clear();
            z = 0;
            int startwert = Convert.ToInt32(textBox1.Text);
            int endwert = Convert.ToInt32(textBox2.Text);
            int b = Convert.ToInt32(textBox3.Text);
            for (int x = startwert; x <= endwert; x++)
            {
                dataGridView1.RowCount += 1;
                int y = x * x + b;
                    dataGridView1[0,z].Value = x;
                    dataGridView1[0,z].Value = y;
                z += 1;
            }
       

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            // x bzw. y Achsen des Koordinatensystems
            Pen blackpen = new Pen(Color.Black, 2);  
            Point pointline1 = new Point(10, 10);
            Point pointline2 = new Point(10, 210);
            e.Graphics.DrawLine(blackpen, pointline1, pointline2);


            Pen blackpen1 = new Pen(Color.Black, 2);
            Point pointline11 = new Point(10, 210);
            Point pointline22 = new Point(210, 210);
            e.Graphics.DrawLine(blackpen1, pointline11, pointline22);


           
            // Eine beliebige Kurve
            Pen blackPen = new Pen(Color.Black, 2);
            Point point1 = new Point(10, 10);
            Point point2 = new Point(80, 100); 
            Point point3 = new Point(150, 10);
            Point point4 = new Point(250, 50);

            Point[] curvePoints = { point1, point2, point3, point4, };
            e.Graphics.DrawCurve(blackPen, curvePoints);
           
        }
    }
}

Ich komme nicht darauf, wie ich die Anzahl der Punkte auf die Kurve anpasse. Sodass auch nur soviele Punkte in der Kurve berechnet werden wie vorhanden sind. Hoffe ihr könnt mir da helfen.

Danke und Gruß
 
Ich versteh deine frage nicht ganz. hier aber mal ein beispiel eines graphen. hilft dir das weiter?
 

Anhänge

  • Graph.zip
    33 KB · Aufrufe: 1.341
Sein Problem liegt vermutlich an dem statischen Array hier:

Code:
Pen blackPen = new Pen(Color.Black, 2);
Point point1 = new Point(10, 10);
Point point2 = new Point(80, 100); 
Point point3 = new Point(150, 10);
Point point4 = new Point(250, 50);

[B]Point[] curvePoints = { point1, point2, point3, point4, };[/B]
e.Graphics.DrawCurve(blackPen, curvePoints);

Was du im Beispiel durch die Verwendung einer Liste gelöst hast. Habe nur nicht gewusst, dass es List(T).ToArray() gibt. :)
 
Danke erstmal für die antworten,

also in der for Schleife werden die verschiedenen y-Werte berechnet vom Startwert bis zum Max-Wert. (Der Nutzer gibt sie ein.)

Dadurch bekommt man die x und y Werte der Funktion. Da die Funktion ein x² hat müsste sie eine Parabel darstellen. Nun möchte ich eben diese Kurven ausgeben. Womit löse ich das?
Der Graph hat mir jetzt nicht viel geholfen... wie machst du das? :D
Programmiere noch nicht solange, weshalb sehr komplexe Codes noch etwas anstrengend zu verstehen sind.

Hoffe ihr habt es jetzt verstanden was ich brauche. Gruß
 
hehe. oft sieht code bei mir kompliziert aus, weil ich zu faul war, ihn vernünftig zu kommentieren, und gern zusammenfasse). am besten ich erkläre mal das witchigste. also. es gibt ne klasse Graph. diese erbt von Control. in dieser überschreibe ich die mehode onpaint, welche das control zeichnet.
Code:
       protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            //Render Background
            e.Graphics.Clear(BackColor); //Hier wird der hintergrund gerendert, bzw das control geleert
            //Effekt // hier entsteht der farbverlauf
            e.Graphics.FillRectangle(
                new LinearGradientBrush(
                    new Point(this.Width / 2, 0),
                    new Point(this.Width / 2, this.Height / 2),
                    eff, this.BackColor),
                    new Rectangle(0, 0, Width, Height / 2));
//hier wirds interessant. wenn die anzahl der elemente in der liste points größer ist als die maximalanzahl, werden die überschüssigen entfernt
            if (points.Count > max)
                points.RemoveRange(max, points.Count - max);
           //in diesen drei zeilen mache ich mir das leben einfach. da bei c# eine zeichenfläche den punkt (0|0) oben links ist, drehe ich sie auf den kopf. das brauchst du nicht verstehen. wenn es dich interessiert: http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/MatrizenfuerDummies.pdf
            e.Graphics.TranslateTransform((float)Width / 2, (float)Height / 2);
            e.Graphics.RotateTransform(180);
            e.Graphics.TranslateTransform(-(float)Width / 2, -(float)Height / 2);

            //Draw Points
            if (points.Count > 1 && max != 0) // hier  wird geprüft, ob mindestens 2 punkte vorhanden sind. man kann ja keinen graphen mit einem punkt zeichnen. das && max != 0 ist überflüssig. kp was ich mir dabei gedacht habe
            {
                //Da ich in meiner liste von werten nur den y wert gespeichert habe, rechne ich nun die entgültige position auf dem zeichenbereich aus
                List<Point> fs = new List<Point>();
                for (int i = 0; i < points.Count; i++)
                {

                    //fs.Add(new Point((int)(((float)Width / (float)max) * i), (int)((float)points[i] / 100.0f * (float)Height)));
Da das etwas kompliziert aussieht, schreib ich es ausführlicher:
                   float length = (float)Width / (float)max;//hier rechne ich aus, wie breit der abstand zwichen 2 punkten sein muss. das ist einfache prozentrechnung
                   int factor = (int)((float)points[i] / 100.0 * (float)Height);//da der wertebereich meiner werte zwichen 0 und 100 liegt,  muss ich über den dreisatz auf die höhe der fläche umrechnen
                 fs.Add((int)(length * i), factor); //nurnoch die werte zur zweiten liste hinzufügen
                }
                    //dann alles auf den bildschirm zeichnen
                e.Graphics.DrawCurve(new Pen(ForeColor), fs.ToArray());
            }
            //da ich mir das leben eben einfach gemacht habe, indem ich die zeichenoberfläche drehe, muss ich nun zurückdrehen
            e.Graphics.TranslateTransform((float)Width / 2, (float)Height / 2);
            e.Graphics.RotateTransform(180);
            e.Graphics.TranslateTransform(-(float)Width / 2, -(float)Height / 2);
            //Dann wird noch der text oben links gezeichnet
            e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), 10.0f, 10.0f);
        }
Da sich aber nicht jeder mit sowas rumplagen will, haben sich schlaue leute überlegt, eine bibliothek zu veröffentlichen. google mal nach zedgraph. das nimmt dir das alles ab, und das ist umfangreicher als meins
 
Hatte jetzt einmal Zeit nach dem Zedgraph zu schauen, ist sehr interessant.
Nur leider hängt sich mein Visual Studio 2010 immer auf wenn ich das Zedgraph-Item in die Toolbox ziehen möchte?
Was mache ich falsch? ;-)
 
vs2010 ist noch ziemlich beta(deswegen heißt es auch so ;)) du kannst das objekt doch auch im code erzeugen
 
Ja das war mir auch bereits klar ;-), bin gerade dabei erstmal wieder das alte zu installieren. Wie erzeuge ich es nur per Code?
 
guck dir mal die datei Form1.Designer.cs an. das ist der code, der hinter den sachen auf der form steckt. da wird das prinzip schnell klar
 
So hat soweit geklappt, Dankeschön!
Ein kleines Problem habe ich aber noch:

Nun werden die Punkte berechnet und bei einem button_click event in dem datagridview angezeigt. Wir übertrage ich das zum zedgraph, sodass die Kurve erst beim button_click gezeigt wird?
 

Online-Statistiken

Zurzeit aktive Mitglieder
6
Zurzeit aktive Gäste
157
Besucher gesamt
163

Beliebte Forum-Themen

X
Keine passende Antwort gefunden?