Piszę program rysujący wykres funkcji w zadanym przedziale. Program skaluje wykres tak by wypełnił całe okno. I tu pojawia się problem. Okno ma szerokość ok. 500 pixeli (chyba w pixelach to jest liczone :P ) i przy rysowaniu przedziałów rzędu -10 - 10 zaczynają się problemy z dokładnością. Do tego stopnia że wykres przestaje w ogóle przypominać prawidlowy obraz ;) Domyślam się że rozjeżdża się przy przybliżaniu, jednak nie mam pomysłu jak to poprawić. Jakieś propozycje? Oto mój kod (pod Turbo c++):
float __fastcall TForm1::f(float x)
{
return x; //Zadana funkcja
}
void __fastcall TForm1::Funkcja(float x1, float x2)
{
float DlugoscPrzedzialu = abs(x1-x2);
float kx = ClientWidth / DlugoscPrzedzialu;//skala w osi 0X
float Maximum = f(x1), Minimum = f(x1);
for (float i = x1; i <= x2; i+=kx) {//Esktrema funckji w danym przedziale
if (Maximum < f(i)) Maximum = f(i);
if (Minimum > f(i)) Minimum = f(i);
}
float ky;
if (Maximum != Minimum) ky = ClientHeight / (Maximum - Minimum);//Skala w osi OY
else ky = 1;
//Os OX
if (Minimum<0) {
Canvas->MoveTo(0, ClientHeight - (int)(abs(Minimum)*ky + 0.5));
Canvas->LineTo(ClientWidth, ClientHeight - (int)(abs(Minimum)*ky + 0.5));
}
//Os OY
if (x1<0) {
Canvas->MoveTo((int)(abs(x1)*kx + 0.5), 0);
Canvas->LineTo((int)(abs(x1)*kx + 0.5), ClientHeight);
}
Canvas->MoveTo(0, ClientHeight-(int)((f(x1)-Minimum)*ky + 0.5));
for (float i = x1; i <= x2; i+=kx) {//Wlasciwa petla rysujaca wykres funkcji
Canvas->LineTo((int)((i-x1)*kx + 0.5), ClientHeight-(int)((f(i)-Minimum)*ky + 0.5));
}
}