Rysowanie wykresu funkcji tangens

0

Witam.
Mam do zrobienia taki program, który wyświetla daną funkcję (sinx, cosx, x^2, tgx). I z resztą nie było większych problemów, w Internecie dużo o tym jest artykułów. Problem zaczął się, gdy chciałem narysować wykres funkcji tg(x). Otóż o sinusie znalazłem wzór funkcji, z którego skorzystałem i działał bez problemu.

                for (int i = 0; i < width; i++)
                {
                    int y = (int)((Math.Sin((double)i * 2.0 * Math.PI / width) + 1.0) * (height - 1) / 2.0);
                    DrawArea.SetPixel(i, y, Color.Black);
                }

Gdzie oczywiście width to szerokość pictureBox'a, a height to wysokość jego.
Problem polega na tym, że średnio rozumiem jak działa ten wzór, przez co nie umiem przekształcić go na wykres tg.
Wobec tego mam do Was pytanie o co chodzi w tym wzorze i jak ewentualnie można by go zmienić, żeby można było narysować wykres tg.
Jestem w liceum, więc funkcje trygonometryczne już miałem, ale ten wzór akurat średnio rozumiem.

0

tg x = sin x / cos x
ctg x = 1 / tg x = cos x / sin x

z tym lepiej pokombinuj. A rzutowanie na int jest myślę kiepskim pomysłem, jeżeli chodzi o rysowanie wykresów
Uważaj na dzielenie przez 0

Btw. http://msdn.microsoft.com/en-us/library/system.math.aspx
Tutaj widać że funkcja do obliczania tangensa w c# jest już gotowa funkcja

3

A ja myślę, że rzutowanie na inta jest koniecznością przy rysowaniu wykresów - współrzędne ekranowe punktu są całkowite.

0

@Zellus,
Ponieważ po prawej stronie w:

int y = (int)((Math.Sin((double)i * 2.0 * Math.PI / width) + 1.0) * (height - 1) / 2.0);

y nie jest użyte, to y może być typu int.

Inna sprawa, że powinno się tą zmienną wyciągnąć poza pętle.

0

Niestety próbowałem już iść na skróty wykorzystując tożsamości trygonometryczne, ale niewiele to pomogło. Wykres teraz przypomina bardziej funkcję logarytmiczną niż tangensoidę. Przesiedziałem parę godzin nad tym, ale nadal jedyne co mi się nasuwa to "WTF?".

1

(nie znam C#)

int y = (int)((Math.Sin((double)i * 2.0 * Math.PI / width) + 1.0) * (height - 1) / 2.0);

Tu masz skalowanie x-ów i y-ków, żeby pokazać ładnie okres funkcji.

inna równoważna postać:

// przeskalowanie i tak żeby pokazać okres funkcji
double okres = 2.0 * Math.PI;
double x = (double)i * okres / width; // x = < 0 .. 2*PI )

// obliczenie funkcji
double fx = Math.Sin(x);

// przeskalowanie y tak żeby funkcja miała wartość od 0 do 1.0
double spread_fx = 2.0; //  (maks - min wartości funkcji to 2.0)
double shift_fx = 1.0; // funkcja ma wartość od -1.0 do +1.0, przesuwamy ją w górę
double ynorm = (fx + shift_fx) * / spread_fx;

// przeskalowanie y tak żeby funkcja zajęła cały obszar w pionie
double yd = ynorm * (height - 1);

// zaokrąglenie
int y = (int)yd;

Niestety do tg trzeba to inaczej zrobić, ale może z tymi komentarzami dasz sobie radę?

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