GRAFİK ÇİZME ÖRNEĞİ

Tüm meraklılar hoş geldiniz. Umarım bu köşede yayınlanan örnekler ile programlarınıza yeni eklemeler yapma fırsatı bulmuş, yayınladıklarımızı çeşitli şekillerde geliştirerek kullanmaya başlamışsınızdır. Geçen örneklerimizde genellikle bir Library fonksiyonunun Basic'ten kullanımını örnekleyen ufak programcıklar yapıyorduk. Bu ay konuyu biraz değiştirmek istiyorum. Basic'in bize nasıl faydalar sağlayabileceğinden ve nasıl verimli programlanabileceğinden bahsedelim. Kısaca biraz sırlarımızı anlatalım.

Basic, genelde başlayanlar için temel ve basit bir dil olarak bilinir. Amatör işlerde kullanılabileceği, işe yarar programlar yapılamayacağı savunulur ve genelde C, Pascal veya doğrudan Assembly gibi dilleri övülür. Basic basit bir dildir, burası doğru. Basic'e güvenip büyük işler yapmak her zaman sonuç vermez. Teorik olarak Basic'le yapılamayacak iş neredeyse yoktur. (Demo mu? İyi güzel de Demo ne işe yarar Allah'ın aşkına?). Pratikte inceleyecek olursak, Basic her uygulama için ideal değildir. Sistemi kullanan herhangi bir programı kullanmak, Basic ile her dilden daha zordur. Buna ek olarak tüm dillerin yanında komik kalan bir işletim hızı vardır. Ancak öyle ufak işler vardır ki, Basic'le yaptığınızdan kolay bunları hiçbir dilde yapamazsınız. Buradan şu sonucu çıkarmalıyız. Her dilin kendine uygun bir kullanım alanı vardır. Önemli olan gerektiği yerde gereken dili kullanabilmek (Amerikalı bir pilot arkadaşım Basic'ten profesyonel uçak simülasyonu yazdı ve şirket kurup sattı.). Basic ile yazacağınız program kısa olmalı: Bugüne dek 30-35 Kilobyte'ı aşan programların hiçbir makinada problemsiz çalıştığını görmedim. Hıza dayanmamak: İç içe döngülerle dolu, ekranda çok hareket isteyen, fazla mantıksal karşılaştırmanın olduğu programlar olmamalı.

Sistem komutlarına dayanmamak: Library fonksiyonlarını programın dayanağı olarak değil de, programı görsel açıdan destekleyici şekilde kullanmak gerekir. Çünkü herhangi bir Library fonksiyonu diğer dillerin çoğunda daha zahmetsizce (Evet Assembly'de bile) kullanılabilir.

Tüm yukarıdakiler benim tavsiyelerim. Katılıp katılmamak size kalmış. Lafı fazla uzatmayalım, gelelim bu ayın programına: Bu program Basic'in etkili kullanım alanlarından biri; genişletilmiş bir hesap makinesi olarak kullanılabilmesi. Kolay kolay birisinin matematikten benim kadar nefret etmesi mümkün değil. (Kim diyor benim N.Ö.'den 2 defa kaldığımı !!!!). Yok sinüs'ün grafiği, yok Cosinüs hiperbolik 3 x'in grafiği daha neler neler. Oysa çok az zahmetle, Basic'ten hemen bir fonksiyon çizen program yapılabilir. Örnek programımız bu amaca hizmet ediyor. Ancak bu basit ve kısa program üzerinde size bazı programlama teknikleri göstermeyi amaçladım. Sabırsız arkadaşlar için önce program. Programı yazıp çalıştırdıktan ve biraz kullandıktan sonra devam edelim.

' Grafik Çizen basit örnek, 1991 F. Kağan 
gmax = 0 
se% =1 
DEF FN f(x)= SIN (x) 
bol = 20 
çizim: 
wx% = WIND0W (2) 
wy% = WIND0W (3) 
wxo% = wx% 2
wyo% = wy% 2 
IF wx% < 50 OR wy% <50 THEN GOTO son 
FOR g% = 20 TO wx% -20 
x = (g%-wxo%)/bol 
y = FN f (x) 
IF ABS(y) > ABS (gmax) THEN gmax = ABS(y) 
NEXT g% 
ara = (wyo%-10)/ABS(gmax) 
FOR g% = 20+se% TO wx%-20 STEP se% 
LINE (g%-se%,wyo% - FN f((g%-wxo%-se%)/bol)*ara)-(g%,wyo% - FN f((g%-wxo%)/bol)*ara) 
NEXT g% 
LINE (20,wyo%Mwx%-20,wyo%),2 
LINE (wxo%,10)-(wxo%,wy%-10),2 
LINE (20,10)-(wx%-20,wy%-10),2,B 
WHILE INKEY$ = "" : WEND 
CLS 
PRINT "Lütfen istediğiniz Fonksiyonu girin, Parametre X olsun"
INPUT aS 
gmax = 0 
n = INSTR (a$,"=") 
IF n = 0 THEN GOTO son 
B$ = MID$ (a$,n,LEN (a$)) 
Fon$ = "Def Fn f(x) "+B$ 
Label$ = "2000" 
son$ = "Goto çizim" 
fosin:
PRINT "Fonksiyon siniri X den" 
INPUT c$ 
d K VAL (c$) 
IF d = 0 THEN PRINT "Olmadi":GOTO fosin 
bol = wxo%/d 
CLS 
ÖPEN "Ram:Data" FOR OUTPUT AS #1 
PRINT #1,Label$ 
PRINT #1,Fon$
PRINT #1,son$ 
CLÖSE #1 
CHAIN MERGE "Ram:data",2000,ALL,DELETE 2000 - 
son: 
END 
2000 
Evet, aslında gözüktüğü kadar uzun değil. Programı önce bir çalıştırmanızı tavsiye ederim. Dikkat etmeniz gereken 
programı normal bir basic ile çalıştırmanız gerektiği. Yani Compile Basic'ler ile bu programı çalıştıramıyorsunuz. Prog-

Program çalışınca, çıkış penceresine Sinüs (X) fonksiyonunun grafiğini çizecek ve bir tuşa basmanızı bekleyecek. Tuşa basınca sizden herhangi bir fonksiyonu girmenizi isteyecek. Bu fonksiyonu girerken, herhangi bir şey = fonksiyon şeklinde (Veya doğrudan = fonksiyon şeklinde, mesela =cos (x)) şeklinde gireceksiniz. Fonksiyonu girerken, Basic'in anlayabileceği bir dilde ve sadece X'i parametre olarak kullanarak yazın. Daha sonra bu fonksiyonun aralığı sorulacak. Buraya verdiğiniz sayıya göre fonksiyon çizilecek. Programdan çıkmak için fonksiyon yerine = yazmayın (hatta hiçbir şey yazmayın).

Gelelim programın özelliklerine. Programda ilk olarak bazı değişkenlerin başlangıç değerleri belirleniyor. Bundan sonra f isminde bir fonksiyon tanımlanıyor. Bu fonksiyon sağ taraftaki ifadeye eşit. Yani Fn f (3.14) demek, Sin (3.14) demek oluyor. Bu sayede istediğimiz fonksiyonu basitçe tanımlıyoruz. Arkasından Çizim bölümü geliyor. Burada her şeyden önce pencerenin genişliği (wx%) ve yüksekliği (wy%) bulunuyor, orta noktalarda aynı şekilde bu değerlerin yarısı şeklinde tanımlanıyor. Daha sonra gelen IF ise, pencerenin belirli bir değerden küçük olup olmadığını inceliyor. Eğer pencere çok küçükse, program bitiriliyor. Arkasından bu fonksiyonun verilen aralıkta alabileceği en büyük değer araştırılıyor. Bunun amacı, grafiği ekrana ölçekleyebilmek. Daha sonra ise x değeri hesaplanıyor. Bunun arkasından karşı düşen y değeri bulunuyor ve bu değerin gmaks denen değerden büyük olup olmadığı inceleniyor. Büyük olması durumunda bu gmaks değeri büyük olan değeri alıyor. Bu döngünün sonunda istenen maksimum değer (gmaks) bulunmuş oluyor. Daha sonra ölçeklemek için bir ara değer hesaplanıyor ve bir döngüde line komutu ile grafik çiziliyor. Bunun ardından gelen üç line ile grafiğe eksenler ve bir kenar kutusu çiziliyor. Bundan sonraki bölüm ile ise yeni fonksiyon giriliyor. En sonda bulunan 2000 sayısı da programın bir parçası ve yeni fonksiyon girilirken kullanılıyor. Yüzeysel olarak inceledik. Şimdi gelelim neyin nasıl olduğuna. Bu tür bir program yazmak isteyenler için en önemli sorun, yeni fonksiyonun nasıl girileceğidir. Fonksiyon programın bir parçası olmazsa, o fonksiyonu değerlendirmek programcının işi olacaktır. (Bu işleme Parse denir.). Basic'ten bunu yapmak zor ve zahmetlidir. Daha çok yapılan program çalıştırılarak grafik görülür, yeni bir grafik için programın kendisi değiştirilerek tekrar çalıştırılır. Örneğimizde bunu yapmak için üç line'lı satırın arkasına End ekleyin. Tek yapacağınız, programı çalıştırmadan evvel üçüncü satırdaki Def Fn f (x) 'i değiştirmek olacaktır. Programda temel olarak biz de aynı şeyi yapıyoruz. Programın WHILE INKEY$'dan sonraki bölümünde, şu üç BASIC program satırını yazıyor, bunu RAM:'da Data ismi ile kaydediyor daha sonra Chain Merge emri ile bu Data'yı programın 2000 numaralı satırına ekliyoruz:

2000 
Def Fn f (x) = .......( Buraya A$ değişkenindeki fonksiyon ekleniyor) 
goto çizim 
Chain ile ilgili ayrıntılı bilgiyi el kitabından elde edebilirsiniz. Dikkat edilmesi gereken, satır numarasının bir numara 
olmasına özen göstermek ve Ali seçeneğini kullanarak Chain edilen kısmın ana programdaki değişkenlerden yararlanma-
sını sağlamak. Kısaca yaptığımızı, Basic'ten Basic programı yazmak olarak yorumlayabiliriz.

Fonksiyonu yazarken kullandığımız INSTR fonksiyonu da oldukça yararlı. Bu fonksiyonu kullanarak bir yazının bir diğeri içinde nerede bulunduğunu saptayabiliriz. Yine INSTR kullanarak basılan bir tuşun programınızca kullanılan tuş olup olmadığını da anlayabiliriz. Şu örneğe bakalım:

10 A$ = INKEY$ IF A$ = "" THEN GOTO 10 IF INSTR ("AEIOU",A$) = 0 THEN GOTO 10 Inkey$ fonksiyonu o anda basılan tuşu tutar. Bu tuşu A$ ile okuyoruz. Eğer boş ise (bir tuşa basılmamışsa) hemen okumaya devam ediyoruz. Son satırda ise basılan tuşun A, E, I, O, U tuşlarından biri olup olmadığını anlıyoruz.

Bir diğer nokta ise, fonksiyonun sınırını kullanıcıdan isterken var. Burada aslında sadece bir sayı istememize rağmen, bunu önce alfanümerik olan c$'e alıp sonra VAL fonksiyonu ile c$'nin değerini d'ye aktarıyoruz. Bu, bizi gereksiz type mismatch hatalarından kurtarıyor.

Bilgisayar ile matematik kullanmak, birçok bakımdan normal matematikten daha kolaydır. Özellikle eğer herhangi bir işlemin sonucunu ekran üzerinde göreceksek, bazı avantajları kullanabiliriz. Her şeyden önce Amiga'nın normal şartlarda sağladığı en yüksek yatay çözünürlük 640 noktadan ibarettir. Basic ile çalıştığınız Workbench ekranı ise 640x200 veya 640x256 çözünürlüktedir. Buradan açıkça görülüyor ki, herhangi bir grafiğinizin yatayda 640, dikeyde 256 değişik değeri alabilmesi mümkündür. Eğer bir fonksiyonu ekranda görecek ve bu fonksiyon sonuçlarını başka fonksiyonlara doğruluk gerektirecek şekilde katmayacaksanız, kullanacağınız fonksiyon sadece 0 ila 1000 arasındaki sayılarla idare edebilir. Yaklaşık hesaplar, çizimlerde doğru hesaplar kadar iyi ve kabul edilir sonuçlar verecektir. Bir diğer örnekte, gerekirse bu konuları daha detaylı inceleriz.

Grafiği yazma konusunda bazı sorunlarımız olabilir. İlk olarak koordinat eksenlerinde 0,0 noktası ortadadır. Amiga'da bu koordinat sol üst köşedir. Pencere genişliğini 640x200 kabul edelim, o zaman ekranın ortası 320, 100 noktası olacaktır. Şimdi, x koordinatı eksi olan bir noktayı düşünelim. Bu sayı, ekranın solunda kalmalıdır. Yani koordinatı 320'den az olmalıdır. Y'de durum biraz farklı. Y pozitif ise sayı ekranın yukarısına doğru kaymalıdır. Şimdi verilen bir noktayı ekran üzerinde yazmak için: X yerine 320+x ve Y yerine 100-y yazmamız gerekir. Burada 320 ve 100 sayıları ekranın ortasını temsil etmekte. Örneğimizde ekranın boyunun değişebileceğini düşünerek bunu önceden hesaplamış ve wxo% ve wyo% değerlerini kullanmıştık.

Bunun yanında ölçekleme içinde işlemler yapalım. Şu haliyle ekranın en sağ orta köşesi +320,0 koordinatında olacak. Eğer fonksiyonun kenarlarda alacağı maksimum değeri biliyorsak, uygun bir çarpma ile grafiği ölçekleyebiliriz. Aynı durum Y ekseni için de geçerli. Diyelim ki en sağ orta kenarın 10,0 noktası olmasını istiyoruz. X sağa kadar 320 nokta ötede. En sağ 10 olursa x başına kaç nokta düşer hesabını kolayca yapar ve X yerine 32*X yazmamız gerektiğini buluruz. Yani denklemimiz, X yerine 320 - (32*X) halini aldı. Örnekte bu sayılara ilaveten bir de soldan ve sağdan bir pay bırakıldığından formüller daha karışık gözüküyor.

% işareti bir değişkenin ondalık değişken olduğunu belirtiyor. Ondalık değişkenlerin . dan sonra değerleri yoktur ve 32767'den büyük değerler alamazlar. Az önce belirttiğim gibi, bu sayıları rahatça işlemlerimizde kullanabiliriz. Bu sayıları kullanmanın yararı nedir? Sadece hız. Bana inanmıyorsanız aşağıdakileri deneyin.

FOR F = 1 to 32000 ve FOR F% = 1 to 32000 G = F-G G% = F%-G% NEXT F NEXT F% İyi değil mi?. Son bir konu kaldı, o da se% adı verilen değişken. Bu değişken çizilen LINE'ın kaçar kaçar çizileceğini veriyor. Mesela se%=4 olursa grafik x'in her dört değerinden biri için çizilecek; dolayısı ile yapılan işlemler dörtte birine inecek. Önemli olan bu sayının işlevi değil. Dikkat ederseniz, bu sayı programın en başında belirlenmiş. Sadece bu en başını değiştirmek, tüm programın değişmesine sebep olacak. Bu tür sabitler kullanmaya alışın. Programlarınızı çok daha kullanışlı hale getirecektir.

Program RAM:'da bir dosya açıyor ve bunu silmiyor, haberiniz ola. (Hatasız kul olmaz. Sadece END'den önceye bir KILL "RAM:DATA" demek yeterli). Programlarınızı mümkünse RAD:'ı veya RAM:'ı kullanacak şekilde programlamanızı önemle tavsiye ederim.

Fazla çene yaptım ve çok ukalalık ettim. Affedin!. Bunun yanında yararlı olamadığımı söyleyemezsiniz. Önemli değil, benim için zevkti, bir dahaki sefere kadar hepinize (Özellikle MATEMATİKTE) başarılar.