Wykres funkcji kwadratowej C#

0

Witam!
Piszę sobie program konsolowy rysujacy wykres funkcji w prymitywnej konsoli.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Wykresy_funkcji_konsola
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.DarkRed;
            double a = 0, b = 0, c = 0;
            double srodek = 0; // srodek ukladu wspolrzednych
            double funkcja = 0;
            int xos = 0;
            int yos = 0;
            char znak = '*'; // znak którym rysujemy wykresy

            Console.SetWindowSize(50, 50); // ustalamy rozmiar okna

            ////////////// pobieranie danych od uzytkownika ///////////////
            Console.WriteLine("Podaj a: ");
            a = double.Parse(Console.ReadLine());

            Console.WriteLine("Podaj b: ");
            b = double.Parse(Console.ReadLine());

            Console.WriteLine("Podaj c: ");
            c = double.Parse(Console.ReadLine());
            /////////////////////////////////////////////////////////////


            for (int i = 0; i < 50; i++) // os OX
            {
                Console.SetCursorPosition(i, 25);
                Console.Write("-");
            }

            for (int i = 0; i < 50; i++) // os OY
            {
                Console.SetCursorPosition(25, i);
                Console.Write("|");
            }


            // funkcja y = a*x*x + b*x + c
            for (int i = -25; i < 25; i++)
            {

                funkcja = ((a * i * i) + (b * i) + c);
                if ((-funkcja + 25) > 0)
                {
                    Console.SetCursorPosition(Convert.ToInt32(i + 25), Convert.ToInt32(-funkcja + 25));
                    Console.Write(znak);
                }

            }

            ///////// przeksztalcamy funkcje do postaci kanonicznej y = a*(x-p)^2+q aby latwiej przesówać jej wykres
            double postac_kanoniczna = 0;
            double p = 0, q = 0;
            double delta = (b * b) - (4 * a * c);
            p = (-b / (2 * a));
            q = (-delta/(4*a));

            for (int i = -25; i < 25; i++)
            {
                postac_kanoniczna = (a * ((i - p) * (i - p))) + q;
                if ((-funkcja + 25) > 0)
                {
                    Console.SetCursorPosition(Convert.ToInt32(i + 25), Convert.ToInt32(-postac_kanoniczna + 25));
                    Console.Write(znak);
                }

                if (Console.KeyAvailable)
                {
                    if (Console.ReadKey().Key == ConsoleKey.LeftArrow)
                    {
                        p++;
                        
                        Console.WriteLine(znak);
                    }
                    else if (Console.ReadKey().Key == ConsoleKey.RightArrow)
                    {
                        p--;
                    }
                    else if (Console.ReadKey().Key == ConsoleKey.UpArrow)
                    {
                        q++;
                    }
                    else if (Console.ReadKey().Key == ConsoleKey.DownArrow)
                    {
                        q--;
                    }
            }

           
            }
            Console.ReadLine();
        }
    }
}

 

Pobieram od użytkownika z klawiatury parametry a,b,c.

Następnie sprowadziłem funkcje do postaci kanonicznej gdyż chcę później przy użyciu strzałek przesuwać wykres funkcji.
I tutaj własnie jest problem. Jak to zrobić?

Pozdrawiam i z góry dziękuję :)

1

Po przesunięciu musisz jeszcze raz narysować wykres, czyli po każdym naciśnięciu strzałek musisz pętlę rysowania od nowa puścić.

0

Hmmm czyli tak?

 

