Umíte pascalsky - 25.lekce ...

Umíte pascalsky?
25.lekce
Vytisknout  

Grafické možnosti

1.Inicializace

Chceme-li využívat grafické prostředky jednotky GRAPH, musíme hardware počítače přepnout do grafického režimu procedurou
InitGraph(adapter, mode, path)
adapter - typu integer, číslo grafické karty (1 - 10), lze autodetekovat pomocí příkazu
adapter := detect;
mode - typu integer, druh grafického režimu, nemusí být inicializována
path - typu string, cesta k souborům .BGI a .CHR

Proměnné adapter a mode můžeme zjistit procedurou
DetectGraph(adapter, mode)
Po deklaraci proměnných adapter, mode, path a inicializaci procedurou DetectGraph(adapter,mode), můžeme tedy přepnout do grafického režimu procedurou InitGraph(adapter,mode,path) a používat grafické procedury a funkce (zmizí obsah obrazovky textového režimu).

Funkce GraphResult vrací kód chyby poslední provedené grafické operace, je-li vše v pořádku, vrací hodnotu 0

Po ukončení práce v grafickém režimu musíme počítač přepnout zpět do textového režimu procedurou
CloseGraph

2.Tisk znaků

Tisk řetězce znaků provádí procedura
OutText(řetězec)
Chceme-li vytisknout číslo, musíme jej nejprve převést procedurou Str na řetězec.

Tisk od souřadnic [x,y] umožňuje procedura
OutTextXY(x,y,řetězec)

Při tisku nedochází k automatickému odřádkování (na pravém okraji). Pro odřádkování musíme kurzor přemístit na začátek následujícího řádku.

Přenesení grafického kurzoru na pozici [x,y] umožňuje procedura
MoveTo(x,y)

Přenesení grafického kurzoru o změnaX a změnaY zajistí procedura
MoveRel(změnaX,změnaY)

Funkce GetX vrací aktuální X-ovou souřadnici grafického kurzoru a funkce Gety vrací aktuální Y-ovou souřadnici grafického kurzoru.

Přemístění kurzoru na další řádek může tedy provést například příkaz MoveTo(0,GetY+10);

Styl písma definuje procedura
SetTextStyle(sada,směr,velikost)
- sada je číslo 0 až 4:

0 = Defaultfont písmo přítomné v jednotce
1 = Triplexfont TRIP.CHR na disku
2 = Smallfont LITT.CHR na disku
3 = Sansfont SANS.CHR na disku
4 = Gothicfont GOTH.CHR na disku
- směr je číslo 0 nebo 1:
0 = Horizdir zleva doprava
1 = Vertdir zdola nahoru
- velikost je celé kladné číslo:
1 .. 9 velikost
0 definuje programátor procedurou SetUserCharSize(mX,dX,my,dY)


Potřebujeme-li zjistit souřadnice levého horního a pravého dolního rohu obrazovky (popř. aktuálního okna), deklarujeme nejprve proměnnou rozmer:
var rozmer: viewporttype (předdefinovaný typ - záznam)
a potom použijeme proceduru GetViewPort(rozmer)
V proměnných rozmer.x1,rozmer.y1 jsou souřadnice levého horního rohu a
v proměnných rozmer.x2,rozmer.y2 jsou souřadnice pravého dolního rohu

Okno v grafickém režimu definuje procedura
SetViewPort(x1,y1,x2,y2,clip)
Kurzor se nastaví do levého horního rohu okna, okno se nesmaže ani neorámuje.

Aktuální okno smaže procedura
ClearViewPort

3.Barvy

Funkce GetMaxColor zjistí největší číslo barvy použitelné pro nastavení aktivní barvy

Procedura SetColor nastaví aktivní barvu z aktivní palety barev

Procedura SetBkColor nastaví barvu pozadí z aktivní palety barev

Paleta barev je množina barev (počet GetMaxColor), které smějí být naráz zobrazeny na monitoru. Další barvu můžeme dát do palety jen na úkor jiné barvy pomocí procedury SetPalette(číslo barvy,barva)

4.Kreslení obrázků

Pro kreslení čar slouží následující procedury:

PutPixel(x,y,barva) vybarví bod [x,y] zadanou barvou

Line(x1,y1,x2,y2) spojí body [x1,y1] a [x2,y2] úsečkou

LineTo(x,y) spojí současnou polohu graf.kurzoru s bodem [x,y] úsečkou

LineRel(změnaX,změnaY) spojí současnou polohu graf.kurzoru s bodem vzdáleným o změnaX a změnaY

SetLineStyle(typcary,maska,tloustka) definuje aktivní typ čáry
typcary

0 plná čára
1 tečkovaná
2 čerchovaná
3 čárkovaná
4 prog.definovaná
maska - číslo 0..3
tloustka
1 tenká
3 tlustá


Pro kreslení křivek se požívají tyto procedury:

Circle(x,y,poloměr) nakreslí kružnici se středem [x,y] a daným poloměrem

