Turbo Pascal - Programowanie Wszystko o Turbo Pascalu
Obszerny download i wiele kodów źródłowych
Menu
Kurs
Pozostałe


Podstawy programowania grafiki

Podstawy niskopoziomowego programowania grafiki przy użyciu języków wysokiego poziomu.

W artykule tym zajmiemy się podstawami programowania grafiki w językach wysokiego poziomu (z wykorzystaniem języka Pascal), używając przy tym niskopoziomowych możliwości graficznych komputera osobistego, popularnie zwanego pecetem w języku polskim.

Artykuł przedstawia ogólne możliwości programowania grafiki, przytoczony tutaj kod będzie działał zarówno w systemie Linux jak i Windows. Jedynym ograniczeniem jest możliwość wywoływania funkcji niskopoziomowych przez wywołania Assembler'a. Tak więc Linux nie stwarza nam tutaj żadnych ograniczeń, niestety Windows (a jakże) w wersji XP nie zezwoli nam na tego typu ExPerymenty. Niemniej Windows 95/98 nie ma tego typu ograniczeń. Czego poza systemem operacyjnym potrzebować będziemy? Kompilatora języka Pascal. Dla Windows może to być znakomity Turbo Pascal Borland'a, dostępny już za darmo. Dla Linuxa mamy darmowy oczywiście Free Pascal Compiler, włączony w dystrybucję Debian GNU/Linux 3.0 "Woody", którego mam przyjemność używać.

Pierwszą rzeczą jaką zrobimy, aby uzyskać jakikolwiek efekt jest oczywiście edycja kodu. Odpalamy edytor i rozpoczynamy:

program gfx;
var x, y: word; {wspolrzedne x, y oraz c jako kolor}
c : byte;
{inicjacja trybu graficznego 320x200x256)
procedure initvga; assembler;
asm
mov ah, 00h; {do gornej polowki rejestru AX liczba 0}
mov al, 13h; {do dolnej polowki rejestru AX liczba 13h, dziesietnie 19}
int 10h; {wywolujemy przerwanie karty graficznej}
end;
{powrot do trybu textowego}
procedure inittxt; assembler;
asm
mov ah, 00h;
mov al, 03h;
int 10h;
end;
begin
end.

Jak nietrudno zauważyć tryb textowy ma numer 03h, a graficzny (320x200x256) 13h. Sprawa jest prosta. Ale nasz program na razie nic nie robi. Podstawowym narzędziem w grafice jest umiejętność zapalania pixeli na ekranie i matematyka.

Jeżeli ktoś zajmował się wcześniej BGI (Borland Graphics Interface) to z pewnością wie, że bardzo użyteczną procedura byla putpixel(). Napiszemy teraz naszą własną procedurę putpixel. To wystarczy. aby na ekranie otrzymywać rozmaite figury, w różnych kolorach, lub nawet soczyste fraktale - praktycznie stosując wiedzę matematyczną (o tym niestety nie ma w szkołach).

{procedura zapalajaca punkt na ekranie}
procedure putpixel (x, y: word; c: byte); assembler;
asm
mov ah, 0Ch;
mov al, c; {kolor pixela}
mov cx, x; {koordynata pozioma pixela}
mov dx, y; {koordynata pionowa pixela}
int 10h;
end;


Potrafimy już ustawiać tryb graficzny, zapalać na ekranie pojedynczy pixel i to wszystko co nam potrzeba. Zajmijmy się więc wykorzystaniem powyższego kodu. Dodajmy do klauzuli stałych (w języku Pascal występuje ona po deklaracji zmiennych trzy stałe:

const mx=319; {wartość maxymalna x - od 0 do 319 = 320 punktow}
my=199; {wartość maxymalna y - od 0 do 199 = 200 punktow}
mc=255; {wartość maxymalna c - od 0 do 255 = 256 kolorow}


I możemy rozpoczynać w ciele głównym programu:

begin
initvga;
for x:=0 to mx do
for y:=0 to my do putpixel(x, y, 10);
inittxt;
end.


Ten kod zamaluje cały ekran na zielono. Co jeśli chcielibyśmy uzyskać z powrotem kolor czarny? Wystarczy zmienić parametr c (kolor) w procedurze putpixel() z 10 (kod koloru zielonego) na 0 (czarny).

A teraz wykorzystajmy to co ludzkość wie o podstawach matematyki. Załóżmy, że chcielibyśmy uzyskać wykres f-cji sin(x) na ekranie - sinusoida przypomina falę. Pierwsze co musimy zrobić to napisać funkcję, która będzie potrafiła konwertować stopnie na radiany. Łatwo możemy posługiwać się stopniami, natomiast komputer wymaga podawania radianów jako parametrów f-cji trygonometrycznyc:

function degtorad (deg: real): real;
begin
degtorad:=deg*(((2*pi))/360);
end;
begin
(...)
for x:=0 to mx do putpixel(x, round(40*sin(degtorad(x))+100), 15);
(...)


Ten kod wyrysuje nam fragment sinusoidy na ekranie. Trygonometrię można także wykorzystać do wyrysowania okręgu na ekranie, znane jest bowiem trygonometryczne równanie okręgu:

x=r*cos(deg); y=r*sin(deg);


gdzie x, y to punkty leżące na okręgu, a r jest jego promieniem.

Czyścimy wiec ekran znanym już sposobem i wykorzystujemy to równanie w pętli. Zmienną i wykorzystujemy jako stopnie, aby okrąg się zamknął potrzeba kąta pełnego czyli 360 stopni. Do x i y wyliczonych w pętli, podczas wyświetlania w putpixel() należy dodać pewne wartość (u nas 100 i 100). Są to współrzędne środka okręgo. Aby okrąg nie składał się z punktów należy zwiększyć dokładność wyliczania stopni. A wiec np. wyliczać stopnie nie co 10, a np. co 1. A oto kod:

for x:=0 to mx do
for y:=0 to my do putpixel(x, y, 0);
i:=0;
repeat
x:=round(20*cos(degtorad(i)));
y:=round(20*sin(degtorad(i)));
putpixel (x+100, y+100, 15);
i:=i+10;
until i>360;


Do kompilacji możemy użyć kompilatora Free Pascal'a lub powszechnego Turbo Pascala Borlanda. Grafika komputerowa to bardzo obszerny temat. Programowanie niskopoziomowe może nie jest oszałamiające (na tym poziomie), lecz ma ogromną zaletę - jest szybkie. Oczywiście można wiele rzeczy usprawnić, np. operować bezpośrednio na pamięci graficznej, zamiast wywoływać funkcję Bios'u. Rekurencja jest techniką niezwykle użyteczną w programowaniu grafiki. Poza tym matematykę na razie wykorzystaliśmy w poziomie bardzo podstawowym.

Źródło: 4programmers.net.

Dodano: 2007-05-18

Twoja ocena:

 

Ocena:

[powrót]

Największy zbiór informacji o Turbo Pascalu
Copyright © 2007 by rafael. All rights reserved. : Hosting zapewnia: programuj.com turbopascal.programuj.com - programowanie najlepsze kursy w sieci unikatowe artykuły za darmo Borland Turbo Pascal 7.0