Pascal programozás alap és haladó szinten!

Mindenkinek akit kicsit is érdekel ,de tudni akar! AZ övék ez a honlap!

7.jpg

A Turbo Pascal grafikája - a GRAPH unit

Ha rajzolni szeretnénk a képernyõre, akkor azt át kell kapcsolnunk grafikus üzemmódba. A grafikus képernyõn külön-külön hozzáférhetünk az egyes képpontokhoz. Ismernünk kell (illetve bizonyos határok között meghatározhatjuk) a képernyõnk felbontását (a VGA üzemmódban a legnagyobb felbontás 640x480) valamint azt, hogy hány színt használhatunk (az elõbb említett felbontásnál 16 színt). A (0, 0) képpont a képernyõ bal felsõ sarkában található.

Az egység fontosabb eljárásai, függvényei, típusai, konstansai:

A grafikus képrnyõ inicializálása (átkapcsolás karakteres képernyõrõl grafikusra), bezárása:
Eljárások: InitGraph, DetectGraph, CloseGraph, stb.
Függvények: GraphResult, stb.
Konstansok: grafikus meghajtók (Pl. Detect = 0, CGA = 1 stb.); grafikus üzemmódok (pl. VGALo, VGAMed, VGAHi stb.)
Pl.:

    uses Graph;
    var Meghajto, Uzemmod: integer;
    begin
      Meghajto := Detect; {Automatikusan beállítja grafikus üzemmódot a legnagyobb felbontással.}
      InitGraph(Meghajto, Uzemmod, 'C:\TP70\BGI');  {Inicializálás}
      If GraphResult <> 0 then
        begin
          WriteLn('Grafikus hiba!');  {Nem sikerült az inicializálás, kilépés a programból}
          ReadLn;
          Halt
        end;
      ...{Grafika használata}
      CloseGraph    {Grafikus képernyõ bezárása}
    end

 

Színek: Konstansok: 16 színû üzemmódban megegyeznek a Crt unit konstansaival.

               Eljárások: SetColor, SetBkColor, stb.

               Függvények: GetColor, GetBkColor, stb.

Rajz: Típusok: LineSettingsType (ld. GetLineSettings), stb.

Konstansok: vonalstílus (pl. SolidLn, DottedLn, stb. ld. SetLineStyle), vonalvastagság ( NormWidth. ThickWidth ld. ld. SetLineStyle), rajzolási mód (pl. CopyPut, XorPut, stb. ld. SetWritMode)
Eljárások: PutPixel, Line, LineTo, LineRel, Circle, Rectangle,SetLineStyle,GetLineSettings, SetWriteMode, stb.

Kitöltött rajz: Típusok: FillSettingsType (ld. GetFillSettings), stb.

Konstansok: kitöltési stílus (pl. SolidFill, LineFill, stb. ld. SetFillStyle)
Eljárások: Bar, Bar3D, FillEllipse, FloodFill, SetFillStyle, GetFillSettings,

Szöveg: Típusok: TextSettingsType (ld. GetTextSettings), stb.

Konstansok: betûtípus, szövegállás, szövegigazítás
Eljárások: OutText, OutTextXY, SetTextStyle, GetTextSettings stb.

Kurzor: Függvények: GetX, GetY, stb.

               Eljárások: MoveTo, MoveRel, stb.

Egyéb: Kép mentése egy változóba, visszatöltése: ImageSize, GetImage, PutImage.

Példa: 1. Kérjük be grafikus képernyõn egy parabola és egy egyenes egyenletét. Ábrázoljuk a görbéket, és metszéspontjaikat határozzuk meg grafikusan valamint analitikusan. A program tegye lehetõvé, hogy a le- ill. felfele nyíllal Y irányban mozgathassuk az egyenest, a jobbra ill. balra nyíllal a meredekségét változtathassuk, a PgUp ill. PgDn billentyûkkel pedig a koordinátarendszer méretarányát (képpont/egység) változtathassuk.
Megoldás:  Graph unit - példaprogram

