proggie zum darstellen von funktionen x-ten grades

  • geschlossen
  • C#

  • PferdAmHerd
  • 1513 Aufrufe 2 Antworten
  • proggie zum darstellen von funktionen x-ten grades

    grüße!
    also wir haben in der schule einen programmierauftrag bekommen:
    wir sollen ein proggie in C# (ms visual c#)schreiben, das lieneare funktionen, quadratische funktionen, funktionen 3. grades, etc. in einem koordinatensystem ausgibt und zB schnittstellen berechnet. mein problem liegt jetzt bei der graphischen darstellung innerhalb einer form. ich suche einen weg diese graphische darstellung möglichst sinnvoll und elegant zu programmieren. im moment mach ich das mit einem pannel, auf das ich alles draufzeichne. aber ich glaube irgendwie ist das keine gute lösung. mein qellcode sieht bisher so aus (vorsicht! für jemanden, der ahnung davon hat, könnte es nach vergewaltigumg von qellcode aussehen ;) :(

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Text;
    7. using System.Windows.Forms;
    8. namespace WindowsApplication1
    9. {
    10. public partial class Form1 : Form
    11. {
    12. public Form1()
    13. {
    14. InitializeComponent();
    15. }
    16. double zoom = 100.0;
    17. double z = 1.0;
    18. double t = 0.0;
    19. Pen blackPen = new Pen(Color.Black, 1);
    20. Pen rasterPen = new Pen(Color.LightBlue, 1);
    21. Font drawFont = new Font("Arial", 8);
    22. SolidBrush drawBrush = new SolidBrush(Color.Black);
    23. public void drawit()
    24. {
    25. panel1.Refresh();
    26. Graphics graph = panel1.CreateGraphics();
    27. int hw = panel1.Width / 2;
    28. int hh = panel1.Height / 2;
    29. graph.TranslateTransform(hw, hh);
    30. #region achseneinteilung und raster
    31. //x-achse negativ
    32. for (double i = zoom; i >= -hw; i -= zoom)
    33. {
    34. int i_int = System.Convert.ToInt32(i);
    35. graph.DrawLine(blackPen, i_int, 0, i_int, 5);
    36. graph.DrawString(System.Convert.ToString(i / zoom * z), drawFont, drawBrush, i_int, 8);
    37. }
    38. //x-achse positiv
    39. for (double i = zoom; i <= hw; i += zoom)
    40. {
    41. int i_int = System.Convert.ToInt32(i);
    42. graph.DrawLine(blackPen, i_int, 0, i_int, 5);
    43. graph.DrawString(System.Convert.ToString(i / zoom * z), drawFont, drawBrush, i_int, 8);
    44. }
    45. //y-achse negativ
    46. for (double i = zoom; i <= hh; i += zoom)
    47. {
    48. int i_int = System.Convert.ToInt32(i);
    49. graph.DrawLine(blackPen, 0, i_int, 5, i_int);
    50. graph.DrawString(System.Convert.ToString(i / zoom * -z), drawFont, drawBrush, 8, i_int);
    51. }
    52. //y-achse positiv
    53. for (double i = zoom; i >= -hh; i -= zoom)
    54. {
    55. int i_int = System.Convert.ToInt32(i);
    56. graph.DrawLine(blackPen, 0, i_int, 5, i_int);
    57. graph.DrawString(System.Convert.ToString(i / zoom * -z), drawFont, drawBrush, 8, i_int);
    58. }
    59. #endregion
    60. //x- und y-achse einzeichnen
    61. graph.DrawLine(blackPen, hw, 0, -hw, 0);
    62. graph.DrawLine(blackPen, 0, hh, 0, -hh);
    63. }
    64. private void panel1_SizeChanged(object sender, EventArgs e)
    65. {
    66. drawit();
    67. }
    68. private void Form1_Activated(object sender, EventArgs e)
    69. {
    70. drawit();
    71. }
    72. private void sb_zoom_ValueChanged(object sender, EventArgs e)
    73. {
    74. if (sb_zoom.Value > t)
    75. {
    76. zoom += 2.0;
    77. if (zoom == 200.0)
    78. {
    79. z *= 0.5;
    80. zoom = 100.0;
    81. }
    82. }
    83. else
    84. {
    85. zoom -= 2.0;
    86. if (zoom == 100.0)
    87. {
    88. z *= 2.0;
    89. zoom = 200.0;
    90. }
    91. }
    92. label1.Text = System.Convert.ToString(sb_zoom.Value);
    93. label2.Text = System.Convert.ToString(zoom);
    94. t = sb_zoom.Value;
    95. drawit();
    96. }
    97. }
    98. }
    Alles anzeigen


    also eigentlich brauch ich nur einen ansatz. könnte mich dann da auch selbsts weiter reinlesen/probieren. wie setzt man sowas am besten um?

    greetz PferdAmHerd
  • Wie du dass macht, kommt auf deinen Wissensstand an.

    Persönlich würde ich die Panel-Klasse ableiten zB als Klasse "Graph", dort die Paint-Methode überschreiben und dein DrawIt() dort hineinstecken.

    Die Variablen Zoom, z, t kämen dann als Eigenschaften in die Graph-klasse.

    Damit die Graf-Klasse auch deine Formeln kennt, kannst du Funktionszeiger verwenden. Stickwort: delegate.

    Ich vermute mal, dass du auch schon probleme mit dem neu-zeichnen hattest. Vielleicht (ich gebe keine Garantie) kann man auch mit dem Image-Objekt arbeiten, um das gezeichnete sozusagen zwischenzuspeichern. Das hätte den Vorteil, dass die Funktion nicht ständig neu berechnet werden muss -> Geschwindigkeit.

    Vielleicht hilft dir dieser leicht unstrukturierte Kommentar ja ;)
    Frohes Neues, Phaiax
  • danke für die antwort :) hatte den thread schon abgeschrieben...
    wenn ich mich mal wieder dazu durchringen kann ein bisschen zu programmieren, werd ich mal schaun, ob ich das so hinkrieg, wie du das meinst...