Grafika w Turbo Pascal'u
Turbo Pascal - Moduł standardowy GRAPH
Moduł Graph zawiera ponad 70 procedur i funkcji standardowych, obsługuje grafikę ekranową. Procededury i funkcje tego modułu pozwalają rysować na ekranie krzywe różnych kształtów i kolorów, wypełniać kontury określonym kolorem, a także wprowadzać na ekran napisy (poziomo i pionowo) w różnych krojach pisma, z możliwością ich zmniejszania i powiększania.
Wykorzystanie standardowych procedur i funkcji modułu Graph wymaga jego deklaracji za pomocą słowa kluczowego uses. Przed wywołaniem pierwszej funkcji lub procedury graficznej moduł Graph powinien zostać zainicjowany przez wywołanie procedury InitGraph, która ładuje do pamięci i inicjuje odpowiedni sterownik.
Poniższa procedura wykrywa naszą kartę oraz tryb graficzny, który obsługuje.
DetectGraph(Karta,Tryb); { u mnie karta 9 - VSA, tryb 2 - VGAHi }
Po detekcji jest inicjalizacja. Poniższa procedura stawia już tylko przysłowiową kropkę nad i. Trzecim parametrem jest katalog, w którym znajdują się sterowniki graficzne i czcionki.
InitGraph(Karta,Tryb,'c:\bp\bgi');
Spójrzmy na prostą detekcję naszej karty graficznej i jej parametrów.
program detekcja;
uses graph;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb);
InitGraph(Karta,Tryb,'c:\bp\bgi');
{ jestesmy teraz 'wewnatrz' trybu graficznego }
x:= getmaxx;
y:= getmaxy;
CloseGraph;
writeln('Sterownik graficzny numer: ',Karta);
writeln('Tryb : ',Tryb);
writeln('Rozdzielczosc: ',x,' X ',y);
Readln;
end.
Program rysuje koło z wykorzystaniem funkcji sinus i cosinus.
W kolejnym programie zaprezentuję procedurę PutPixel(z modułu Graph), jej parametrami są: pozycja X, pozycja Y, kolor zapisany jako łańcuch lub jako wartość liczbowa
Oczywiście w module Graph są gotowe funkcje rysujące koła etc.(o czym później), ale chciałem pokazać na jakiej zasadzie są one tworzone - wszystkie bowiem figury są opisywane przez równania matematyczne.
program kolo_sin_cos_biegunowo;
uses
graph,crt;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb);
InitGraph(Karta,Tryb,'c:\bp\bgi');
for i:=1 to 360 do
PutPixel(GetMaxX div 2+Round(SIN(i)*50), GetMaxY div 2+Round(COS(i)*50),Yellow);
Readln;
CloseGraph;
end.
W module graph zaczynamy się już bawić w rozdzielczościach 640 na 480 (najczęścięj).
Pierwszego programu rysujący pixel
program pixel;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\pascal\bgi\');
end;
procedure piksel;
begin
putpixel(100,100,1);
end;
begin
inicjacja;
piksel;
readkey;
closegraph;
end.
Objaśnienie:
Tu widzimy parę nowych komend, czas na ich wytłumaczenie.
detectgraph(...,...); - wykrywa nasz sterownik i tryb w którym ma pracować. Na miejsu kropek trzeba podać zmienną
initgraph(...,...,'ścieżka dostępu do katalogu bgi'); - inicjacja trybu graficznego. Na miejscu kropek trzeba podać te same zmienne co w detectgraph.
putpixel(x,y,c); - wstawia piksel w miejscu x,y i o kolorze c.
readkey; - oczekuje na wciśnięcie klawisza; closegraph; - zamyka modul graph.
Uwagi:
W trybie 640 na 480 piksel w górnym lewym rogu będzie miał współrzędne 0,0, a piksel w dolnym prawym rogu 639,479.
Zalecam robienie procedure, wtedy program jest bardziej przejrzysty i łatwiejszy w zrozumieniu.
Powiedzmy, że pascal znajduje się w katalogu kompilatory, to ścieżka będzie wyglądała tak:
'c:\kompilatory\pascal\bgi\'
Program 2 będzie rysował dwie linie.
program linie;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure linie;
begin
lineto(100,100);
line(200,200,300,200);
end;
begin
inicjacja;
linie;
readkey;
closegraph;
end.
Objaśnienie:
line(x,y,x2,y2); - rysuje linię od miejsca x,y do miejsca x2,y2.
lineto(x,y); - rysuje linię od miejsca aktualnego położenia wskanika ekranu do miejsca x,y.
Następny program zmieni tło na kolor niebieski, wstawi tekst i namaluje zieloną linię.
program tlo;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure napis;
begin
outtextxy(200,100,'To moj juz 17 program.');
end;
procedure linia;
begin
line(200,120,370,120);
end;
begin
inicjacja;
setbkcolor(1);
setcolor(2);
napis;
linia;
readkey;
closegraph;
end.
Objaśnienie:
outtextxy(x,y,'tekst'); - wstawia tekst w miejscu x,y.
setcolor(c); - ustawia kolor dla linii i tekstu.
setbkcolor(c); - ustawia kolor dla tła.
Malowaniu prostokątów.
Oto pierwszy program
program prog18;
uses crt,graph;
var sterownik,tryb:integr;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure pros;
begin
bar(100,100,300,200);
end;
begin
inicjacja;
pros;
readkey;
closegraph;
end.
Objaśnienie:
bar(x,y,x2,y2); - maluje prostokśt o lewym górnym rogu w miejscu x,y i o prawym dolnym rogu w miejscu x2,y2.
Następny program będzie malował wypełniony prostokąt.
program prog19;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure pros;
begin
setfillstyle(1,8);
bar(100,100,300,200);
end;
begin
inicjacja;
setbkcolor(1);
pros;
readkey;
closegraph;
end.
Objaśnienie:
W tym programie wystąpiła tylko jedna nowa procedura:
setfillstyle(s,c); - określa styla i kolor wypełnienia. Pierwsza cyfra określa styl wypełnienia, jest chyba 10 stylów do wyboru. Druga cyfra określa kolor wypełnienia, jeli nie pamiętasz kolorów zajrzyj do pierwszej lekcji modułu crt (na końcu).
Następny program także o prostokącie
program prog20;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure pros;
begin
setbkcolor(1);
rectangle(100,100,200,200);
setfillstyle(2,2);
bar3d(100,250,200,350,30,true);
end;
begin
inicjacja;
pros;
readkey;
closegraph;
end.
Objaśnienie:
rectangle(x,y,x2,y2); - maluje nie wypełniony prostokąt o górnym lewym punkcie x,y i o dolnym prawym punkcie x2,y2.
bar3d(x,y,x2,y2,g,p); - maluje prostokąt o górnym lewym punkcie x,y i o dolnym prawym punkcie x2,y2, wypełnia go ustawionym stylem i tworzy z niego prostopadłocian o głębokoci 'g'. Za literę p trzeba podać wyraz true lub false. True oznacza, że prostopadłościan ma być z górną podstawą, a false, odwrotnie do true.
Elipsy i okręgi
Najpierw program rysujący elipsę o środku 200,200
program prog21;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure elipsa;
begin
setbkcolor(0);
setcolor(14);
ellipse(200,200,0,360,100,50);
end;
begin
inicjacja;
elipsa;
readkey;
closegraph;
end.
Objanienie:
ellipse(x,y,a,b,r1,r2); - maluje elipsę (łuk) o rodku x,y, o osi poziomej r1 i osi pionowej r2. Jeżeli w miejscu a wpiszemy 0, a w miejscu b 360 otrzymamy elipsę, w innym przypadku będzie to tylko łuk elipsy.
Popróbujcie z innymi kštami elipsy, bo napewno się wam przydadzš.
Następny program namaluje nam elipsę wypełnioną ustawionym stylem.
program prog22;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure wypelipsa;
begin
setbkcolor(0);
setfillstyle(1,14);
fillellipse(200,200,100,50);
end;
begin
inicjacja;
wypelipsa;
readkey;
closegraph;
end.
Objaśnienie:
fillelipse(x,y,r1,r2); - maluje wypełnioną elipsę o środku x,y o długości osi poziomej r1 i o długości osi pionowej r2.
Wypełniona elipsa jest dużo łatwiejsza niż sam łuk elipsy.
Następny program rysuje okrąg.
program prog23;
uses crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'c:\...\bgi\');
end;
procedure okrag;
begin
setbkcolor(0);
setcolor(4);
circle(200,200,100);
end;
begin
inicjacja;
okrag;
readkey;
closegraph;
end.
Objaśnienie:
circle(x,y,r); - rysuje okršg (bez wypełnienia) o środku x,y i promieniu r.
Obsług myszki w graphie.
Na początku musimy stworzyć moduł obsługujący myszkę, więc do roboty.
unit modul1;
interface
uses dos;
procedure pokazm;
procedure ukryjm;
procedure pozycjam;
procedure klatkam(x1,y1,x2,y2);
implementation
procedure pokazm;
var r:registers;
begin
r.ax:=$0001;
intr($33,r);
end;
procedure ukryjm;
var r:registers;
begin
r.ax:=$0002;
intr($33,r);
end;
procedure pozycjam(x,y,b);
var r:registers;
begin
r.ax:=$0003;
intr($33,r);
x:=r.cx;
y:=r.dx;
b:=r.bx;
end;
procedure klatkam(x1,y1,x2,y2);
var r:registers;
begin
r.ax:=$0007;
r.cx:=x1;
r.dx:=x2;
intr($33,r);
r.ax:=$0008;
r.cx:=y1;
r.dx:=y2;
intr($33,r);
end;
end.
To naszczęcie był moduł, to znaczy, że z nim często nie będziemy się widzieli :) Moduł ten musicie umiecić w katalogu z pascalem. Jeżeli macie pascala na dysku c we folderze pascal, to trzeba go włożyć do 'C:\pascal\'. Modułu nie da się skompilować do końcówki .exe. Moduł w c ma takš nazwę modul.tpu. Moduł jest nawet podobny do samego programu, ale moduł posiada tylko procedury. Jak już zauważylicie na poczštku modułu pisze się 'unit', a nie jak w przypadku programu 'program'. Tyle o module, przejdmy do programu używajšcy powyższy moduł.
program prog24;
uses modul1,crt,graph;
var sterownik,tryb:integer;
procedure inicjacja;
begin
detectgraph(sterownik,tryb);
initgraph(sterownik,tryb,'C:\...\pascal\bgi\');
end;
begin
inicjacja;
pokazm;
readkey;
end.
W tym programie nic nowego się nie pojawiło obrócz użycia modułu o myszce. Ta lekcja była bardzo krótka, ale to z tego względu, że jestem pišcy :). Po za tym nad 25 programem będę musiał chwilę pomyleć, w końcu to będzie milenijny. Nie zapominajcie, że możecie przysyłać swoje prace. Zwłaszcza jak zrobicie jaki rysunek, dom albo samochód. Aby ułatwić wam rysowanie podam wam jeszcze raz komendy dotyczšce rysowania.
floodfill(x,y,c); - wypełnia dowolny zamknięty obszar. x,y - współrzędne, c - kolor
setcolor(c) - ustawia kolor dla linii i tekstu
setbkcolor(c) - ustawia kolor dla tła
ellipse(x,y,a,b,r1,r2); - maluje elipsę (łuk) o rodku x,y, o osi poziomej r1 i osi pionowej r2. Jeżeli w miejscu a wpiszemy 0, a w miejscu b 360 otrzymamy elipsę, w innym przypadku będzie to tylko łuk elipsy.
fillelipse(x,y,r1,r2); - maluje wypełnionš elipsę o rodku x,y o długoci osi poziomej r1 i o długoci osi pionowej r2.
circle(x,y,r); - rysuje okršg (bez wypełnienia) o rodku x,y i promieniu r.
putpixel(x,y,c); - wstawia pixel w miejscu x,y o kolorze c
line(x,y,x2,y2); - maluje linię od punktu x,y do punktu x2,y2
lineto(x,y); - maluje linię od obecnego miejsca położenia do punktu x,y
http://free.of.pl/p/programek/