program GraphPl;
uses Crt, Graph;
var  dr, mo, h, px1, px2, py1, py2: integer;
     x1, x2, y1, y2, a, b, c, d, m, n: real;
     s1, s2: string[6];
     k: char;
 
{Grafikus kepernyõn adatbevitel az x változóba.}
procedure Beolvas(var x: real);
  var hiba, xx: integer;
      ch: char;
      s: string;
  begin
    s[0] := #0;
    xx:= GetX;
    repeat
      ch := ReadKey;  {Egy karakter leütése.}
      SetColor(yellow);
      if (ch in ['0'..'9']) or (ch in ['.','-']) then
        begin
          OutText(ch); {A karakter megjelenítése, ha számjegy, elõjel vagy tizedespont.}
          s := s + ch; {A karakter hozzáfûzése.}
         end;
       {Torles}
       if (ch = #8) and (s[0] > #0) then
         begin
             MoveTo(xx, GetY); SetColor(black); OutText(s);
             s[0] := Chr( Ord(s[0]) - 1 );
             MoveTo(xx, gety); SetColor(yellow); OutText(s);
           end;
    until ch = #13;  {ENTER-re adatbevitel vége}
    Val(s, x, hiba);    {Az s string konvertálása valóssá, elhelyezése az x változóban.}
  end;
 
{Koordinátarendszer kirajzolása.}
procedure Koord;
 
  var i: integer;
  begin
    Line(0, 240, 640, 240); Line(320, 0, 320, 480);
    Line(315, 5, 320, 0); Line(320, 0, 325, 5);
    Line(635, 235, 640, 240); Line(635, 245, 640, 240);
    for i := 0 to 640 div h do Line(h * i, 238, h * i, 242);
    for i := 1 to 480 div h do Line(318, h * i, 322, h * i);
    OutTextXY(624, 228, 'x'); OutTextXY(325, 10, 'y');
  end;
 
{A parabola és az egyenes kirajzolása.}
procedure FvRajzolas;
  var px, py: integer;
      x, y: real;
  begin
    for px := 0 to 639 do      {Az x tengely minden pixelénél a függvényértékek  }
      begin                    { kiszámítása, megjelenítése.}
        x := (px - 320) / h;   {A pixelértékhez  x független változó érték rendelése.}
        y := a*x*x + b*x + c;  {Az y függõ változó kiszámítása.}
        py:=Round(-h*y + 240); {Az y függõ változóhoz pixel érték rendelése.}
        PutPixel(px, py, red); {Megjelenítés}
        y:=m*x + n;
        py:=Round(-h*y + 240);
        PutPixel(px, py, green);
      end;
  end;
 
{Az egyenes és a parabola metszési egyenletének a megoldása.}
procedure Metszes;
  begin
    d := sqr(b-m) - 4*a*(c-n);
    if d < 0.0 then OutTextXY(50, 50, 'Nincs gy”k!')
    else
      if d > 0.0 then
        begin
          x1 := ( -(b-m) + Sqrt(d) ) /2/a;
          x2 := ( -(b-m) - Sqrt(d) ) /2/a;
          y1 := m*x1 + n;
          y2 := m*x2 + n;
          px1 := Round(h*x1 + 320);
          px2 := Round(h*x2 + 320);
          py1 := Round(-h*y1 + 240);
          py2 := Round(-h*y2 + 240);
          SetLineStyle(1, 0, 1);
          Line(px1, py1, px1, 240);
          Line(px2, py2, px2, 240);
          Str(x1:6:2, s1);
          Str(x2:6:2, s2);
          OutTextXY(50, 50, 'A k‚t gy”k:'+s1+' ; '+s2)
        end
      else
        begin
          x1 := -(b-m) /2/a;
          y1 := m*x1 + n;
          px1 := Round(h*x1 + 320);
          py1 := Round(-h*y1 + 240);
          SetLineStyle(1, 0, 1);
          Line(px1, py1, px1, 240);
          Str(x1:6:2, s1);
          OutTextXY(50, 50, 'A gy”k:'+s1)
        end;
  end;
{A függvények és a metszéspontok törlése.}
procedure Torles;
  var px, py: integer;
      x, y: real;
  begin
    for px := 0 to 640 do
      begin
        x := (px-320) / h;
        y := m*x + n;
        py := Round(-h*y + 240);
        PutPixel(px, py, black);
        y := a*x*x + b*x + c;
        py := Round(-h*y + 240);
        PutPixel(px, py, black);
      end;
    SetColor(black);
    SetLineStyle(0, 0, 1);
    Koord;
    if d < 0 then begin SetColor(0); OutTextXY(50, 50, 'Nincs gy”k!') end
    else
      if d > 0 then
        begin
          SetColor(black);
          Line(px1, py1, px1, 240);
          Line(px2, py2, px2, 240);
          OutTextXY(50, 50, 'A k‚t gy”k:'+s1+' ; '+s2)
        end
      else
        begin
          SetColor(black);
          Line(px1, py1, px1, 240);
          OutTextXY(50, 50, 'A gy”k:'+s1)
        end;
  end;
begin
  {Inicializálás}
  h := 40;  {A koordinátarendszer egysége 40 képpont.}
  dr := 0;
  InitGraph(dr, mo, 'c:\bp\bgi');
  SetColor(yellow);
  SetLineStyle(0, 0, 1);
  Koord;
  {A parabola és az egyenes egyenletének beolvasása.}
  MoveTo(50,  40); OutText('A parabola egyenlete:');
  MoveTo(50,  70); OutText('a: '); Beolvas(a);
  MoveTo(50,  90); OutText('b: '); Beolvas(b);
  MoveTo(50, 110); OutText('c: '); Beolvas(c);
  MoveTo(50, 140); OutText('Az egyenes egyenlete:');
  MoveTo(50, 170); OutText('m: '); Beolvas(m);
  MoveTo(50, 190); OutText('n:  '); Beolvas(n);
  ClearDevice;
  {Ismétlés az ESC bill. leütéséig.}
  repeat
    setcolor(yellow);
    setlinestyle(0,0,1);
    Koord;
    FvRajzolas;
    Metszes;
    k := ReadKey;    {Várakozás egy billentyû leütésére, kód beolvasása.}
    if k = #0 then   {Kettõs kódú billentyû (kurzormozgató)}
      begin
        k := ReadKey;  {Második kód beolvasása.}
        Torles;
        case k of
          #72: n := n + 0.2;      {Felfele nyíl: az egyenes eltolása y irányban felfelé.}
          #80: n := n - 0.2;      {Lefele nyíl: az egyenes eltolása y irányban lefelé.}
          #77: m := m + 0.1;      {Jobbra nyíl: az egyenes meredekségének növelése.}
          #75: m := m - 0.1;      {Balra nyíl: az egyenes meredekségének csökkentése.}
          #73: h := h * 2;        {PgUp: lépték növelése.}
          #81: h := Round(h / 2); {PgDn: lépték csökkentése.}
        end; {case}
      end {if}
  until k = #27;         {Kilépés ESC-re.}
  CloseGraph;
end.   
5.jpg




Weblap látogatottság számláló:

Mai: 11
Tegnapi: 7
Heti: 22
Havi: 87
Össz.: 153 438

Látogatottság növelés
Oldal: A Turbo Pascal grafikája - a GRAPH unit Ha rajzolni szeretnénk a képernyõre, akkor azt át kell kapcs
Pascal programozás alap és haladó szinten! - © 2008 - 2024 - kerigseoszt.hupont.hu

A HuPont.hu-nál a honlap készítés egyszerű. Azzal, hogy regisztrál elkezdődik a készítés!

ÁSZF | Adatvédelmi Nyilatkozat

X

A honlap készítés ára 78 500 helyett MOST 0 (nulla) Ft! Tovább »