Umíte pascalsky - 26.lekce ...

Umíte pascalsky?
26.lekce
Vytisknout  

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

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

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.