Grafy funkcí
Ještě než přistoupíme ke grafům funkcí tak si něco řekneme o testování klávesnice.
Chceme-li v programu použít cokoliv z jednotky CRT (pro obsluhu klávesnice), musíme to překladači
oznámit hned za hlavičkou programu takto:
program Vypocet;
uses Crt;
...........
Testování klávesnice se provádí pomocí:
a) funkce ReadKey - typu Char
b) funkce KeyPressed - typu Boolean
ReadKey přečte znak z klávesnice do proměnné typu Char
Příkaz
klavesa = ReadKey;
zastaví program a čeká na stisk klávesy. Po stisknutí klávesy se znak nezobrazí na monituru
a znak z klávesnice se uloží do proměnné klavesa typu char.
Je-li stisknuta řídící klávesa (F1 .. F12, Ins, Del, kurzorové šipky,..), funkce ReadKey přečte #0, při
dalším volání ReadKey přečte znak odpovídající této klávese.
KeyPressed testuje, zda je právě stisknuta klávesa.
Je-li stisknuta libovolná klávesa, má hodnotu true.
Čekání na stisk klávesy můžeme realizovat pomocí cyklu:
Repeat until not KeyPressed;
Tento cyklus se může zacyklit, je-li neprázdná fronta znaků z klávesnice. Tuto frontu můžeme odčerpat pomocí cyklu:
Repeat until not KeyPressed or (ReadKey=#255);
Grafy funkcí vykreslujeme bod po bodu pomocí procedury PutPixel(x,y,barva).
Souřadnici x generujeme obyčejně cyklem for pro hodnoty z intervalu, ve kterém nás zajímá graf dané funkce.
Tyto hodnoty násobíme koeficientem, který udává vzdálenost jednotky od počátku soustavy souřadnic.
Souřadnici y generujeme pomocí funkce z hodnoty x vynásobením opět koeficientem.
K těmto hodnotám nesmíme zapomenout přičist (odečist) souřadnice počátku soustavy souřadnic.
Ukážeme si to na příkladě.
Příklad:
Sestavte program Funkce, který nakreslí postupně graf funkce y = 1,5.sin(2x-p/3) podle obrázku:

Myšlenka (hrubý algoritmus):
Funkci nejprve upravíme na tvar y = 1,5.sin 2(x-p/6) a budme postupně zobrazovat grafy funkcí:
f1: y = sinx
f2: y = sin(x-p/6)
f3: y = sin 2(x-p/6)
a nakonec výsledné funkce:
f: y = 1,5.sin 2(x-p/6) = 1,5.sin(2x-p/3)
Použijeme k tomu procedur:
Inicializace - inicializace grafického režimu
Nadpis - vytvoření nadpisu
Osy_popis - nakreslí osy x,y a popíše je
Graf - nakreslí graf funkce f1
Graf2 - nakreslí graf funkce f2
Graf3 - nakreslí graf funkce f3
Graf4 - nakreslí graf výsledné funkce
Upřesníme souřadnice jednotlivých elementů na obrazovce:

Program Funkce může vypadat takto:
program
Funkce; |
|
|
uses Crt, Graph;
const Pi=3.1415927;
var driver,mode:integer;
klavesa:char;
|
|
{připojení jednotky Crt,Graph}
{konstanta Pi}
{proměnné potřebné pro inicializaci}
{proměnná pro načtení znaku}
|
|
procedure Inicializace;
begin
|
|
|
DetectGraph(driver,mode);
InitGraph(driver,mode,'c:\tp\bgi ');
if GraphResult <> 0 then
begin
writeln('Chyba grafiky:',GraphErrorMsg(driver));
exit;
end
|
|
{detekce graf.karty a modu}
{inicializace}
{jestliže došlo k chybě}
{výpis chybového hlášení}
{ukončení programu}
|
end;
| | |
|
procedure Nadpis;
begin
|
|
|
SetBkColor(White);
SetViewPort(0,0,640,480,true);
SetColor(LightMagenta);
MoveTo(70,20);
SetTextStyle(GothicFont,0,4);
OutText('Graf funkce y = 1,5.sin(2x-Pi/3)');
|
|
{pozadí obrazovky bílé}
{okno pro obrazovku}
{písmo světle fialové}
{přemístí kurzor}
{font Gothic,velikost 4}
{tisk nadpisu}
|
end;
| | |
|
procedure Osy_popis;
var kolik:integer;
znak:string[2];
begin
|
|
|
SetColor(Blue);
MoveTo(3,250);
SetTextStyle(0,0,1);
LineRel(635,0);
LineRel(-6,-2);MoveTo(638,250);LineRel(-6,2);OutTextXY(630,235,'x');
MoveTo(3,460);LineRel(0,-400);
LineRel(-2,6);MoveTo(3,60);LineRel(2,6);OutTextXY(3,50,'y');
OutTextXY(8,95,'1,5');Line(1,100,5,100);
OutTextXY(8,145,'1');Line(1,150,5,150);
OutTextXY(8,258,'0');
OutTextXY(5,340,'-1');Line(1,350,5,350);
OutTextXY(5,390,'-1,5');Line(1,400,5,400);
for kolik:=1 to 12 do
begin
str(kolik,znak);
MoveTo(3+Trunc(kolik*Pi/6*100),250);
MoveRel(0,-3);Linerel(0,6);Moverel(0,-3);
OutTextXY(Trunc(kolik*Pi/6*100)-28,258,znak+'p/6')
end;
| |
{pero modré barvy}
{přemístění na začátek osy x}
{normální písmo}
{osa x}
{šipka a označení osy x }
{osa y}
{šipka označení osy y}
{popis osy y}
{jednotka na ose y je 100}
{popis osy x}
{jednotka délky 100}
{označují se násobky Pi/6}
|
end;
|
|
|
procedure Graf;
var kolik:integer;
begin
|
|
|
MoveTo(3,250);
For kolik:=0 to Trunc(2*Pi*100) do
PutPixel(3+kolik,250-Trunc(100*sin(kolik/100)),1);
| |
{přemístění do počátku}
{vykreslování bodů grafu}
|
end;
|
|
|
procedure Graf2;
var kolik:integer;
begin
|
|
|
MoveTo(3,250);
For kolik:=0 to Trunc(2*Pi*100) do
PutPixel(3+kolik,250-Trunc(100*sin(kolik/100-Pi/6)),Green);
| |
{přemístění do počátku}
{vykreslování bodů grafu}
|
end;
|
|
|
procedure Graf3;
var kolik:integer;
begin
|
|
|
MoveTo(3,250);
For kolik:=0 to Trunc(2*Pi*100) do
PutPixel(3+kolik,250-Trunc(100*sin(2*(kolik/100-Pi/6))),LightMagenta);
| |
{přemístění do počátku}
{vykreslování bodů grafu}
|
end;
|
|
|
procedure Graf4;
var kolik:integer;
begin
|
|
|
MoveTo(3,250);
For kolik:=0 to Trunc(2*Pi*100) do
PutPixel(3+kolik,250-Trunc(1.5*100*sin(2*(kolik/100-Pi/6))),LightRed);
| |
{přemístění do počátku}
{vykreslování bodů grafu}
|
end;
|
|
|
Begin
| |
|
Inicializace;
Nadpis;
Osy_popis;
Graf;
OutTextXY(50,400,'Graf y = sinx');
SetColor(Green);
OutTextXY(50,415,'Graf y = sin(x-Pi/6) po stisku klavesy');
klavesa:=readkey;
Graf2;
SetColor(LightMagenta);
OutTextXY(50,430,'Graf y = sin 2(x-Pi/6) po stisku klavesy');
klavesa:=readkey;
Graf3;
SetColor(LightRed);
OutTextXY(50,445,'Graf y = 1,5.sin 2(x-Pi/6) po stisku klavesy');
klavesa:=readkey;
Graf4;
klavesa:=readkey;
CloseGraph;
|
|
{inicializace}
{nadpis}
{nakreslení os a popis os}
{graf základní sinusoidy}
{rovnice funkce }
{zelená barva pera}
{výzva ke stisku klávesy}
{čekání na stisk klávesy}
{graf 2.funkce}
{světle fialová barva pera}
{výzva k pokračování}
{graf 3.funkce}
{graf výsledné funkce}
{ukončení grafického režimu}
|
End. |
| |
|
Domácí úkol:
Sestavte program Funkce , který nakreslí gafy funkcí:
f1: y = x2 a f2: y = x4 (ve stejné soustavě souřadnic)
a vedle grafy funkcí:
f3: y = x3 a f4: y = x5
(také ve stejné soustavě souřadnic) s nadpisem Grafy funkcí y = xn , n-přiroz.číslo, 1<n<6
On-line účast na řešení úkolu
Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen
jednou). Volbou Hodnocení
si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy,
Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.
|