C# Problme beim darstellen eines Funktionsgraphen

Blume21

Newbie
Registriert
März 2014
Beiträge
2
Hallo
ich arbeite mit der Software Microsoft Visual C# 2010 Express. Ich wollte einen Funktionsplotter erstellen. Dabei ist folgendes Problem aufgetreten: Meine Programm sagt mir, dass ich die Funktion "g.DrawLine(Rot,(rechne+Width/2),(rechne2+Height/2),(rechne+Height/2),(rechne2+Width/2));" überladen habe. Deshalb wollte ich fragen, was ich falsch gemacht habe und/ oder ob es eine andere Möglichkeit gibt den Funktioinsgraphen zeichen zulassen.

Code:
namespace Funktionsplotter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        double a, b, c, d, x, rechne, rechne2;
        Graphics g;
        Pen Schwarz = new Pen(Color.Black, 1);
        Pen Rot = new Pen(Color.Red, 1); // für die Funktion
        Pen Grau = new Pen(Color.Gray, 1);// für das Gitter

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            g = panel1.CreateGraphics();
        }

        private void btnZeichnen_Click(object sender, EventArgs e)
        {
          
            g.DrawLine(Schwarz, 0, (panel1.Height / 2), panel1.Width, (panel1.Height / 2));
            g.DrawLine(Schwarz, (panel1.Width / 2), 0, (panel1.Width / 2), panel1.Height);

            for (int i = 0; i <= panel1.Height; i = i + 10)
            {
                g.DrawLine(Schwarz, ((panel1.Width / 2) - 5), i, ((panel1.Width / 2) + 5), i); //zeichnet linien in der senrechten in 10 Pixel abstand
            }

            for (int i = 0; i <= panel1.Width; i = i + 10)
            {
                g.DrawLine(Schwarz, i, ((panel1.Height / 2) - 5), i, ((panel1.Height / 2) + 5));
            }

                //f(x)=y=a*x^3+ b*x^2+c*x+d
                
                

                a = Convert.ToDouble(txtA.Text);
                b = Convert.ToDouble(txtB.Text);
                c = Convert.ToDouble(txtC.Text);
                d = Convert.ToDouble(txtD.Text);
                            
                
                // Für die Berechnung der X Koordnaten
                rechne = (a*a*a)+(b*b)+(c*1)+d;
                
                // Für die Berechnung der Y Koordnaten
                rechne2= ((a*a*a)*(-1))+((b*b)*(-1))+((c*1)*(-1))+d*(-1);

           

                g.DrawLine(Rot,(rechne+Width/2),(rechne2+Height/2),(rechne+Height/2),(rechne2+Width/2)); 
            }
1.jpg
 
dass ich die Funktion ... überladen habe
Ich kenn die Funktion jetzt nich aber überladen heißt, dass du wohlmöglich zu viele Parameter an die Funktion übergibtst.
Versuch es erstmal nur mit dem ersten teil, bis zum 1. oder 2. Komma.
 
Zuletzt bearbeitet:
LOL... überladen hat in diesem Fall hat nichts mit "zu vielen Argumenten" zu tun. Nicht alle Fachausdrücke aus der Informatik sollte man bildlich interpretieren. :D

Nein, der Fehler ist in dem Fall, dass g.DrawLine keine Argumente vom Typ double unterstützt. Ändere das mal in Zeile 10 zu "float" und in Zeile 41-44 zu "Convert.ToSingle". Dann sollte es gehen.
 
Zuletzt bearbeitet:
Anstatt sich lustig zu machen könnte man es ja auch kurz verständlich erklären? =)
 
Danke Lunke er zeigt diesen Fehler nichtb mehr an, doch er macht leider nicht das was ich will. Wenn ich werte in die Textboxen eingebe sollte er mir, wenn ich auf Zeichnen klicke einen Funktionsgraphen zeichnen und nicht nur eine Gerade. Was hab ich bei der Berechnung falsch gemacht?
 
hmm ja stimmt, ein wirklicher Funktionsplotter ist das nicht, was du da geschrieben hast. g.DrawLine zeichnet, wie der Name schon andeutet, nur eine Linie. Es gibt in C# keine eingebaute Methode zum Zeichnen von nicht-linearen Funktionen.

Mir scheint, dass du das Prinzip hinter "Funktionen" noch nicht ganz verstanden hast.

Ich würde daher für den Anfang erstmal etwas einfacheres machen, z.B. nur lineare Funktionen, also nur f(x) = c*x+d. Das kann man dann auch mit g.DrawLine machen.

Aber sobald du "x hoch 2" mit ins Spiel bringt, wird es wesentlich komplizierter und du musst dir eine völlig neue Strategie ausdenken, wie du die Funktion zeichnest.
 
Zuletzt bearbeitet:
Um mal den "extrem schweren" Algorithmus zu stellen :):

  • Ausgangspunkt: Eingabe einer Funktion abhängig von x => f(x) = ax^3 + bx^2 + cx + d
  • Eine Polyline erstellen*
  • Einen Bereich von -x bis +x bestimmen
  • Ausrechnen aller einzelnen y(x)
  • Polyline mit den Werten füllen**
  • Polyline "zeichnen"

* Eine Polyline besteht aus mehreren Points zu finden unter der Eigenschaft Points ^^.
** Polyline nach folgendem muster befüllen:
Code:
Polyline graph = new Polyline();
//irgendwelche angaben zum "Desing"
graph.Points.Add(new Point(xWert,yWert);

Den Rest überlasse ich dir :), viel Erfolg beim Programmieren.

#Edit: natürlich sollte man Grenzen setzen und am besten auch noch eine Skalierung festlegen, dafür kann man natürlich auch noch einen Algorithmus festlegen:
  • Bestimmen des größten Y- und kleinsten Y-Wertes***
  • Mit betracht auf die Größe der Zeichenfläche eine Skalierung festlegen
  • Skalierung auf die Polyline oder eine Kopie anwenden
  • Polyline "zeichnen"

*** Am einfachsten:
Code:
double xMax = graph.Points.Max(max => max.Y);
// äquivalent dazu Min();

#EDIT2: Nachdem ich jetzt nochmal gelesen habe sollte ich ggf. ergänzen, dass eine Skalierung sowohl anhand der X-, als auch der Y-Achse möglich ist. Muss man dann entscheiden, was einem lieber ist. Beide Achsen zu skalieren ist natürlich auch machbar, sieht in der Regel aber "komisch" aus. Des weiteren musst du vor der Berechnung Pol-Stellen bestimmen, deren Y-Werte lassen sich natürlich nicht berechnen. Diese werden auch die Suche nach Max und Min negativ beeinflussen.
 
Zuletzt bearbeitet:
Zurück
Oben