C# Console Graph zeichnen

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ich empfehle dir, die x- und errechneten y-Werte des Graphen in der Konsole ordentlich auszugeben. Dem Anwender könnten Eingabefelder angeboten werden, so dass die Berechnung mit verschiedenen Werten wiederholt werden kann.

Das sollte doch ausreichen, um zu zeigen, dass du die Aufgabe und das physikalische Problem durchdrungen hast.

Als Zusatz könnte unter Windows ein Graph angezeigt werden. Auch das könnte direkt aus der Konsolenanwendung aufgerufen werden. Ein Fenster poppt auf und schwubbs ist der Graph da.

Das Zeichnen in die Konsole halte ich für übertrieben im Betracht des gesamten Hintergrundes. Es sei denn, es würde reichen, wenn der Graph angedeutet wird. Du könntest nämlich ganz einfach Punkte ausgeben, also einen normalen Punkt, wie er beim Satzende geschrieben wird. Hierzu muss nur die Cursor-Position entsprechend deiner Berechnung verändert werden:

Console.SetCursorPosition(x, y);
Console.Write(".");

Toraka  29.02.2012, 02:00

Sorry, die Zeilen müssen vorbelegt werden, sonst geht der Graph immer nach unten. Außerdem teilte ich fälschlicherweise durch die Konsolenbreite. So wird's fein:

Console.SetWindowSize(Console.LargestWindowWidth, Console.LargestWindowHeight);

int[] val = new int[Console.WindowWidth];
int maxY = 0;

for (int x = 0; x < Console.WindowHeight ; x++)
    Console.WriteLine();

for (int x = 1; x < val.Length; x++)
{
    val[x] = (int)Math.Pow(x, 2);
    //val[x] = (int)Math.Sqrt(x);

    if (val[x] > maxY)
        maxY = val[x];
}

int div = maxY / Console.WindowHeight ;

for (int x = 1; x < val.Length; x++)
{
    int y = val[x];

    if (maxY > Console.WindowHeight)
        y = y / div;

    y = Console.WindowHeight - y;

    Console.SetCursorPosition(x, y);
    Console.Write("*");
}

Console.Read();

}

0
Toraka  05.03.2012, 11:53
@Toraka

Vollständigkeithalber möchte ich anfügen, dass ein "Vorbelegen" der Zeilen unnötig ist. Die 4. bis 5. Code-Zeile kann ausgeklammert werden:

for (int x = 0; x < Console.WindowHeight ; x++)
  Console.WriteLine();

Jeder, der es genau nimmt, kann die Integer-Werte für y so runden, dass das Ergebnis noch ein wenig genauer wird. Optisch würde das aber keine merkliche Veränderung ergeben.

Die Berechnung des y-Max-Wertes sollte folgendermaßen verändert werden (9. Code-Zeile):

if (Math.Abs(val[x]) > maxY)
    maxY = Math.Abs(val[x]);

Ansonsten ist und bleibt es was es ist: Eine fixe Lösung für die Konsole, mit der ein Graph grob dargestellt werden kann.

0
Toraka  29.02.2012, 01:52

Anstatt eines Punktes stellt auch ein Sternchen * den "Graphen" ganz gut dar!

0
Toraka  29.02.2012, 01:47

Nicht überzeugt? Dann tue dir doch mal diese "Ascii-Grafik" an. ;-) Es ist keine High-Quality-Grafik, aber, wie schon erwähnt, lässt erkennen, wohin die Grafik geht.

Console.SetWindowSize(Console.LargestWindowWidth,        
   Console.LargestWindowHeight);

int[] val = new int[Console.WindowWidth];
int maxY = 0;

for (int x = 1; x < val.Length; x++)
{
  val[x] = (int)Math.Pow(x, 2);
  //val[x] = (int)Math.Sqrt(x);

  if (val[x] > maxY)
    maxY = val[x];
}

int div = maxY / Console.WindowWidth;

for (int x = 1; x < val.Length; x++)
{
  int y = val[x];

  if (maxY > Console.WindowWidth)
   y = y / div;

  Console.SetCursorPosition(x, y);
  Console.Write(".");
}

Console.Read();
0

