Ñîçäàéòå ïðèëîæåíèå, êîòîðîå ñòðîèò ïèêñåëÿìè ãðàôèê ôóíêöèè y=3*Sin(x)*Cos(x/6).
Ñîçäàéòå ôîðìó, ñâîéñòâó Caption êîòîðîé ïðèñâîéòå çíà÷åíèå «Ãðàôèê ôóíêöèè».  îêíå Èíñïåêòîðà îáúåêòîâ çàäàéòå äëÿ ñâîéñòâà Forml.ClientHeight (âûñîòà îêíà ôîðìû) çíà÷åíèå 300, äëÿ ñâîéñòâà Forml.ClientWidht (øèðèíà îêíà ôîðìû) çàäàéòå çíà÷åíèå 500, äëÿ ñâîéñòâà Forml.Color çàäàéòå çíà÷åíèå clWhite (áåëûé).
Äëÿ ñîçäàíèÿ ïðîöåäóðû îáðàáîò÷èêà ñîáûòèÿ OnPaint (ïåðåðèñîâàòü èçîáðàæåíèå) âûáåðèòå â îêíå Èíñïåêòîðà îáúåêòîâ îáúåêò Forml è íà ñòðàíèöå Events ïðîèçâåäèòå äâîéíîé ùåë÷îê íà ïóñòîì ïîëå ñïèñêà â ñîáûòèè OnPaint. Ïîñëå ýòîãî â îêíå Ðåäàêòîðà êîäà áóäåò ñãåíåðèðîâàíà çàãîòîâêà ïðîöåäóðû îáðàáîò÷èêà ñîáûòèÿ procedure TForml.FormPaint(Sender: TObject); Ââåäèòå â òåêñò ïðîöåäóðû âûçîâ ïðîöåäóðû ïîñòðîåíèÿ ãðàôèêà ôóíêöèè DrawGraph:
procedure TForml.FormPaint(Sender: TObject);
begin
DrawGraph; {âûçîâ ïðîöåäóðû ïîñòðîåíèÿ ãðàôèêà ôóíêöèè}
end:
Òàê êàê ïðè ïðîãðàììèðîâàíèè ïðîöåäóðû ïîñòðîåíèÿ ãðàôèêà ôóíêöèè íàì ïðèäåòñÿ èñïîëüçîâàòü äëÿ ðèñîâàíèÿ Canvas (õîëñò, êàíâà), îêðàøèâàÿ ïèêñåëû êàíâû, èçó÷èòå ñïðàâî÷íóþ èíôîðìàöèþ î ñâîéñòâàõ Canvas è Pixels. Ïîñêîëüêó ïåðåä ïîñòðîåíèåì ãðàôèêà ïðèäåòñÿ ÷åðòèòü ïðÿìûå ëèíèè – îñè êîîðäèíàò è âûâîäèòü òåêñò íà èçîáðàæåíèè, òî ñëåäóåò òàêæå èçó÷èòü ñïðàâêó Delphi î ìåòîäàõ MoveTo, LineTo è TextOut.
 ñâÿçè ñ òåì, ÷òî ïðè ïîñòðîåíèè ãðàôèêà ôóíêöèè íåîáõîäèìî çàäàâàòü öåëî÷èñëåííûå çíà÷åíèÿ êîîðäèíàò îêðàøèâàåìîãî ïèêñåëà, à ðåçóëüòàò âû÷èñëåíèÿ ôóíêöèè ÿâëÿåòñÿ âåùåñòâåííûì ÷èñëîì, ñëåäóåò îçíàêîìèòüñÿ ñî ñïðàâî÷íîé èíôîðìàöèåé Delphi, êàñàþùåéñÿ ôóíêöèè Round, îêðóãëÿþùåé âåùåñòâåííûå ÷èñëà äî áëèæàéøåãî öåëîãî ÷èñëà.
