PASCAL ile GRAFİK

tarantula90115.11.2008 - 21:24
BÖLÜM 16
PASCAL ile GRAFİK
Günümüzde grafiklere olan ihtiyaç, başta mühendislik, fen bilimleri ve ticari çalışmalar
olmak üzere bir çok alanda artmaktadır. Günümüzün gelişmiş Pentium tabanlı PC 'leri
bu ihtiyaca oldukça hızlı bir şekilde cevap verebilmektedir. Kişi, grafik çalışmalarını genel
olarak paket programlar aracılığı ile gidermektedir. Ancak bazı özel durumlarda paket
programlarla bu ihtiyacın giderilmesi mümkün olmayabilir. Bu durumda yapılması gereken
işlem, kişinin özel amacına yönelik grafik programı yazılmasıdır.
Borland firması 1985 'te Turbo Pascal 3.0 sürümü için hazırlamış olduğu Turbo Graphix
Toolbox grafik paketini programcılara sunmuştur. Pakette bulunan grafik komutlarının
zenginliği Turbo Pascal 'ın grafik çalışmalarında üst düzeye çıkmasını sağlamıştır.
Günümüzde Borland Pascal 7.0, Borland Delphi, Visual Basic, Visual C++ gibi program
geliştirme setlerinin oldukça güçlü grafik paketleri vardır.
16.1 Grafik Ekranı
Grafik ekranı, ekranın yatayda ve düşeyde eşit aralıklar bölünmesinden elde edilen matris


