PCMasters Hardware Forum > Software > GFX, Webdesign und Programmierung > Seite 9 > C# Kurve einer Funktion zeichnen lassen

Im PC Forum registrieren


Produktsuche
IDEALO-PRODUKT-SUCHE
idealo preisvergleich
PCM News & Reviews
Antwort
 
 
Alt 03.12.2009, 20:35
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

C# Kurve einer Funktion zeichnen lassen



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ß
Alt Heute
Hardware Bot
Computer Informationen
 
Diese Werbung wird registrierten
Mitgliedern nicht angezeigt.
Werden Sie noch heute kostenlos Mitglied
auf PCMasters.de
Standard Weitere Informationen

 
Alt 03.12.2009, 21:32
Benutzerbild von pdelvo
pdelvo
 
Standard

Ich versteh deine frage nicht ganz. hier aber mal ein beispiel eines graphen. hilft dir das weiter?
Angehängte Dateien
Dateityp: zip Graph.zip (33,0 KB, 175x aufgerufen)
 
Alt 03.12.2009, 21:49
pixelflat
 
Standard

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);

Point[] curvePoints = { point1, point2, point3, point4, };
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.
 
Alt 03.12.2009, 22:21
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

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?
Programmiere noch nicht solange, weshalb sehr komplexe Codes noch etwas anstrengend zu verstehen sind.

Hoffe ihr habt es jetzt verstanden was ich brauche. Gruß
 
Alt 03.12.2009, 22:39
Benutzerbild von pdelvo
pdelvo
 
Standard

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
 
Alt 10.12.2009, 17:15
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

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? ;-)
 
Alt 10.12.2009, 17:22
Benutzerbild von pdelvo
pdelvo
 
Standard

vs2010 ist noch ziemlich beta(deswegen heißt es auch so ) du kannst das objekt doch auch im code erzeugen
 
Alt 10.12.2009, 17:28
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

Ja das war mir auch bereits klar ;-), bin gerade dabei erstmal wieder das alte zu installieren. Wie erzeuge ich es nur per Code?
 
Alt 10.12.2009, 17:41
Benutzerbild von pdelvo
pdelvo
 
Standard

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
 
Alt 10.12.2009, 18:21
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

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?
 
Alt 10.12.2009, 18:26
Benutzerbild von pdelvo
pdelvo
 
Standard

hier siehst du wie du punkte zum graphen hinzufügst. das machst du dann im click event.
]
Folgende User haben sich für den guten Beitrag bedankt:
 
Alt 10.12.2009, 20:18
Benutzerbild von siku92
Threadersteller
siku92
 
Standard

So habe es nun soweit fertig. Kannst es dir ja mal anschauen.( ]
Danke für deine Hilfe!
hardware forum Neue Frage stellen?
Kurze Zusammenfassung der Frage:
Bitte wählen Sie eine Kategorie:
Mailadresse:
Ihre Frage:
Ihre Frage wird als Gast gespeichert. Sollte eine Antwort im Forum erfolgen, bekommen Sie diese per Email zugeschickt.


Zufällige Frage
Um auf dieses Thema zu ANTWORTEN
bitte sich zuerst » hier kostenlos registrieren!!

Antwort

Tags: , , ,

Ähnliche Tags: , , , ,


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Keine Installation mehr möglich :\ omfgTIM Anwendungssoftware 5 07.10.2010 09:44
Visual Basic wait funktion? douro GFX, Webdesign und Programmierung 1 13.09.2010 14:53
suche netzwerktreiber Ricomendel Mainboards 4 03.06.2009 15:22
Neue Funktion - Ähnliche Themen Vorschlag Compiler Ankündigungen, Regeln und Feedback 6 02.05.2009 06:51
welches mainboard habe ich???? bitte helfen olli7766 Mainboards 22 05.01.2009 15:03
Hilfe Bildschirm friert ein Blacko Hardware Allgemein 0 26.10.2008 11:20
Soundtreiber nach formation nicht mehr auffindbar witche123 Hardware Allgemein 1 22.10.2008 18:40
Asus P5W64 WS / Raid funktion verschwunden poppol Mainboards 0 08.02.2007 14:59


Sie betrachten gerade: C# Kurve einer Funktion zeichnen lassen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.



Im PC Forum registrieren