Das ist aber sehr ungewöhnlich. Eigentlich lohnt sich so was auf der Konsole nicht, da es viel zu ungenau wäre. Ich würde dir davon eigentlich stark abraten, sonder statt dessen ein extra Fenster zu öffnen, in dem der Graph dargestellt wird. Auf der Konsole hast du ja nur ungefähr 100 Zeichen in der Breite. Oder willst du bei dir ein riesiges Konsolenfenster auf machen (über zwei Bildschirme zum Beispiel oder sehr hohe Auflösung)?


orkan23 
Beitragsersteller
 26.02.2012, 16:21

verstehe, da es aber im Rahmen der Schule ist muss ich es auf der Konsole machen

0
Toraka  26.02.2012, 18:16
@orkan23

In der Schule? Dann sollte man dir die benötigten Mittel gegeben haben!? Hat man dir nicht mitgeteilt, in welche Richtung du da im Konsolenbereich zu schreiten hast? Solange du kein Objekt hast, in das du zeichnen kannst, musst du dir das alles selber zusammen stricken. Wenn es eine "Schule" ist, die Softwareentwicklung als Thema hat, sollte sie dir auch eine Grundlage dafür geben. Oder willst du auf einer z.B. Realschule lediglich ein Thema auf diese Weise darstellen und es ist nur Konsole erlaubt/möglich und C# Zwang?

0
orkan23 
Beitragsersteller
 26.02.2012, 18:54
@Toraka

Das Thema ist frei auswählbar, wir dürfen machen was wir wollen. Ich beschäftige mich mit einem pyhsikalischen Thema. Ich werde meinen Lehrer morgen aufjedenfall danach fragen und ohne Zweifel werde ich auch Hilfe bekommen. Außerdem sind wir beim Programmieren im ersten Jahr.

0
Mickeyman  27.02.2012, 03:11
@orkan23

Naja, wenn es neben dem Lernerfolg keinen praktischen Nutzen haben soll, kann man das wohl gut machen. Könnte ganz interessant sein.

Willst du denn eine Funktion darstellen oder eine Liste von Werten?

Du musst schauen, wie viele Werte du überhaupt darstellen kannst(x-Achse). Und welches dein höchster/niedrigster Wert ist(y-Achse). Am einfachsten wäre es wohl, wenn du zunächst den Graph in einem 2D-Array zwischenspeicherst, damit du auch an beliebigen Stellen Werte einfügen und später dann einfach von oben nach unten alles auf die Konsole schreiben kannst.

Und dann so weiter und so fort ... :)

Solltest du da nicht weiter kommen, kannst du einfach wieder fragen. Aber es bringt eigentlich am meisten Spaß, wenn man selbst auf die Idee gekommen ist.

0
Toraka  27.02.2012, 12:24
@Mickeyman

Die Anzahl der Werte und auch die Größe der Werte ist völlig irrelevant, da ohnehin eine Umrechnung von Realwerten in Displaywerte und zurück erfolgen muss.

0
Toraka  27.02.2012, 12:30
@Mickeyman

Davon abgesehen, das Projekt wird wohl kaum in dieser Form durchgeführt werden. Es wird sich vermutlich nicht um eine auf Softwareentwicklung spezialisierte Schule handeln. Also ist es ein Dozent, der Grundwissen in der Softwareentwicklung vermittelt. Er wird auf diese Frage keine Antwort nennen können, zumindest keine, die einen Graphen unter Konsole zaubern wird. Selbst jemand, der das Hauptberuflich macht, würde das nicht mal eben aus dem Ärmel schütteln.

0
orkan23 
Beitragsersteller
 27.02.2012, 19:22
@Toraka

Falls es interessant sein sollte, ich gehen ins Technische Gymnasium in Ulm. Nun das mit dem 2D Array habe ich mir zwar auch gedacht, aber der Winkel ist für mich auch sehr wichtig (Darstellung im Bereich der Physik!). Der Graph den ich einzeichnen möchte ähnelt einer nach unten geöffneter Parabel, um genau zu sein soll es einen Wurf darstellen. Der Benutzer gibt davor Anfangsgeschwindigkeit und Wurfwinkel.

0
Mickeyman  28.02.2012, 01:57
@orkan23

Dann hast du wohl eine Funktion, von der du in berechneten Abständen Werte ausließt. Die Abstände musst du dann ermitteln, je nach dem, wie viele Zeichen in die Breite passen. Bei der Höhe musst du eventuell auch skalieren. Da musst du dann einfach ein Maximum bestimmen, was du noch für angebracht hältst.

Ach ja, und schlafen ist immer gut. Gute Nacht. ^^

0