Ellipse(x,y,Od,Do,xp,yp) nakreslí elipsu nebo její část se se středem [x,y]
Od je počáteční úhel a Do je koncový úhel oblouku elipsy (celá elipsa je Od=0 a Do=360
xp je velikost poloosy X
yp je velikost poloosy Y

Arc(x,y,Od,Do,poloměr) nakreslí část kružnice se středem [x,y],daným poloměrem a danými úhly počátku a konce oblouku

Rectangle(x1,y1,x2,y2) nakreslí obdélník s levým hor.rohem [x1,y1] a pravým dolním [x2,y2]

DrawPoly(počet bodů,Souradnice) spojí úsečkami po řadě daný počet bodů se souřadnicemi uloženými v proměnné Souradnice
POLE musíme deklarovat: var Souradnice:Array [1..4] of PointType;
kde PointType je předdefinovaný typ pro souřadnice bodu v rovině (záznam o dvou složkách x,y)

Šrafované obrazce. FloodFill(x,y,barva) vyplní rovinu oklo bodu [x,y] danou barvou a aktivním typem šrafování až po hranici

SetFillStyle(druh,barva) určuje druh a barvu aktivního šrafování
druh je číslo 0..12 s tímto významem:

0 barva pozadí
1 barva pera
2 __________
3 /// slabé
4 /// silné
5 \\\ slabé
6 \\\ silné
7 mřížovaný
8 kosočtverce
9 proložené
10 tečky s velkými mezerami
11 tečky s malými mezerami
12 prog.definované šrafování


Bar(x1,y1,x2,y2) vyšrafovaný obdélník [x1,y1] a [x2,y2]

Bar3D(x1,y1,x2,y2,Hl,Vr) prostorový kvádr s vyšrafovanou přední stěnou, [x1,y1] a [x2,y2] jsou souřadnice přední stěny,Hl je hloubka a Vr (boolean) udává přítomnost vrchní podstavy.

FillPoly(počet bodů,Souradnice) vyšrafovaný mnohoúhelník

PieSlice(x,y,Od,Do,poloměr) vyšrafovaný kruhový oblouk

Sector(x,y,Od,Do,xp,yp) vyšrafovaná část elipsy

Příklad:
Sestavte program Kresli, který vytvoří tuto obrazovku:



Myšlenka (hrubý algoritmus):

Inicializace - inicializace grafického režimu
Nadpis - vytvoření nadpisu Křivky a tělesa
Robot - nakreslí hlavu robota
Jehlan - nakreslí a popíše čtyřboký jehlan

Upřesníme souřadnice jednotlivých elementů na obrazovce:



Program Kresli může vypadat takto:

program Kresli;
  uses Crt, Graph;
  var driver,mode:integer;
{připojení jednotky Crt,Graph}
{proměnné potřebné pro inicializaci}
 
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(LightRed);
    Rectangle(5,5,635,475);
    SetColor(LightMagenta);
    MoveTo(180,20);
    SetTextStyle(GothicFont,0,4);
    OutText('Grafika v Pascalu');
{pozadí obrazovky bílé}
{okno pro obrazovku}
{světle červená barva pera}
{orámování - obdélník}
{písmo světle fialové}
{přemístí kurzor}
{font Gothic,velikost 6}
{tisk nadpisu}
  end;

procedure Robot;
  var Souradnice:Array [1..4] of PointType;
  begin
    SetColor(LightRed);
    Rectangle(25,120,255,340);
    SetColor(LightBlue);
    Circle(75,180,25);Circle(205,180,25);
    SetFillStyle(1,LightBlue);
    FloodFill(75,180,LightBlue);FloodFill(205,180,LightBlue);
    Souradnice[1].x:=140;Souradnice[1].y:=220;
    Souradnice[2].x:=100;Souradnice[2].y:=260;
    Souradnice[3].x:=180;Souradnice[3].y:=260;
    SetColor(Green);
    SetFillStyle(1,Green);
    FillPoly(3,Souradnice);
    SetColor(LightRed);
    SetFillStyle(1,LightRed);
    Sector(140,300,180,360,50,20);
{pero světle červené barvy}
{nakreslení obdélníku}
{pero světle modré barvy}
{dvě modfé kružnice-oči}
{modrá barva pro vybarvení}
{vybarvení kružnic}
{definice souřadnic trojúhelníku}


{zelená barva pera}
{zelená barva pro vybarvení}
{vybarvený trojůhelník-nos}
{světle červená barva pera}
{světle červená barva pro vybarvení}
{vybarvená půlelipsa-pusa}
  end;

procedure Jehlan;
  begin
    MoveTo(250,440);
    SetColor(blue);
    LineRel(240,0);
    LineRel(120,-120);
    SetLineStyle(3,0,1);
    LineRel(-240,0);
    LineRel(-120,120);
    LineRel(360,-120);
    MoveRel(-240,0);
    LineRel(120,120);
    MoveRel(-60,-60);
    LineRel(0,-300);
    SetLineStyle(0,0,1);
    LineRel(-180,360);
    MoveRel(180,-360);
    LineRel(60,360);
    MoveRel(-60,-360);
    LineRel(180,240);
    MoveRel(-180,-240);
    SetLineStyle(3,0,1);
    LineRel(-60,240);
    SetTextStyle(0,0,1);
    OutTextXY(240,440,'A');OutTextXY(495,440,'B');
    OutTextXY(358,315,'D');OutTextXY(615,315,'C');
    OutTextXY(430,70,'V');OutTextXY(425,385,'S');
{přemístění do bodu A}
{modrá barva pera}
{nakreslení strany AB}
{strana BC}
{čárkovaná čára}
{strana CD}
{strana DA}
{úhlopříčka AC}
{přesun do bodu D}
{úhlopříčka DB}
{přesun do bodu S}
{výška SV}
{plná čára}
{hrana VA}
{přesun zpět do bodu V}
{hrana VB}
{přesun zpět do bodu V}
{hrana VC}
{přesun zpět do bodu V}
{čárkovaná čára}
{hrana VD}
{nastavení normal.písma}
{popis vrcholů jehlanu}


  end;

Begin
   Inicializace;
   Nadpis;
   Robot;
   Jehlan;
   readln;
   CloseGraph;
End.



Domácí úkol:

    Sestavte program Kreslim , který nakreslí barevnou hrací kostku a velmi zjednodušeně osobní automobil (autíčko) s nadpisem Hra v Pascalu.

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.