co potrzebuje do narysowania wykresow, jaki komponent, jak sie je tworzy dynamicznie?
tzn. zeby sie zmienialy w trakcie dzialania progaramu po wpisaniu wartosci. np. jak narysowac wykres funkcji kwadratowej?
for x := 0 to 100 do canvas.pixels[x,ax*x+bx+c] := clWhite;
// oczywiście... chodziło o przykład.. Jeżeli koledze barankowi nie będzie odpowiadało (a nie będzie [cygaro] )odświeżanie co kilka sekund to sam poszuka szybszego rozwiązania, i wten sposób nauczy się rożnic pomiędzy scanline a pixels, a może coś lepszego wymyśli i podzieli się z nami nowo nabytą wiedzą ?.
// Detox dobrze zauważył.. zmienna Y rośnie w dół. Jest to po prostu inny typ "kartki". Jeżeli chcemy aby wykres był poprawnie<font color="blue">*</span> narysowany musimy odwrócić Y. Czyli :
for x:= lewaStronaObszaruOkreślonosci to prawaStronaObszaruOkreślonosci do
zapalPunkt(x, -x*x*a + b*x + c, kolorPiksela); //oczywiście tutaj lepiej byłoby użyć procedury rysującej linię (prostą, lub krzywą beziera - zależy jak dokładny ma być wykres)
<font color="blue">*</span> Zależy od punktu widzenia
O mamma mia!! AndRew!! Poniosło Cię - zawodowo.
Nie używajcie Pixels, ale ScanLine. No chyba, że wykres ma się odświeżać raz na sekund kilka [diabel].
A czy współrzedna "y" nie jest czasem odwrotnie na canvasie ?
for x:= lewaStronaObszaruOkreślonosci to prawaStronaObszaruOkreślonosci do
zapalPunkt(x, -x*x*a + b*x + c, kolorPiksela); //oczywiście tutaj lepiej byłoby użyć procedury rysującej linię (prostą, lub krzywą beziera - zależy jak dokładny ma być wykres)
<font color="blue">*</span> Zależy od punktu widzenia
ale żeby odwrócić po Y wykres trzeba chyba
zapalPunkt(x, -(x*x*a + b*x + c), kolorPiksela);
Kawałek z TP (var A, B, C: Real; <- globalne, pobrane przed od użytkownika tą procedurą)
procedure RysujWykres;
var
grDriver, grMode, ErrCode: Integer;
X, Y: Real;
oX,oY: Integer;
const
Skala: Integer = 20;
Krok: Real = 0.05;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
oX := GetMaxX div 2;
oY := GetMaxY div 2;
repeat
ClearDevice;
SetColor(15);
Line(oX, 0, oX, GetMaxY);
Line(0, oY, GetMaxX, oY);
X := -10;
Y := A * X * X + B * X + C;
SetColor(4);
repeat
MoveTo(oX + Trunc(X*Skala),oY + Trunc(Y*Skala));
X := X + Krok;
Y := A * X * X + B * X + C;
LineTo(oX + Trunc(X*Skala),oY + Trunc(Y*Skala));
until X > 10;
SetColor(14);
OutTextXY(10,10,'Skala: x' + IntToStr(Skala));
OutTextXY(10,465,'+/- zmiana skali');
OutTextXY(480,465,'Spacja - zakonczenie');
Ch:=ReadKey;
case Ch of
'+' : if Skala < 255 then Inc(Skala);
'-' : if Skala > 1 then Dec(Skala);
end;
until Ch = ' ';
CloseGraph;
end
else
WriteLn('Blad grafiki:', GraphErrorMsg(ErrCode));
end;
Na co komu Pixels i ScanLine jak lepiej wykresy sie maluje uzywajac Line?
// Hmm wizualinie w TP ten kod zajmuje mniej ekraniu niż tu na forum :P
D7 Enterprise
zakladka Additional, komponent TChart dosyc ladny helpik ma,
ma mozliwosc tworzenia dynamicznego
w zwiazku z czym jak wrzucisz pusty sformatowany wykres na forme i napiszesz procedure rysujaca wykres (dodawanie serii czy jakos tak) to potem kazdorazowe jej uzycie odswiezy wykres.
Jest taki ciekaty komponent o nazwie Wykres :) Nawet chyba do Polskiemu i ma dobry opis