Giri�
Bu yaz�, 2 ve 3 boyutlu grafikler i�in bir end�stri �l��n�
(standard�) olan OpenGL hakk�ndaki makale dizisinin ilkidir. (Bak�n�z:
OpenGL Nedir?). Okuyucunun, C geli�tirme
�al��mataban�na al���k ve GLUT kitapl��� hakk�nda baz� bilgilere sahip
oldu�unu kabul ediyoruz (Aksi durumda bu dergideki "GLUT programlama"
konusundaki yaz�lar�n izlenmesi gerekir). Linux alt�nda �al���rken,
OpenGL konusunda �zg�r kullan�ma a��k e�siz uygulamalar� bulunan
Mesa-kitapl���n� kullanman�z� �neririz.Bu anda Mesa i�in donan�m
deste�i bile bulunmaktad�r. (Bak�n�z:
3Dfx grafik kart�).
Yeni OpenGl g�d�mlerinin sunumu, en az bizim de yapmaya
�abalayaca��m�z kadar, onun i�levselli�ini kullanmaya �al��an
bir �rnek ile s�regidecektir. Dizimizin sonunda b�t�n�yle OpenGL
ile yaz�lm�� bir oyun �yk�n�m�n� (sim�lasyonu), kaynak d�zg�s�yle
(koduyla) birlikte verece�iz.
Ba�lamadan �nce, bir bilim adam� oldu�um i�in, OpenGL deneyimimin
b�y�k bir �o�unlu�unun, OpenGL'in ger�el kuvantum ve k�kle�ik (klasik)
sistemlerin �yk�n�mlerini (simulasyonlar�n�) yazmak i�in bir ara�
oldu�unu s�ylemek isterim. Bu nedenle �rneklerim biraz bu y�ndedir. ;-).
Okuyucunun bu �rnekleri eri�ilebilir ya da en az�ndan e�lenceli
bulaca��n� umuyorum. E�er farkl� �rnekler g�rmek istiyorsan�z,
beni duyumlu k�lman�z (haberdar etmeniz) yeterlidir.
OpenGL, s�kl�kla 3 boyutlu grafiklerle, �zel etkilerle, karma��k
�rneklerin ���kla ger�ek modellemesi gibi konularla ilgilidir.
Bunun yan�nda 2 boyutlu grafikleri g�r�nt�le�tirmeye (render)
yarayan bir makinedir. 3 boyutlu g�r�ngelerin (perspektiflerin)
karma��kl���, model g�r�nt�le�tirme, ���k, g�r�nt��eker (kamera)
konumu ve bu gibi konular� ��renmeye ba�lamadan �nce 2 boyutta yapmay�
��renebilece�iniz pek �ok �ey olmas� bak�m�ndan bu konu �nemlidir.
M�hendislikle ve bilimsel konularla ilgili �ok say�da uygulama 2 boyutta
g�r�nt�le�tirilebilir (rendered). Dolay�s�yla, ilk olarak baz� basit 2
boyut canland�r�mlar�n�n (animasyonlar�n�n) nas�l yap�ld���n� ��renmek
yerinde olacakt�r.
Noktalar�n
�izimi
OpenGL yaln�zca birka� geometrik temel�geye sahiptir: noktalar,
do�rular ve �okgenler. Bunlar�n her biri kendilerine ait olan k��eler
ile tan�mlan�r. Bir k��e 2 ya da 3 kayarnoktal� say� (floating point
number) ile �zyap�land�r�l�r (karakterize edilir), k��enin kartezyen
koordinatlar�, 2 boyutta (x,y) ve 3 boyutta (x,y,z)'dir. Kartezyen
koordinatlar �ok yayg�n olmakla beraber, bilgisayar grafiklerinde ayr�ca
her noktan�n (x,y,z,w) 4 kayarnoktal� say� ile g�sterildi�i benze�ik
(homojen) koordinat sistemi de vard�r. 3 boyutun temel �zelliklerini
inceledikten sonra bunlara geri d�nece�iz.
OpenGL'de t�m geometrik nesneler bir s�ral� k��eler k�mesi olarak
tan�mland���ndan, bir k��enin belirtimi i�in bir yordam demeti
bulunmaktad�r.; Kullan�m� ��yledir:
void glVertex{234}{sifd}[v](TYPE coords);
Haydi, bu kullan�ma al��kanl�k edinelim.{} imleri aras�ndaki s�zc�k
yordam�n ad�n� g�stermektedir.; Yordamlar short, long, float
ya da double t�rde 2, 3 ya da 4 parametre alabilirler. Se�imeba�l�
olarak bu parametreler vektor formda verilebilir, biz v-tip
yordamlar� kullanaca��z. ��te baz� �rnekler:
void glVertex2s(1, 3);
void glVertex2i(23L, 43L);
void glVertex3f(1.0F, 1.0F, 5.87220972F);
float vector[3];
void glVertex3fv(vector);
Basitle�tirmek i�in bu yordamlar�n t�m� glVertex*
olarak tan�mlan�rlar.
OpenGL, herhangi bir k��e dizisini i�eri�ine g�re yorumlar. Bu
i�eri�in belirtimi glBegin(GLenum mode) ve
glEnd(), yordam ikilisiyle yap�lmaktad�r. Bu iki
yordam aras�nda �al��t�r�lan herhangi bir glVertex*
deyimi kip (mod) de�erine g�re yorumlan�r. �rne�in:
glBegin(GL_POINTS);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(0.0, 1.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.5, 0.5);
glEnd();
2 boyutta 5 nokta �izer. GL_POINTS, OpenGL ba�l�k dosyas�nda
<GL/gl.h>. tan�mlanm�� etiketlerden birisidir.
Daha pek �ok uygun kip (mod) vard�r ancak, bunlardan, gerekti�inde,
s�zedilecektir.
Her nokta, OpenGL'in renk arabelle�i (buffer) ile ili�kili durum
de�i�kenlerinde o anda saklanan renklerle �izilir. Ge�erli
rengi de�i�tirmek i�in glColor* yordam demetini
kullan�n. Renkleri se�mek ve uygulamak hakk�nda s�ylenecek �ok �ey
vard�r (Di�er bir yaz� yaln�zca bu konuda olacakt�r). 0.0'dan 1.0'a
kadar 3 tane kayarnoktal� de�er kullanarak RGB (K�rm�z� - Ye�il - Mavi)
renkleri tan�mlayabiliriz.
glColor3f(1.0, 1.0, 1.0); /* Beyaz */
glColor3f(1.0, 0.0, 0.0); /* K�rm�z�*/
glColor3f(1.0, 1.0, 0.0); /* Magenta*/
etc...
Y�reden�ekim:Makefile,
example1.c,
example2.c
Buraya kadar anlat�lanlar ilk iki �rnek d�zg�m�z� (kodumuzu) yazmak
i�in yeterli malzemeyi olu�turmu� bulunmaktad�r. �lk �rnek, karga�asal
(kaotik) d�n���mde (�l��nl� d�n���m, standart d�n���m) bir�ok y�r�nge �izen
basit bir OpenGL program�d�r. Okuyucunun d�n���mler ve �zellikle
�l��nl� (standart) d�n���mler konusunda bilgili olmamas� sorun
de�ildir. Basit�e s�ylemek gerekirse, bir d�n���m�n bir noktay� al�p
iyi tan�ml� bir ba��nt� arac�l���yla yeni bir nokta �retir:
yn+1 = yn + K sin(xn)
xn+1 = xn + yn+1
�l��nl� (standart) d�n���m durumunda y�kl� bir par�ac���n,
par�ac�k h�zland�r�c�n�n simitinde h�zland�r�c�n�n d�zlemini
keserek yapt��� devinimde b�rakt��� izi betimleyen bir model
s�zkonusu olur. Bunun ve di�er d�n���mlerin incelenmesi,
�emberselh�zland�r�c� i�ine kapat�lm�� bir y�kl� par�ac���n
deviniminin kararl�l���n�n anla��lmas� a��s�nda fizikte �ok
�nemlidir. �l��nl� (standart) d�n���m, parametresinin
baz� de�erleri i�in K'n�n a��k�a karga�asal (kaotik) ve tutuklu
devinimin (trapped motion) bir kar���m�n� g�stermesinden
dolay� �ok donuktur??????. Sonu� olarak, fizik ile ger�ekten
ilgilenilmese de bir �ok g�zel grafik d�zg� (kod) geli�tirmek
isteyenler �l��nl� (standart) d�n���mlere yeterince dikkat
etmelidirler. Doku, ate� parlamas�, a�a�lar, karapar�alar�
gibi �eyleri �retmekte kullan�lan pek �ok algoritma fractal
d�n���mlere dayand�r�lmaktad�r.
../../common/January1998/../../common/January1998/example1.c'nin kaynak d�zg�s� (kodu):
#include <GL/glut.h>
#include <math.h>
const double pi2 = 6.28318530718;
void NonlinearMap(double *x, double *y){
static double K = 1.04295;
*y += K * sin(*x);
*x += *y;
*x = fmod(*x, pi2);
if (*x < 0.0) *x += pi2;
};
void winInit(){
/* Set system of coordinates */
gluOrtho2D(0.0, pi2, 0.0, pi2);
};
void display(void){
const int NumberSteps = 1000;
const int NumberOrbits = 100;
const double Delta_x = pi2/(NumberOrbits-1);
int step, orbit;
glColor3f(0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
y = 3.1415;
x = Delta_x * orbit;
glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
NonlinearMap(&x, &y);
glVertex2f(x, y);
};
glEnd();
};
for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
x = 3.1415;
y = Delta_x * orbit;
glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
NonlinearMap(&x, &y);
glVertex2f(x, y);
};
glEnd();
};
};
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(5,5);
glutInitWindowSize(300,300);
glutCreateWindow("Standard Map");
winInit();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Glut* yordamlar�n� anlamak i�in, GLUT Programlama
yaz�s�n� okuyabilirsiniz, Yukar�daki d�zg�n�n (kodun) �o�unlu�u
oradan gelmektedir. Grafik penceresi tek arabellekte (buffer) ve RGB
kipte (modda) a��l�r. Bunun ard�ndan display()
adl� geri�a��rma fonksiyonu grafi�i �izer: �lk olarak arkataban i�in kara
renk se�ilir; glClear(GL_COLOR_BUFFER_BIT) renk arabelle�ini ge�erli renk
karaya yenidenkurar, daha sonra glColor ile beyaz renk se�ildiktan sonra,
NonlinearMap() fonksiyonu bir�ok kez
�al��t�r�l�r ve noktalar glVertex* fonksiyonu ile GL_POINTS kipte
(mod) �izdirilir. Yani ger�ekten de kolay!
Pencere ba�lat�m yordam�nda yani winInit()
'da OpenGL elayg�t tak�m�ndan gelen yaln�zca tek bir deyim
bulundu�una dikkat �ekmek gerekir:gluOrtho2D(). Bu yordam
2 boyutlu dik sistemin koordinatlar�n� g�sterir. Fonksiyona ge�en
parametreler "minimum x, maksimum x, minimum y, maksimum y" dir.
�ekIi �izimin ilk an�ndan ba�layarak g�rebilme �ans�n�z olmas� i�in
tek bir ekran modu ve �ok say�da nokta se�tim. Bu b�y�k ve zaman
gereksinimi y�ksek olan g�r�nt�ler durumundaki tek kip i�in al���lan
bir tav�rd�r, nesneler OpenGL yordamlar�yla ya�amage�irildik�e ekran�n�zda
g�r�n�urler.
../../common/January1998/example1'i �al��t�rd�ktan sonra �u �ekli g�receksiniz:
�imdi ikinci programa ge�elim, ../../common/January1998/../../common/January1998/example2.c:
#include <GL/glut.h>
#include <math.h>
const double pi2 = 6.28318530718;
const double K_max = 3.5;
const double K_min = 0.1;
static double Delta_K = 0.01;
static double K = 0.1;
void NonlinearMap(double *x, double *y){
/* Standard Map */
*y += K * sin(*x);
*x += *y;
/* Angle x is module 2Pi */
*x = fmod(*x, pi2);
if (*x < 0.0) *x += pi2;
};
/* Callback function:
What to do in absence of use input */
void idle(void){
/* Increase the stochastic parameter */
K += Delta_K;
if(K > K_max) K = K_min;
/* Redraw the display */
glutPostRedisplay();
};
/* Initialization for the graphics window */
void winInit(void){
gluOrtho2D(0.0, pi2, 0.0, pi2);
};
/* Callback function:
What to do when the display needs redrawing */
void display(void){
const int NumberSteps = 1000;
const int NumberOrbits = 50;
const double Delta_x = pi2/(NumberOrbits-1);
int step, orbit;
glColor3f(0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
y = 3.1415;
x = Delta_x * orbit;
glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
NonlinearMap(&x, &y);
glVertex2f(x, y);
};
glEnd();
};
for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
x = 3.1415;
y = Delta_x * orbit;
glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
NonlinearMap(&x, &y);
glVertex2f(x, y);
};
glEnd();
};
glutSwapBuffers();
};
int main(int argc, char **argv) {
/* GLUT Initializations */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(5,5);
glutInitWindowSize(300,300);
/* Open Window */
glutCreateWindow("Order to Chaos");
/* Window initializations */
winInit();
/* Register callback functions */
glutDisplayFunc(display);
glutIdleFunc(idle);
/* Launch event processing */
glutMainLoop();
return 0;
}
Bu program ../../common/January1998/../../common/January1998/example1.c'ye benzemektedir.
Temel fark ekran�n ikili arabellek kipte (modda) a��lmas� ve K
parametresinin program boyunca farkl� de�erler alan bir de�i�ken olmas�d�r,
idle() ad�nda GLUT olay i�sleyicisine
glutIdleFunc() taraf�ndan yazma�lanm�� yeni geri�a��rma fonksiyonu
vard�r. Bu fonksiyonun �zel bir anlam� vard�r; o, kullan�c� verigirdisi
olmamas� durumunda, olay i�leyicisi taraf�ndan s�k s�k ko�ulur. idle()
geri�a��rma fonksiyonu canland�r�m (animasyon) programlamas� i�in �lk�seldir
(ideal). Example 2'de grafik parametresinin k���k miktarlarda de�i�mesi
amac�yla kullan�lm��t�r. idle() fonksiyonunun sonunda �nceki ekran�n
ilk de�erlerini koruyarak, ekran� yeniden �izen glutPostResDisplay()
adl� kullan��l� bir GLUT g�d�m� (komutu) daha vard�r. Genelde bu y�ntem
display() fonksiyonunu yeniden �a��rmaktan daha etkilidir.
Dikkate de�er di�er bir farkl�l�k ise display() fonksiyonunun
sonunda glutSwapBuffers() fonksiyonunun kullan�lmas�d�r. Pencere
ikili arabellek kipinde a��lm��t�r, dolay�s�yla t�m g�r�nt�le�tirme
y�nergeleri gizliarabelle�e uygulan�r; bu durumda kullan�c� �eklin �izimini
g�rememektedir. �eklin �izimi tamamen bittikten sonra glutSwapBuffers()
ile gizli ve g�r�n�r arabelleklerin g�revleri de�i�tirilir Bu teknik
olmaks�z�n animasyon d�zg�n bir �ekilde �al��maz.
Canland�r�m (animasyon) s�resince g�r�nt�lenen baz� �ekiller:
�NEML�: display() geri�a��rma fonksiyonu , idle() fonksiyonundan �nce
en az bir kere ya�amage�irilir. Canland�r�mlar�n�z� (animasyonlar�n�z�)
yazarken ve display() ile idle() fonksiyonlar�na hangi de�erlerin
ge�ti�ine karar verirken bunu akl�n�zdan ��karmay�n.
Do�rular�n ve �okgenlerin �izimi
Y�reden�ekim (download):
example3.c
�nceden s�zedildi�i �uzere glBegin(GLenum mode)
�e�itli kipler (modlar) k��e dizilerini alabilir. Ardarda belirtimi
yap�lan v0, v1,v2,v3,
v4,..., vn-1 uygun bi�imde yorumlanabilir.
Olas� kip (mod) de�erleri ve ger�ekle�tirilen eylemler a�a��da
belirtilmi�tir:
- GL_POINTS n k��enin her birisine bir nokta
�izer..
- GL_LINES Ba�lant�s�z do�ru dizisi �izer.
Do�ru par�alar� v0 ve v1, v2 ve
v3,...vb aras�nda �izdirilirler. n tek ise n-1
i�leme al�nmaz..
- GL_POLYGON v0, v1,..,v
n-1 noktalar�n� k��e alarak bir �okgen �izer.
n en az 3 olmal�d�r, aksi halde hi�bir �ey �izdirilmez. Ayn� zamanda
(donan�m�n algorithma k�s�tlamalar�ndan dolay�) bir �okgen kendini
kesmemeli ve di�b�key olmal�d�r.
- GL_TRIANGLES �nce v0,
v1 ve v2; ard�ndan v3, v4
ve v5 vb. noktalar�n� kullanarak bir ��gen dizisi olu�turur.
E�er n 3'�n tam kat� de�ilse geri kalan noktalar g�zard� edilir.
- GL_LINE_STRIP �nce v0'dan v1'e,
ard�ndan v1'den v2'ye ... do�rular �izer. Son olarak
vn-2'den vn-1'e bir do�ru �izerek n-1 tane do�ru
k�mesi olu�turur. Do�rular� tan�mlayan noktalar �zerinde herhangi bir
k�s�t yoktur, do�rular keyfi olarak birbirlerini kesebilirler.
- GL_LINE_LOOP vn-1'den v0'a
do�ru �izerek d�ng�y� kapamasi d���nda GL_LINE_STRIP ile ayn�d�r.
- GL_QUADS �nce v0, v1,
v2, v3 noktalar�ndan, sonra v4,
v5, v6, v7 noktalar�ndan ...
ge�en d�rtgenler �izer.
- GL_QUAD_STRIP �nce v0,
v1, v3, v2 noktalar�ndan, daha sonra
v2, v3, v5, v4 noktalar�ndan
ge�en d�rtgenler �izer.
- GL_TRIANGLE_STRIP
K��e koordinatlar� v0, v1, v2;
v2, v1, v3; v2, v3,
v4,.. olan ��gen dizisi �izer. S�ralama ��genlerin do�ru
y�nlenimli olma g�vencesini sa�layacak bi�imde olup ku�ak bir y�zey
par�as� olu�turmak i�in kullan�labilir.
- GL_TRIANGLE_FAN ��genlerin �nce v0,
v1, v2 ard�ndan v0,v2,
v3, v0, v3, v4,...
noktalar�ndan �izdirilmesi d���nda GL_TRIANGLE_STRIP ile
benzer �al���r. T�m ��genlerin v0 k��esi ortakt�r.
���nc� �rne�imizde GL_LINES ve GL_POLYGON'nun kullan�m�n� g�steren
ba�ka bir canland�r�m (animasyon) vard�r. Program� derleyin, kaynak
d�zg�s�ne (koduna) bak�n ve nas�l �al��t���n� inceleyin. Example2.c'ye
olduk�a benzerdir, burada �ok basit bir sarkac�n devinimi (hareketi)
�izdirilmi�tir. Canland�r�m �lk�sel (ideal) bir sarkac�n devinimini
�yk�nmektedir (sim�le etmektedir). ��te canland�r�mdan bir
anl�kg�r�nt� (snapshot):
�nceden oldu�u gibi yine idle() adl�, amac� saati �al���r
tutmak olan yani time de�i�kenini g�ncelleyen, bir geri�a��rma
fonksiyonu bulunmaktad�r. display() , iki nesne �izer;
sarkac�n ipi ve a��rl��� (s�ras�yla beyaz ve k�rm�z� renklerde).
Sarka� koordinatlar�nin devinimi xcenter ve ycenter i�in verilen
ba��nt�lardan kapal� olarak elde edilebilmektedir::
void display(void){
static double radius = 0.05;
const double delta_theta = pi2/20;
double xcenter , ycenter;
double x, y;
double theta = 0.0;
double current_angle = cos(omega * time);
glColor3f(0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
/* Draw pendulum cord */
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);
glVertex2f(0.0, 0.0);
xcenter = -cord_length * sin(current_angle);
ycenter = -cord_length * cos(current_angle);
glVertex2f(xcenter, ycenter);
glEnd();
/* Draw pendulum dish */
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
while (theta <= pi2) {
x = xcenter + radius * sin(theta);
y = ycenter + radius * cos(theta);
glVertex2f(x, y);
theta += delta_theta;
};
glEnd();
glutSwapBuffers();
};
Al��t�rmalar
��rendiklerinizi uygulamak i�in baz� �neriler:
- In ../../common/January1998/../../common/January1998/example1.c 'deki di�er grafikleri
deneyin. Kitapl�ktan, Karga�a (Chaos) ve Fraktallar (Fractals) hakk�nda
herhangi bir kitap al�n, i�erisinde pek �ok �rnek bulaca��n�za eminim.
�izdirmeden �nce, parametreleri, sistem koordinatlar�n� de�i�tirin ve
ard���k grafiklere bunlar� uygulay�n. Bunu e�lenceli bulacaks�n�z.
- In ../../common/January1998/../../common/January1998/example2.c 'de noktalar�n her
birisine renkler ekleyebilirsiniz. �rne�in, �ok ilgin� bir renk
d�zg�lemesi (kodlama) olarak, her noktaya y�r�ngenin yerel kararl�l���n�
betimleyecek ayr� bir renk verebilirsiniz.
(Physics Review Letters Vol 63, (1989) 1226) ,
�yle ki, devinimyolu karga�asal bir b�lgeye girdi�inde renk k�rm�z�la��r.
�rne�in kararl� adasal y�relerde renk mavile�tirilebilir. E�er d�zg�n�z
(kodunuz) bu etkiye sahip olursa, �rnekteki fractal'�n �ekli
�a��rt�c� olacakt�r. T�revsel denklemler dersini almam�� olanlar
i�in biraz ileri olmakla beraber bilgisayarl� grafikte d�n���mlerin ve
fractallar�n �st�nl�klerinden yararlanmak i�in bu konuda bilgi edinmeye
de�ece�ini vurgulamak gerekmektedir.
- In �rnek3.c 'deki tekeri (diski)
�izdirmekte kullan�lan do�rular�n t�r�n� de�i�tirmeyi deneyin.
GL_LINES, GL_TRIANGLES.. gibi fonksiyonlar� kullan�n. Sonu�lar�n�
g�zlemleyin. Tekerin (diskin) �izimini eniyilemeye (optimize etmeye)
�al���n, her �er�eve i�inde ayn� tekeri (diski) �izmek i�in bir�ok
kez sinus ve cosinus hesaplaman�za gerek yoktur. Onlar� bir dizi
i�erisine saklayabilirsiniz. �okgen �izimini kullanarak sarkac�n
ucuna kutular, elmaslar ya da ne isterseniz onu eklemeye �al���n.
Her �er�eve i�ine iki sarka� yaz�n, onlar� ba��ms�z devindirin
(hareket ettirin) ya da birbirleriyle �arp��t�r�n.
Gelecek Yaz�
�u anda s�yleyeceklerim bu kadar. �okgenler hakk�nda daha tart���lacak
�ok �ey var. Bir sonraki say�da (Mart 1998) �okgenleri ara�t�rmaya devam
edece�iz ve zaten kullanmaya al���k oldu�unuz baz� g�d�mlerin ayr�nt�lar�na
inip modellemesini yapaca��z..
|