if (Console.KeyAvailable)
                {
                    if (Console.ReadKey().Key == ConsoleKey.LeftArrow)
                    {
                        p++;
                        for (int j = -25; j < 25; j++)
                        {

                            postac_kanoniczna = (a * ((i - p) * (i - p))) + q;
                            if ((-postac_kanoniczna + 25) > 0)
                            {
                                Console.SetCursorPosition(Convert.ToInt32(i + 25), Convert.ToInt32(-postac_kanoniczna + 25));
                                Console.Write(znak);
                            }

                        }
                        
                    }

Nie lapie mi w ogóle tych przycisków i zamiast przesówać to mi jakies cyfry generuje :O strasznie mom nafulane

1

Ale na zewnątrz if'a pętlę, która wyłapuje ciągle przyciski, póki np. nie będzie to jakiś inny klawisz.

0

Ok zamieszczam tutaj poprawne rozwiązanie napisane troche inaczej niż temat zakładał:P

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Odyn_Equation_Simulator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(100,60); // ustalamy rozmiar okna konsoli
            Console.SetWindowPosition(0,0);
            Console.Title = "Odyn Equation Simulator"; // tytul naszej aplikacji
            Console.BackgroundColor = ConsoleColor.DarkGray; // tlo aplikacji
            Console.ForegroundColor = ConsoleColor.DarkRed; // kolor tekstu

            double a = 0, b = 0, c = 0, p = 0, q = 0;
            double delta = 0;

            // pobieranie parametrów z klawiatury od uzytkownika
            Console.WriteLine("Podaj parametr a: ");
            a = double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj parametr b: ");
            b = double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj parametr c: ");
            c = double.Parse(Console.ReadLine());

            delta = (b * b) - (4 * a * c);
            p = (-b / (2 * a));
            q = delta / (4 * a);

            do
            {
                switch (Console.ReadKey().Key) // event przycisków
                {
                    case ConsoleKey.LeftArrow: p--; // <- w lewo o 1 jednostke
                        break;
                    case ConsoleKey.RightArrow: p++; // w prawo ->
                        break;
                    case ConsoleKey.UpArrow: q++; // w góre ^
                        break;
                    case ConsoleKey.DownArrow: q--; // w dół V
                        break;
                    case ConsoleKey.Escape: Environment.Exit(1); // wyjscie z aplikacji
                        break;
                    default: Console.WriteLine("Wcisnales zly klawisz!"); // w razie gdy zly klawisz
                        break;
                }
                Console.Clear(); // czyszczenie konsoli


                ////////////// rysowanie ukladu współrzednych ///////////////
                for (int i = 0; i <= Console.WindowWidth - 1; i++)
                {
                    for (int j = 0; j <= Console.WindowHeight -1; j++)
                    {
                        if (j == Console.WindowHeight / 2) // os OX
                        {
                            Console.SetCursorPosition(i, j);
                            Console.WriteLine("-");
                        }

                        if (i == Console.WindowWidth / 2) // os OY
                        {
                            Console.SetCursorPosition(i, j);
                            Console.WriteLine("|");
                        }
                    }
                }

                double funkcja = 0;
                int wysokosc_wykresu = 0;
                char znak = '*';

                for (int k = -Console.WindowWidth / 2; k < Console.WindowWidth; k++)
                {
                    funkcja = (a * (k - p) * (k - p) + q); // funkcja wpostaci kanonicznej
                    if (Console.WindowHeight - (int)(funkcja + Console.WindowHeight / 2) > 0)
                    {
                        Console.SetCursorPosition(wysokosc_wykresu, Console.WindowHeight - 1 - (int)(funkcja + Console.WindowHeight / 2));
                        Console.WriteLine(znak);
                    }
                    wysokosc_wykresu++;
                }

            } while (!(Console.ReadKey().Key == ConsoleKey.Escape));

            Console.ReadLine();
        }
    }
}

Może się komuś przyda.

3
                 default: Console.WriteLine("Wcisnoles zly klawisz!"); // w razie gdy zly klawisz
                        break;

Wcisnales*
user image

0

Ok juz poprawiłem :)

1

Wcisnales*

Wcisnąłeś!!!11

                 default: Console.WriteLine("Wcisnąłeś zły klawisz!"); // w razie gdy zły klawisz
                        break;
1

Temat na dzisiejszy wieczór: "tworzenie własnych funkcji".

0

Nie chce mi się z wami gadać. Żeby pomóc to was nie ma ale żeby krytykować to zawsze pierwsi :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1