Îòêðîéòå îêíî Ðåäàêòîðà êîäà è ââåäèòå òåêñò ïðîöåäóðû ïîñòðîåíèÿ ãðàôèêà ôóíêöèè:
procedure DrawGraph: // Ïîñòðîåíèå ãðàôèêà ôóíêöèè
var
xl,x2: real; {ãðàíèöû èçìåíåíèÿ àðãóìåíòà ôóíêöèè}
yl,y2: real; {ãðàíèöû èçìåíåíèÿ çíà÷åíèÿ ôóíêöèè}
õ : real; {àðãóìåíò ôóíêöèè}
ó : real; {çíà÷åíèå ôóíêöèè â òî÷êå õ}
dx : real; {ïðèðàùåíèå àðãóìåíòà}
l,b : integer; {ëåâûé íèæíèé óãîë îáëàñòè âûâîäà ãðàôèêà}
w,h: integer; {øèðèíà è âûñîòà îáëàñòè âûâîäà ãðàôèêà}
mx,my: real; {ìàñøòàá ïî îñÿì X è Y}
õÎ,óÎ: integer; {òî÷êà - íà÷àëî êîîðäèíàò}
Function f(x:real):real; {ôóíêöèÿ, ãðàôèê êîòîðîé íàäî ïîñòðîèòü}
begin
f:= 3*Sin(x)*Cos(x/6);
end;
begin {îáëàñòü âûâîäà ãðàôèêà íà ôîðìå}
1:=10; {X - êîîðäèíàòà ëåâîãî âåðõíåãî óãëà}
b:=Forml.Ñ1ientHeight-20; (Ó - êîîðäèíàòà ëåâîãî âåðõíåãî óãëà}
h:=Forml.ClientHeight-40; // âûñîòà
w:=Forml.Width-40; // øèðèíà
õ1:=0; // íèæíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
õ2:=25; // âåðõíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
dx:=0.01; // øàã àðãóìåíòà
{îïðåäåëåíèå ìàêñèìàëüíîãî è ìèíèìàëüíîãî çíà÷åíèé ôóíêöèè íà îòðåçêå [xl,x2] äëÿ ìàñøòàáèðîâàíèÿ}
yl:=f(xl); {ìèíèìàëüíîå çíà÷åíèå ôóíêöèè}
y2:=f(xl); {ìàêñèìàëüíîå çíà÷åíèå ôóíêöèè}
x:=xl;
{âû÷èñëÿòü çíà÷åíèÿ ôóíêöèè äëÿ çíà÷åíèé õ<=õ2 è îïðåäåëèòü ìàêñèìàëüíîå è ìèíèìàëüíîå çíà÷åíèÿ äëÿ ìàñøòàáèðîâàíèÿ}
repeat y:=f(x); if y
yl;=y; {åñëè òåêóùåå çíà÷åíèå ó ìåíüøå ìèíèìàëüíîãî, òî ó1:=ó}
if y>y2 then ó2:=ó; {åñëè òåêóùåå çíà÷åíèå ó áîëüøå ìèíèìàëüíîãî, òî ó2:=ó}
x:=x+dx; {ïåðåéòè ê ñëåäóþùåìó çíà÷åíèþ õ}
until (x>=x2); {êàê òîëüêî õ>=õ2. ïðåêðàòèòü}
my:=h/abs(y2-yl); // ìàñøòàá ïî îñè Y mx:=w/abs(x2-xl); // ìàñøòàá ïî îñè X
{çàäàòü íà÷àëî êîîðäèíàò} õ0:=1;
yO:=b-Abs(Round(yl*my));
with Forml.Canvas do {ðèñîâàíèå ãðàôèêà}
begin
{íà÷åðòèòü îñè êîîðäèíàò} MoveTo(I ,b);
LineTo(I,.b-h); {îñü x} MoveTo(xO,yO);
LineTo(xO+w.yO); {îñü ó} Text0ut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
{âûâåñòè ìàêñèìàëüíîå çíà÷åíèå}
TextOut(xO+w,yO,'x'); // ïîäïèñàòü îñü õ TextOut(1+5,b,FloatToStrF(yl,ffGeneral,6,3));
{âûâåñòè ìèíèìàëüíîå çíà÷åíèå}
Text0ut(l-7,b-h-5,'ó'); // ïîäïèñàòü îñü ó
{ïîñòðîåíèå ãðàôèêà} x:=xl:
repeat {ïîâòîðÿòü ðèñîâàòü òî÷êè}
y:=f(x); Forml. Canvas. Pixel s[xO+Round(x*mx),yO-Round(y*rny)]:=clRed;
{clRed - êðàñíûé öâåò ðèñîâàíèÿ ãðàôèêà}
x:=x+dx;
until (x>=x2); {ïðåêðàòèòü, êàê òîëüêî õ>=õ2}
end;
end;
Èçó÷èòå òåêñò ïðîöåäóðû ïîñòðîåíèÿ ãðàôèêà ôóíêöèè DrawGraph. Ñîõðàíèòå, îòêîìïèëèðóéòå è çàïóñòèòå ïðèëîæåíèå íà âûïîëíåíèå. Óáåäèòåñü, ÷òî â îêíå ïðèëîæåíèÿ ïðîèçâîäèòñÿ ïîñòðîåíèå ãðàôèêà çàäàííîé ôóíêöèè.
Åñëè âû ïîïûòàåòåñü èçìåíèòü ðàçìåðû îêíà, òî óâèäèòå, ÷òî ãðàôèê èñêàæàåòñÿ, òàê êàê îí íå ïåðåðèñîâûâàåòñÿ â ñîîòâåòñòâèè ñ íîâûìè ðàçìåðàìè îêíà.
Äëÿ òîãî ÷òîáû ïåðåðèñîâûâàòü èçîáðàæåíèå ïðè èçìåíåíèè ðàçìåðîâ ôîðìû, ñëåäóåò ñîçäàòü îáðàáîò÷èê ñîáûòèÿ On Resize, îïðåäåëÿþùèé íîâûå ïàðàìåòðû êëèåíòñêîé îáëàñòè è âûçûâàþùèé ïðîöåäóðó ïîñòðîåíèÿ ãðàôèêà ôóíêöèè DrawGraph. Ýòà ïðîöåäóðà ìîæåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
procedure TForml.FormResizeCSender: TObject);
begin
with Forml do Canvas. FillRect (Rect (0,0, ClientWicith, ClientHeight)):
{çàïîëíåíèå ïðÿìîóãîëüíèêà êàíâû, óêàçàííîãî ïàðàìåòðîì Rect, ãäå ClientWidth.ClientHeight -øèðèíà è âûñîòà êëèåíòñêîé îáëàñòè â ïèêñåëàõ}
DrawGraph; end;
Ñîõðàíèòå èçìåíåííîå ïðèëîæåíèå, îòêîìïèëèðóéòå åãî è ïðîâåðüòå åãî ðàáîòó. Óáåäèòåñü, ÷òî â îêíå ïðèëîæåíèÿ âûïîëíÿåòñÿ ïîñòðîåíèå ãðàôèêà çàäàííîé ôóíêöèè, ïðè÷åì ïðè èçìåíåíèè ðàçìåðîâ îêíà ïðîèñõîäèò êîððåêòíîå ïåðåðèñîâûâàíèå ãðàôèêà â íîâîì ìàñøòàáå.
|