elemanlarından oluşur. Bu matris elemanları, grafiği oluşturan en küçük parçacıklardır.
Bilgisayarda bu parçaların her birine piksel (pixel) denir. Ekrandaki her pikselin yatay ve
düşey olmak üzere bir koordinat numarası vardır. Ekrandaki grafik çizimleri bu koordinat
numarasından yararlanılarak gerçekleştirilir.
Borland grafik sisteminde ekranın sol üst köşesi, piksel matris alanının başlangıç
noktasıdır. X koordinatı soldan sağa doğru, Y koordinatı yukarıdan aşağıya doğru artar.
Bu ifadeye göre bir grafik ekranın koordinat sistemi aşağıda verildiği gibidir.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
175
0,0
Xmax,Ymax
Burada Xmax ve Ymax grafik ekranın aldığı maksimum X ve Y koordinatlarıdır.
Grafik sistemi başlatıldığında fiziksel ekranın sol üst köşesi orijin (0,0) olmak üzere x
ekseni sağa doğru, y ekseni de aşağıya doğrudur. Fiziksel ekran koordinat sisteminde Y
ekseninin aşağıya doğru oluşu alışılagelmiş olduğumuz kartezyen koordinat sistemine
göre zorluklar yaratır. Grafik uygulamalarında X sağa doğru Y yukarıya doğru olduğunda
bu zorluklar aşılabilir. Bunun için yapılması gereken işlem, orijin noktasının sol alt köşeye
alınmasıyla birlikte çizimde kullanılan y koordinatlarını -1 ile çarparak negatiflerinin
kullanılmasıdır. Orijin Setviewport komutunun kullanımıyla ekran üzerinde istenilen
konuma alınabilir.
16.2 DOS için Pascal Grafiği
Borland grafik paketi, Borland firmasının Turbo C, Turbo Pascal ve Turbo Prolog
programlama dilleri için hazırladığı hızlı, büyük, gelişmiş ve grafik adaptöründen bağımsız
çalışabilen komutları içeren bir yazılım olup iki kısımdan meydan gelmiştir.
* Grafik komut kütüphanesi
* Grafik arabirimi
Grafik komut kütüphanesi, grafikle ilgili tüm komutları içerir. Bu kütüphanedeki komutlar
grafik adaptörü tipinden bağımsız olarak ayarlanmıştır. Grafik arabirimi ise, grafik
programının bilgisayarda bulunan grafik adaptörüyle iletişimi sağlar. Grafik
kütüphanesindeki tüm komutların uygun şekilde çalışması bu arabirimin kullanılmasıyla
gerçekleşir. Grafik arabirimi, çizime başlamadan önce grafik kütüphansesindeki komutlar
yardımıyla belleğe yüklenir.
Grafik arabirimi, her adaptörü için ayrı ayrı oluşturulmuş ve manyetik diske "BGI' uzantılı
olarak yüklenmiştir. Bunlara kısaca, Borland Grafik Arabirimi (Borland Graphics
Interface-BGI) dosyalar denir.
Bir grafik programının derlenip çalıştırılabilmesi için Pascal programlama dilinde aşağıda
belirtilen dosyalara ihtiyaç duyulur. Bu dosyalar;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
176
1. Grafik Komut Kütüphanesi
* GRAPH.TPU komut kütüphanesi (Gerçek mod - Real mode)
* GRAPH.TPP komut kütüphanesi (Korumalı mod - Protected mode)
2. Bilgisayarda bulunan grafik adaptörüne ait bilgilerin bulunduğu aşağıda ilgili
BGI dosyalarından biri,
ATT.BGI
CGA.BGI
EGAVGA.BGI
HERC.BGI
IBM8514.BGI
PC3270.BGI
VESA16.BGI
3. Eğer grafik ekranda bir metin yazımında çeşitli fontlar kullanılacaksa,
kullanılacak font tiplerine ait karakter font dosyaları. Bu dosyalar CHR
uzantılıdır.
TRIP.CHR
LITT.CHR
SANS.CHR
SIMP.CHR
TSCR.CHR
LCOM.CHR
EURO.CHR
BOLD.CHR
Derleyiciye program içinde grafik komutlarının bulunduğu USES komut satırında aşağıdaki
komut ile bildirilir.
USES GRAPH;
16.2.1 DetectGraph
Bu alt program, bilgisayarda kullanılan grafik uyarlayıcıya ait grafik sürücünün ve grafik
konumunun otomatik olarak belirlenmesini sağlar. Bu alt programın çalıştırılması için;
DetectGraph (Grafiksurucu,Grafikkonumu);
Satırının yazılması gerekir.
Eğer grafik uyarlayıcı hakkındaki bilginin yazılım tarafından belirlenmesi istenirse
DetectGraph komutu kullanılarak bu bilgiler elde edilir. Komutun kullanımı;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
177
DetectGraph (Grafiksurucu,Grafikkonumu);
şeklindedir. Bu komut ile grafik uyarlayıcı hakkında bilgi elde edildikten sonra Initgraph
komutu uygulanır.
Grafiksurucu ve grafikkonumu programın VAR bölümünde tamsayı (örneğin:integer) tipte
tanıtılır. Komutun bu şekilde kullanılmasında tanımlanan bu değişkenlere grafik sürücüyle
ilgili bilgiler atanabilir. Örneğin; VGA uyumlu bir grafik uyarlayıcıda grafik ortamının
başlatılması için gerekli komutlar aşağıda verilmiştir.
Grafiksurucu:=VGA;
Grafikkonumu:=VGAHi;
Grafik ortamının başlatılması için ise Initgraph komutu kullanılır.
16.2.2 Initgraph
Grafik sürücü ve grafik konumu ile tanımlanan grafik ortamını başlatır. Grafik ortamın
başlatılması için detectgraph alt programının çalıştırılmasından komutundan sonra;
Initgraph (Grafiksurucu,Grafikkonumu,'sürücü yolu');
Grafik sürücü yerine sıfır verilirse alt program otomatik olarak grafik uyarlayıcıyı tanır ve
grafik konumunu en yüksek ayrıntıya ayarlar. Burada kullanılan sürücü yolu; bilgisayarda
BGI dizininin bulunabileceği yoldur.
Initgraph ile kullanılan parametreler grafik sürücünün ve grafik uyarlayıcı belirlenmesi için
kullanılmaktadır. "C:\bp\bgi" ise, grafik sürücülerinin bulunduğu klasörü
belirtmektedir.
Daha önce de belirtildiği gibi grafik ekranın kooordinatları 0,0 ile başlar. Hercules
standardındaki ekranda sol alt köşenin koordinatı (0,347), sağ üst köşenin koordinatı
(719,0), sağ alt köşenin koordinatı ise (719, 347) dir. 640*480 piksel matris alanına
sahip VGA (VGAHi) konumunda, koordinatlar yukarıda belirtildiği sırayla (0,0), (0,479),
(639,0) ve 639,479) dur. Kullandığınız ekranın köşe ve merkez koordinatlarını sergileyen
örnek program aşağıda verilmiştir. Bu programda kullanılan komutlar daha sonra
tanımlanacaktır.
Örnek:
uses graph;
var
x,y,renk,grafiksurucu,grafikkonumu, hatakodu:integer;
Hata:Boolean;
Function Kataryap(x,y:integer):string;
var
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
178
sx,sy:string[5];
begin
str(x,sx);
str(y,sy);
Kataryap:='('+ Sx+','+Sy+')';
end;
begin
detectgraph(grafiksurucu,grafikkonumu);
initgraph(grafiksurucu,grafikkonumu,'c:\bp\bgi');
hatakodu:=Graphresult;
hata:=hatakodu<>grOK;
if hata then
begin
Writeln('Grafik konumu hatası :',Grapherrormsg(hatakodu));
end;
moveto(0,0);
outtext(kataryap(0,0));
moveto(0,getmaxY-10);
outtext(kataryap(0,getmaxY));
moveto(getmaxX-80,0);
outtext(kataryap(getmaxX,0));
moveto(getmaxX-80,getmaxY-10);
outtext(kataryap(getmaxX,GetmaxY));
moveto(Trunc(getmaxX/2),Trunc(GetmaxY/2));
outtext(kataryap(Trunc(getmaxX/2),Trunc(GetmaxY/2)));
Renk:=Blue;
X:=0;
Y:=X;
repeat
putpixel(x,y,renk);
inc(x);inc(y);
until (X>GetmaxX) or (Y>GetmaxY);
readln;
closegraph;
end.
Yukarıda verilen örnekte ekranın maksimum ve minimum noktaları GetmaxX ve GetmaxY
komutları ile belirlenmektedir.
16.2.3 ClearDevice
Grafik ekranı temizlemek amacıyla kullanılır. Komutun aktif hale getirilmesi için
Cleardevice yazmak yeterlidir. 80*25 yazı ekranındaki CLRSCR komutuna benzer.
Kullanımı;
Cleardevice;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
179
16.2.4 Closegraph
Grafik ortamı kapatarak ekranı grafik ortama geçmeden önceki konumuna getirir ve
grafik sistemi tarafından kullanılan belleği serbest duruma getirir. Grafik ortamdan çıkışta
kesinlikle kullanılmalıdır.
16.2.5 GetmaxX
Kullanılan grafik konumu için yatay koordinatın maksimum değerini getirir.
16.2.6 GetmaxY
Kullanılan grafik konumu için düşey koordinatın maksimum değerini getirir.
16.2.7 GraphErrorMsg
Grafik ortamında oluşan hataya ilişkin bir rapor verir. Kullanım şekli;
GraphErrorMsg(GrafikHata);
Burada kullanılan Grafikhata isimli değişken integer tipte bir değişken olup
GraphErrorMsg altprogramı çalıştığında hata söz konusu olduğunda bir değer alır. Eğer
bir grafik hatası söz konusu değilse Grafikhata isimli değişkenin aldığı değer sıfır olur.
16.2.8 Graphresult
Grafik işleminde oluşan hatanın kodunu getirir. Hata kodu sıfırdan farklı ise, grafik
işeminde hata olduğu görülür. Örnek programı inceleyiniz.
Örnek
uses Graph;
var
Hatakodu: Integer;
Grafiksürücü, Grafikkonumu: Integer;
begin
GrDriver := Detect;
InitGraph(Grafiksürücü, Grafikkonumu, 'c:\bp\bgi');
Hatakodu:= GraphResult;
if Hatakodu <> 0 then
begin
Writeln('Grafik hatası:');
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
180
Writeln(GraphErrorMsg(Hatkodu));
Writeln('Program Kesildi');
Halt(1);
end;
ClearDevice;
Rectangle(0, 0, GetMaxX, GetMaxY);
Readln;
CloseGraph;
end.
16.2.9 SetViewport
Bu komut grafik ekranda bir grafik penceresinin tanımlanması amacıyla kullanılır. Grafik
ekrana geçildiğinde başlangıç olarak getmaxX+1 genişliğinde ve getmaxY+1
yüksekliğinde bir grafik pencere oluşur. Programcı gerektiğinde bu pencerenin boyutlarını
değiştirerek daha küçük boyutlara sahip bir alanda çizim yapabilir. Aşağıda verilen
Setviewport komutunun kullanımında X1,Y1, X2 ve Y2 pencerenin tanımlanmasında,
Clipoff/Clipon ise çizimin pencere dışına taşan kısmının kesilip kesilmeyeceğine karar
vermek için kullanılır. Kesme yapılmaması için Clipoff, kesme yapılması için Clipon
kullanılır.
Setviewport iki amaç için kullanılır. Bunlar;
Grafik ekranın (0,0) koordinatının ekranda başka bir yere taşınması
Grafik ekran içinde bir pencere tanımlanmasıdır.
Orijinin Taşınması: Grafik sistemi başlatıldığında (0,0) noktası, ekranın sol üst
köşesidir. X sağa doğru (+), Y aşağıya doğru (+) değerlerine sahiptir. Setviewport
komutuyla eksenlerin yönünü değiştirmeden (0,0) koordinatını başka bir yere taşımak için
komutla birlikte kullanılması gereken parametreler şu şekildedir;
X1,Y1 :Yeni orijinin grafik ekrandaki yeni koordinatı
X2,Y2 :X1<X2 ve Y1<Y2 olmak üzere herhangi bir koordinat
Kesme :Clipoff;
Orijini ekranın ortasına almak için aşağıda verilen komut kullanılabilir.
Setviewport(Trunc(getmaxX/2), Trunc(getmaxY/2), getmaxX, getmaxY,Clipoff);
Yeni Pencere Oluşturulması: tüm grafik ekranı içinde daha küçük bir grafik ekranın
tanımlanması işlemidir. Tanımlanan grafik penceresi boyutları hariç, tüm grafik ekranın
taşıdığı özelliklere sahiptir.
Setviewport ile bir grafik pencerenin tanımlanması için verilen parametrelerin alması
gereken değerler şu şekilde verilebilir.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
181
X1,Y1:Yeni grafik pencerenin sol üst köşe koordinatı
X2,Y2:X1<X2 ve Y1<Y2 olmak üzere yeni grafik pencerenin sağ alt köşe koordinatı
Kesme:Taşan kısımın kesilmesi için Clipon, kesilmemesi için Clipoff
Setviewport(X1,Y1,X2,Y2;Clipon); şeklinde kullanılır.
Aşağıda verilen örnek programda orijin ekranın merkezine taşınmış ve orijinden ekranın
sağ alt köşesine bir çizgi çizilmiştir. Programın çalıştırılması sonucu oluşan ekran
görüntüsü programın sonunda verilmiştir.
Örnek:
uses graph;
var
x,y,grafiksurucu,grafikkonumu:integer;
Function Kataryap(x,y:integer):string;
var
sx,sy:string[5];
begin
str(x,sx); str(y,sy);
Kataryap:='('+ Sx+','+Sy+')';
end;
begin
detectgraph(grafiksurucu,grafikkonumu);
initgraph(grafiksurucu,grafikkonumu,'c:\bp\bgi');
setbkcolor(white);
setcolor(1);
setviewport(trunc(getmaxX/2),trunc(getmaxy/2),getmaxX,getmaxy,clipoff);
line(0,0,getmaxX,getmaxy);
moveto(-10,-10);
outtext(kataryap(0,0));
readln;
closegraph;
end.
Orijin noktası değiştirildiğinde orijinin üstünde kalan bölgeler kullanılacak ise kesme
yapılmayacağını ifade etmek için setviewport komutuna Clipoff parametresi yazılır.
Sadece yeni pencere kullanılacak ise Clipon yazılır. Örnek programda kesme
kullanılmamış olup, moveto (-10,-10) komutu ile tanımlanan pencere dışına taşılmıştır.
Moveto komutu grafik imleci, belirtilen koordinata konumlandırmak amacıyla kullanılır.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
182
Programın çalışması sonucu elde edilen grafik ekran
Cleardevice komutunun setviewport komutundan sonra kullanılması durumunda sadece
tanımlanan yeni pencere içindeki grafik ekran temizlenir.
16.3 Çizim Komutları
En çok kullanılan çizim komutları aşağıda özetlenmiştir.
16.3.1 PutPixel
PutPixel komutu yardımıyla koordinatı verilen pixel, belirtilen renge boyanır. Kullanım
şekli;
PutPixel(x,y,renk);
X:pikselin kaçıncı sütuna karşılık geldiği;
Y:Pixelin kaçıncı satıra karşılık geldiği;
Renk:pixelin boyanacağı renk;
Putpixel(100,20,blue);
Şeklinde yazılan bir komut ile, 100. sütun ve 20. satıra karşılık gelen pixel mavi renk ile
boyanır.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
183
Bir doğrunun denklemi analitik olarak Y=ax+b şeklinde ifade edilir. Verilen X1,Y1 ve
X2,Y2 noktalarından geçen doğrunun a ve b parametrelerini ;
Y1=ax1+b
Y2=ax2+b
Denklem takımını çözerek bulabiliriz.
a=(x1.y2-x2.y1)/(x1-x2)
b=(y2-y2)/(x2-x1)
a ve b değerleri elde edildikten sonra x1>x2 olduğu kabul edilerek, x ekseninde X1 'den
X2 'ye ilerlerken y eksenindeki değerleri de;
y=ax+b
eşitliğinden elde edebiliriz. Pixel komutu kullanarak y=ax+b şeklindeki doğrunun çizimi
aşağıdaki programda verilmiştir.
Örnek:
uses graph;
var
x1,y1,x2,y2,grafiksurucu,grafikkonumu,renk:integer;
dosya :text;
Procedure degistir(var d1,d2:integer);
var z:integer;
begin
z:=D1;
d1:=d2;
d2:=z;
end;
procedure cizgi(x1,y1,x2,y2,renk:integer);
var
a,b:real;
xy,x,y:integer;
begin
if (x1=x2) and (y1=y2) then
begin
putpixel(x1,y1,renk);
exit;
end;
if x1=x2 then
begin
if y1>y2 then degistir (y1,y2);
for y:=y1 to y2 do
putpixel(x1,y1,renk);
exit;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
184
end;
if y1=y2 then
begin
if x1>x2 then degistir (x1,x2);
for X:=x1 to x2 do
putpixel(x1,y1,renk);
exit;
end;
{denklem parametrelerinin hesaplanması}
if x2<>x1 then
begin
a:=(y2-y1)/(x2-x1);
b:=(x1*x2-x2*y1)/(x1-x2);
end;
if X1>X2 then degistir(x1,x2);
for X:=x1 to x2 do
begin
Y:=trunc(a*x+b);
putpixel(x,y,renk);
end;
end;
begin
detectgraph(grafiksurucu,grafikkonumu);
initgraph(grafiksurucu,grafikkonumu,'c:\bp\bgi');
x1:=50;
y1:=50;
X2:=550;
Y2:=350;
RENK:=white;
cizgi(x1,y1,x2,y2,renk);
readln;
closegraph;
end.
Programın çalışması sonucunda elde edilen doğru aşağ__________ıda verilen şekilde görülmektedir.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
185
Örnek:Aşağıdaki program ikinci derece denklemin grafiğini çizmektedir.
uses graph;
var
i,grafiksurucu,grafikkonumu:integer;
x1,y1:array[1..50] of integer;
begin
detectgraph(grafiksurucu,grafikkonumu);
initgraph(grafiksurucu,grafikkonumu,'c:\bp\bgi');
setbkcolor(white);
setcolor(1);
setviewport(trunc(getmaxX/2),trunc(getmaxy/2),getmaxX,getmaxy,clipoff);
line(0,0,100,0); {eksen takımının çizilmesi}
line(0,0,-100,0);
line(0,0,0,75);
line(0,0,0,-175);
for i:=0 to 5 do
begin
Y1:=sqr(i)-1;
putpixel(i*5,-y1*5,3); {Grafiğe ait noktalar beş kat abartılı çiziliyor}
putpixel(-i*5,-y1*5,3);
end;
for i:=1 to 5 do
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
186
begin
line((i-1)*5,(-y1[i-1])*5,i*5,(-y1*5)); {Putpixel ile konan noktalar line ile
birleştiriliyor}
line(-(i-1)*5,(-y1[i-1])*5,-i*5,(-y1*5));
end;
readln;
closegraph;
end.
y=x2-1 in 5 grafiği
Programda kullanılan Setbkcolor, zemin rengini, Setcolor ise çizgi rengini düzenlemek
için kullanılır. Renklerin isimleri ve sayısal değerleri aşağıdaki tabloda gösterilmiştir.
Renk Renk kodu Anlamı Renk Renk kodu Anlamı
Black 0 Siyah DarkGray 8 Gri
Blue 1 Mavi LightBlue 9 Açık Mavi
Green 2 Yeşil Lightgreen 10 Açık Yeşil
Cyan 3 Turkuaz Lightcyan 11 Açık Turkuaz
Red 4 Kırmızı Lightred 12 Açık Kırmızı
Magenta 5 Eflatun Lightmagenta 13 Açık Eflatun
Brown 6 Kahverengi Yellow 14 Sarı
Lightgray 7 Açık gri White 15 Beyaz
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
187
Örnek: Verilen program ile sinüs-cosinüs grafiği çizilmektedir.
uses graph;
var gd,gm,y2:integer;
i,s,c:real;
Begin
Gd:=Detect;
initgraph(Gd,Gm,'c:\bp\bgi');
i:=0; setbkcolor(white);
y2:=GetmaxX div 5;
Repeat
s:=1-Sin(i); C:=1-Cos(i);
Putpixel(Trunc(40*i),Trunc(y2*s+50),1);
Putpixel(Trunc(40*(i-5)),Trunc(y2*c+50),5);
i:=i+0.001;
until i>=10 *pi;
readln;
end.
Programın çalıştırılmasıyla elde edilen grafik
16.3.2 Çizgi Tipleri
Pascal grafik ortamı başlatıldığında sürekli ince çizgi tipi aktif haldedir. Çizgi tipini ve
kalınlığını değiştirmek için Setlinestyle komutu kullanılır. Komutun genel kullanımı;
SetLineStyle(çizimtipi,Pattern,Kalınlık);
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
188
Çizimtipi için kullanılabilecek sabit isimler ve bu isimlerin içerdikleri değerler aşağıdaki
tabloda verilmiştir.
Sabit isim Sayısal değer Çizim Tipi
SolidLn 0
DottedLn 1
CenterLn 2
DashedLn 3
UsetBitLn 4 ?
Bu tabloda görülen UserbitLn, ancak kullanıcı tarafından tanımlandığında geçerli olabilir.
Pattern parametresi, grafik sisteminde tanımlı dört tane doğru çizim tipi dışında
kullanıcının kendi çizim tipini tanımlamakta kullandığı değeri içeren parametredir.
Kalınlık parametresi; çizilen çizginin kalınlığının tanımlandığı bir tamsayı değerdir. Bu
parametre için sadece 2 değer tanımlanmıştır. Bunlar aşağıda verilmiştir.
NormWidth (1) 1 pixel kalınlığında,
ThickWidth (3) 3 pixel kalınlığında,
Örnek:
uses Graph;
var
X1, Y1, X2, Y2,Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi');
setbkcolor(white);setcolor(blue);
X1 := 10; Y1 := 10; X2 := 200; Y2 := 150;
SetLineStyle(DottedLn, 0, NormWidth);
Rectangle(X1, Y1, X2, Y2);
SetLineStyle(UserBitLn, $C3, ThickWidth);
Rectangle((X1+10), (Y1+10), (X2+10), (Y2+10));
SetLineStyle(SolidLn, 0, NormWidth);
Rectangle(X1+20, Y1+20, X2+20, Y2+20);
Readln;CloseGraph;
end.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
189
Programın çalıştırılması sonucu elde edilen grafik görüntüsü
16.3.3 Line Komutu
Bir doğru parçası çizimini gerçekleştirilmesi için Line komutu kullanılır. Line komutu ile bir
doğru parçası çizimi için, Borland Grafik Koordinat sistemine göre belirlenmiş olan bir
başlangıç ve bir de bitiş koordinatı kullanılır. Komutun kullanımı;
Line(X1,Y1,X2,Y2);
şeklindedir. Koordinat tanımlamalarında kullanılan değişkenlerin tamsayı olması gerekir.
X1,Y1
X2,Y2
Line Komutunda kullanılan parametreler
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
190
16.3.4 Circle Komutu
Circle Komutu, daire çizimi için kullanılır. Çizimin gerçekleştirilmesi için; X,Y şeklinde
dairenin merkez koordinatı ve dairenin yarı çapı değerleri verilir.
R X,Y
Circle komutunda kullanılan parametreler
Komutun kullanılması;
Circle(X,Y,R);
şeklindedir. Reel sayılarla çizim yapmak mümkün olmadığından Burada kullanılan bütün
değerlerin tam sayıya yuvarlatılması gerekir.
16.3.5 Arc Komutu
Bir daire parçası çizimi için kullanılır. Komutun kullanımı;
Arc(X,Y,Açı1,Açı2,R);
şeklindedir. Burada;
X :yayın X koordinatı,
Y :yayın Y koordinatı
Açı1 :yayın başlangıç açısı,
Açı2 :yayın bitiş açısı,
R :yayın yarı çapıdır.
Örnek:
uses Graph;
var
Gd, Gm: Integer;
Radius: Integer;
begin
Gd := Detect;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
191
InitGraph(Gd, Gm,'c:\bp\bgi ');
setbkcolor(15);
setcolor(1);
for Radius := 1 to 5 do
Arc(100, 100, 0, 90, Radius * 10);
Readln;
CloseGraph;
end.
0
360 °
270°
180°
90°
AÇI1
AÇI2
R
X,Y
Programla elde edilen grafik görüntüsü
16.3.6 Ellipse Komutu
Bir elips veya eliptik yay çizimi için kullanılan komut "ellipse" ' dir. Komutun kullanımı;
Ellipse(X,Y,Açı1,Açı2,Rx,Ry);
şeklindedir. Komut ile birlikte kullanılan paramatreler;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
192
X :Elips merkezinin X koordinatı
Y :Elips merkezinin Y koordinatı
Açı1,Açı2:Elips veya eliptik yayın başlangıç ve bitiş açısı
Rx :Elipsin X yönündeki yarıçapı,
Ry :Elipsin Y yönündeki yarıçapıdır.
180
270
360
Ry
90
Rx 0
ACI1
ACI2
Açı1=0° ve Açı2=360° olduğunda tam bir elips elde edilir.
Örnek:
uses Graph;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi ');
setbkcolor(15);
setcolor(1);
Ellipse(100, 100, 0, 360, 30, 50);
Ellipse(100, 100, 0, 180, 50, 30);
Readln;
CloseGraph;
end.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
193
Program ile elde edilen grafik
16.3.7 Grafik İmlecin Konumunun Değiştirilmesi
Grafik imlecin bulunduğu konumun değiştirilmesi amacıyla Moveto ve Moverel komutları
kullanılır.
Moveto ile grafik imlecin yerinin değiştirilmesi işleminde yeni konumun koordinatları
tanımlanır. Moverel komutunda ise, grafik imlecin bulunduğu konumdan itibaren X ve Y
yönündeki yerdeğişim miktarları tanımlanır.
Moveto(X,Y);
Moverel(dx,dy);
Çizimlerde grafik imlecin kullanılması için lineto ve linerel komutları kullanılır. Kullanımları
moveto ve moverel gibidir. Grafik imlecin bulunduğu noktadan belirilen koordinata kadar
doğru çizimi için Lineto, bulunduğu noktadan dx ve dy miktarlarında yer değiştirerek
doğru çizimi için Linerel komutları kullanılır. Kullanımları;
Lineto(X,Y);
Linerel(dx,dy);
şeklindedir.
Örnek:
uses Graph;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi ');
setbkcolor(15);setcolor(1);
MoveTo(100,100); { Upper left corner of viewport }
LineTo(trunc(GetMaxX/2), trunc(GetMaxY/2));
Linerel(0,100);
Linerel(100,0);
Linerel(0,-100);
Linerel(100,0);
Linerel(0,-139);
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
194
lineto(100,100);
Readln;
CloseGraph;
end.
Programla elde edilen çizim
16.3.8 Rectangle Komutu
Rectangle komutu, dörtgen çizimi için kullanılır. Komutun kullanımı;
Rectangle(X1,Y1,X2,Y2);
şeklindedir. X1,Y1; dörtgenin sol üst köşe koordinatı, X2,Y2; dörtgenin sağ alt köşesinin
koordinatlarıdır.
X1,Y1
X2,Y2
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
195
Örnek:
uses crt,Graph;
var
GraphDriver, GraphMode: Integer;
X1, Y1, X2, Y2: Integer;
begin
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');
Randomize;
repeat
X1 := Random(GetMaxX);
Y1 := Random(GetMaxY);
X2 := Random(GetMaxX - X1) + X1;
Y2 := Random(GetMaxY - Y1) + Y1;
Rectangle(X1, Y1, X2, Y2);
Delay(100);
until KeyPressed;
CloseGraph;
end.
Yukarıda verilen örnek program herhangi bir tuşa basılıncaya kadar rastgele büyüklükte
ve koordinatta dörtgen çizmektedir.
16.3.9 DrawPoly Komutu
Drawpoly komutu ihtiyaç duyulan üçgen, yamuk, değişik sayıda kenarlara sahip
çokgenlerin çizilebilmesi için kullanılır. Bu komut genelde poligonların çizimi için
hazırlanmıştır. Kullanım şekli;
DrawPoly (noktaadedi, noktakoordinatlari)
şeklindedir. Burada nokta adedi, poligonu oluşturan köşe sayısı, nokta koordinatlari ise
bu noktaların koordinatlarıdır. Komutun kullanılması için poligonun köşe noktalarını
içeren bir bir dizi tanımlanır. Örneğin 4 köşe noktası olan bir poligon tanımlanmak
istenirse; her bir köşenin bir elemanı X ve bir elemanı Y için olmak üzere 8 elemanlı bir
dizi tanımlamak gerekir.
Tanımlama bloğunda;
Var
Poly:array[0..7] of integer;
Şeklinde bir dizi tanımladıktan sonra bu elamanlara aşağıdaki şekilde uygun koordinat
değerleri atanır.
Poly[0]:=100; Poly[1]:=150;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
196
Poly[2]:=50; Poly[3]:=75;
Poly[4]:=75; Poly[5]:=50;
Poly[6]:=200; Poly[7]:=75;
Bu dizide çift indis numaralı elemanlar poligonun X koordinatını, tek indis numaralı
elemanlar Y koordinatını tanımlamaktadır.
Koordinatlara değer ataması yapıldıktan sonra;
Drawpoly(4,poly);
Komutu ile poligonun çizimi gerçekleştirilir. Yukarıda tanımlanan koordinatlardan
yararlanarak poligon elde edilmesi için yazılan Pascal programı aşağıda verilmiştir.
Örnek:
uses graph;
Var
Poly:array[0..7] of integer;
gd,gm:integer;
begin
Poly[0]:=100; Poly[1]:=150;
Poly[2]:=50; Poly[3]:=75;
Poly[4]:=75; Poly[5]:=50;
Poly[6]:=200; Poly[7]:=75;
detectgraph(gd,gm);
initgraph(gd,gm,'c:\bp\bgi');
setbkcolor(white);setcolor(1);
drawpoly(4,poly);
readln;
closegraph;
end.
Program ile elde edilen çizim
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
197
16.3.10 FillPoly
Fillpoly, içi dolu çokgen oluşturmak için kullanılır. Kullanım şekli drawpoly ile aynıdır.
16.3.11 Setfillstyle
Setfillstyle, çizilen alan içini doldurmak için kullanılır. Setfillstyle komutunun kullanımı;
Setfillstyle(tarama deseni,Renk);
şeklindedir. Tarama desenleri aşağıdaki tabloda verilmiştir.
Tarama Deseni Sabit Anlamı
Emptyfill 0 Tarama deseni zemin rengiyle aynı tarama stili
Solidfill 1 Belirtilen renk kodu ile taranır.
Linefill 2 Yatay çizgiler
Ltslashfill 3 Sağa doğru 45° eğimli ince tarama çizgisi
Slashfill 4 Sağa doğru 45° eğimli kalın tarama çizgisi
Bkslashfill 5 Sola doğru 45° eğimli kalın tarama çizgisi
LtBkSlashfill 6 Sola doğru eğimli çift kalınlıklı tarama çizgisi
Hatchfill 7 Düşey ve yatay kombine tarama çizgilileri
Xhatchfill 8 Çapraz çizgiler
Interleavefill 9 Kesikli çizgiler
Widedotfill 10 Aralıklı noktalar
Closedotfill 11 Sık noktalar
Userfill 12 Kullanıcının tanımlayacağı tarama stili
Pascal ile yazılan programlarla simulasyon programları da yazmak mümkündür. Aşağıda
örnek olarak verilen programda eşkenar dörtgen herhangi bir tuşa basılıncaya kadar
belirlenen yörüngede hareket etmektedir.
UNIT HAREKET; {unit program}
INTERFACE
USES graph;
VAR A,C:INTEGER;
PROCEDURE TAKIM (x,y:integer);
PROCEDURE BASLA;
IMPLEMENTATION
PROCEDURE TAKIM (x,y:integer);
var poly: array [0..9] of integer;
begin
setfillstyle(1,red);
poly[0]:=x;poly[1]:=y;poly[2]:=x+15;poly[3]:=y-5;poly[4]:=x+17;
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
198
poly[5]:=y-18;poly[6]:=x+4;poly[7]:=y-15;
poly[8]:=poly[0];poly[9]:=poly[1];
setcolor(blue);
fillpoly(5,poly);
setcolor(white);
line(x,y,x+16,y-4);
line(x+16,y-4,x+18,y-19);
line(x+18,y-19,x+3,y-16);
line(x+3,y-16,x,y);
end;
PROCEDURE BASLA;
BEGIN
SETCOLOR(BLUE);
REPEAT
A:=200; C:=400;
REPEAT
C:=C-1;
TAKIM(C,A);DELAY(25);
UNTIL (C=200) OR KEYPRESSED;
REPEAT
C:=C+1;
TAKIM(A,C);DELAY(25);
UNTIL (C=400) OR KEYPRESSED;
REPEAT
C:=C-1;
A:=A+1;
TAKIM(A,C);DELAY(25);
UNTIL (C=200) OR KEYPRESSED;
UNTIL KEYPRESSED;
END;
BEGIN
END.
uses crt,graph,hareket; {Ana program}
var
gd,gm:integer;
begin
gd:=detect;
initgraph(gd,gm,'c:\bp\bgi');
setbkcolor(white);
basla;
closegraph;
end.
Yukarıda verilen programda delay değerini arttırmak/azaltmak ile cismin hızı azalır veya
artar.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
199
16.3.12 Bar
Bar komutu ile içi doldurulmuş dikdörtgenin çizimi gerçekleştirilir. Dikdörtgenin içi
setfillstyle veya setfillpattern komutu ile belirlenmiş olan tarama deseniyle
doldurulur. Bar komutunda verilen parametreler rectangle komutunda verilenler ile
aynıdır.
Bar(X1,Y1,X2,Y2);
Burada;
X1,Y1:Dörtgenin sol üst köşesi
X2,Y2: Dörtgenin sağ alt köşesi
Örnek:
uses Graph;
var
Gd, Gm, I, genislik: Integer;
begin
Gd := Detect; InitGraph(Gd, Gm,'c:\bp\bgi');
genislik := 10;
setbkcolor(white);
setfillstyle(solidFill,1);
for I := 10 to 15 do
Bar(I*genislik, I*10, (I-1)*genislik, 200);
ReadLn;
CloseGraph;
end.
Örnek programın çalışması sonucunda elde edilen grafik
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
200
16.3.13 Bar3D
Bu komut,3 boyutlu görünüşe sahip bir dörtgenin çizimini gerçekleştirir. Kullanım şekli;
Bar3d (X1,Y1,X2,Y2,D,UST);
X1,Y1:Dörtgenin sol üst köşesi
X2,Y2:Dörtgenin sağ alt köşesi
D:3 boyutlu dörtgenin pixel olarak derinliği
UST:3 boyutlu dörtgenin üstünün çizilip çizilmeyeceğini belirtir.
Ust ifadesi için kullanılacak parametreler; TopOn (True) ve Topoff (False) 'dir. Bu
parametre TopOn olarak kullanılırsa 3 boyutlu dörtgenin üst kısmı çizilir, diğer halde
çizilmez. TopOff parametresinin kullanım amacı, farklı 3 boyutlu dörtgenlerin üst üste
çizilmesini sağlamaktır.
Örnek:
uses Graph;
var
Gd, Gm: Integer;
Y0, Y1, Y2, X1, X2: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm,'c:\bp\bgi');
Y0 := 10;
Y1 := 60;
Y2 := 110;
X1 := 10;
X2 := 50;
setbkcolor(white);
setcolor(blue);
setfillstyle(solidFill,blue);
Bar3D(X1, Y0, X2, Y1, 10, TopOn);
setfillstyle(solidFill,red);
Bar3D(X1, Y1, X2, Y2, 10, TopOff);
Readln;
CloseGraph;
end.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
201
Bar ve Bar3d komutları kullanılarak amaçlarımız doğrultusunda histogram grafikler
çizilebiliriz.
16.3.14 Pieslice
Histogram grafiklerinden başka çok kullanılan diğer bir grafik tipi de pie (pay-dilim)
grafikleridir. Pie grafikler bir daire %100 'ü göstermek üzere; olaylara ait yüzde orana
göre oluşturulmuş grafiklerdir.
18%
18%
38%
26%
Bir Pie Grafiği
Komutun kullanımı;
Pieslice (X,Y,Aci1,Aci2,R);
Görüldüğü gibi komutun kullanımı Arc komutuna benzerdir. Pieslice, X,Y merkez
koordinatlı, Açı1 'den başlayıp Açı2 'de biten R yarıçaplı daire dilimi çizer.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
202
Örnek:
uses Graph;
const Radius = 75;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi');
setbkcolor(white);
setcolor(lightblue);
SetFillStyle(solidFill,yellow);
PieSlice(200, 200, 0, 60, Radius);
SetFillStyle(solidFill,blue);
PieSlice(200, 200, 60, 160, Radius);
SetFillStyle(solidFill,cyan);
PieSlice(200, 200, 160, 255, Radius);
SetFillStyle(solidFill,green);
PieSlice(200, 200, 255, 360, Radius);
Readln;
CloseGraph;
end.
Örnek programın çalıştırılması sonucu elde edilen Pie grafiği
16.4 Grafik Ortamda Yazı
Grafik ekranda yazı yazmak, DOS ekranında yazı yazmadan oldukça önemli farklılıklar
içermektedir. DOS ekranı üzerinde yazı yazmak için WRITE, WRITELN komutlarının
kullanıldığını biliyoruz. Bu komutlar ile aynı büyüklükte yazı yazabilmekteyiz. Grafik
ekranda bu komutlar kullanılamaz. Grafik ekranda yazı yazabilmek için BGI dizini içinde
.CHR uzantılı dosyaların bulunması gerekir. Grafik ekranda yazı yazarken farklı
karakterlerde ve büyüklüklerde yazı yazabilmek mümkündür.
Yazım işlemine başlamadan önce yazım ile ilgili bilgilerin grafik sistemine verilmesi
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
203
gerekir. Yazım ile ilgili bilgiler 3 tanedir; Bunlar; yazının font tipi,yazım yönü ve
büyüklüğüdür. Bu özelliklerin bildirilmesi için Settextstyle komutu kullanılır. Komutun
kullanılması;
SetTextStyle(Font,Yon,Boyut);
şeklindedir. Bu komutu kullanarak, grafik ekrana yazdırılacak yazının hangi font tipi
kullanılarak, hangi yönde ve hangi büyüklükte olacağı belirtilir.
16.4.1 Font
Yazının ekrana yazdırılmasında kullanılacak olan font karakter dosyasını belirten tamsayı
değerdir. Bu değerler ve bu değerleri temsil eden sabit isimler aşağıdaki tabloda
verilmiştir.
Sabit isimler Sabit Değerler
DefaultFont 0
TriplexFont 1
SmallFont 2
SansSerifFont 3
GothicFont 4
Programda yazı fontu belirtilmediği takdirde font, Pascal 7.0 tarafından DefaultFont
olarak kabul edilecektir.
16.4.2 Yazı Yönü
Bu parametre, grafik ekrana yazdırılacak olan yazının hangi yönde yazılacağını belirten
tamsayı değerdir. Yazı sağdan sola yazılacak ise yon değerine; "0", aşağıdan yukarı
yazılacaksa "1" değerleri atanır.
16.4.3 Yazı Büyüklüğü
Yazı büyüklüğü, boyut parametresi ile belirtilir. Bu değer büyütme faktörü olarak
adlandırılabilir. 1-10 arasında tamsayı değer almaktadır. Boyut değerine atanan tamsayı
"1" ise yazının boyutu font dosyasında tanımlandığı şekilde olacaktır. 1 'den büyük
değerler verildiğinde, yazı boyutu verilen değerin katı olarak büyüyecektir.
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
204
16.4.4 Metnin Ekrana Yazdırılması
Ekrana bastırılacak yazı özelliği SettextStyle ile verildikten sonraki aşama yazının ekranın
hangi koordinatına bastırılacağının belirtilmesi gerekir. Yazının yazdırılması için iki komut
vardır. Bunlar; Outtext ve OuttextXY 'dir. Her iki komutun kullanımı birbirine benzerdir.
Outtext komutuyla yazının yazılacağı yerin belirlenmesi işleminde Moveto komutu
kullanılır. Moveto komutu kullanılmadan Outtext komutu kullanılırsa yazı, imlecin
bulunduğu noktadan itibaren yazdırılır.
Moveto(100,100);
Outtext('Yazilacak Yazi');
OuttextXY komutunda ise moveto komutu kullanmaya gerek olmadan yazının yazılacağı
koordinatı belirtmek mümkündür. Komutun kullanımı;
OuttextXY(X,Y,'yazilacak Yazi');
Bu komutların kullanılmasında dikkat edilecek en önemli özelliklerden biri, program içinde
hesaplanan değişkenler direk olarak yazdırılamaz. Değişkenlerin aldığı değerler öce string
ifadeye dönüştürülüp sonra bu komutlar yardımıyla yazdırılır. (Bu bölümde verilen ilk
örnekteki Kataryap isimli fonksiyonu inceleyiniz).
Aşağıda verilen örnek programda Pascal 'da kullanılan fontlar ve büyüklüklere örnekler
verilmiştir.
uses Graph;
var i, Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi');
setbkcolor(yellow);
setcolor(blue);
outtextxy(30,10,'FONT ORNEKLERi');
outtextxy(30,20,'**************');
outtextxy(30,30,'BALIKESiR UNiVERSiTESi, {Default font}');
settextstyle(1,0,1);
Moveto(30,50);
Outtext('BALIKESiR UNiVERSiTESi');
settextstyle(1,0,2);
Moveto(30,80);
Outtext('BALIKESiR UNiVERSiTESi');
settextstyle(1,0,3);
Bölüm 16 Bilgisayar Grafikleri
Pascal 7.0 ile Programlama A.ORAL
205
Moveto(30,110);
Outtext('BALIKESiR UNiVERSiTESi');
for i:=1 to 3 do
begin
settextstyle(2,0,i+3);
outtextxy(30,(i*20)+130,'BALIKESiR UNiVERSiTESi');
end;
for i:=1 to 3 do
begin
settextstyle(3,0,i);
outtextxy(30,(i*20)+190,'BALIKESiR UNiVERSiTESi');
end;
for i:=1 to 3 do
begin
settextstyle(4,0,i);
outtextxy(30,(i*20)+260,'BALIKESiR UNiVERSiTESi');
end;
for i:=1 to 3 do
begin
settextstyle(5,0,i);
outtextxy(30,(i*20)+330,'BALIKESiR UNiVERSiTESi');
end;
Settextstyle(0,1,0);
outtextxy(10,10,'Balikesir Universitesi Muhendislik-Mimarlik Fakultesi');
outtextxy(380,30,'Makine Muhendisligi Bolumu, Konst. ve imalat ABD.');

Dosyasının devamı aşağıdaki linktedir.

*

Linki görebilmek için, Oyun için Düşüncelerinizi yazın...*

Linki görebilmek için, Oyun için Düşüncelerinizi yazın...


Linkback: https://www.buyuknet.com/pascal-ile-grafik-t8204.0.html


Etiket:

Bu bilgi size yardimci oldu mu?

EvetHayır
PASCAL ile GRAFİK
PASCAL ile GRAFİK
(Ortalama: 5 üzerinden 2.5 - 2 Oy)
2