0%

Javascriptte, class(sınıf) yoktur. Onun yeri objeler vardır. Bu objeler class olarakta kullanılabilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Hayvan sınıfı değişkenleri ve constructor
function Hayvan(yaş){
this.yaş = yaş;
console.log("Yeni hayvan");
}

// Hayvan sınıfı metodları
Hayvan.prototype.büyü = function(){
this.yaş++;
}

// Insan sınıfı değişkenleri ve constructor
function Insan(yaş){
Hayvan.call(this,yaş); // super classın constructorünü çağır
console.log("Yeni Insan");
}

// Kalıtım - prototipleri birleştir
Insan.prototype = Object.create(Hayvan.prototype);
Insan.prototype.constructor = Insan;

// Insanı sınıfının kendine özgü metodları
Insan.prototype.konuş = function(){
console.log("Ben "+this.yaş+" yaşıdayım");
}

// Test
var ahmet = new Insan(16);
ahmet.büyü();
ahmet.konuş();
console.log(ahmet)

Object.create fonksiyonu, bir objeyi kopyalamaz, sadece adresleme yaparak , yeni bir obje oluşturur.(delegasyon) Bunun sayesinde, kalıtım yaparken hafıza kullanımını azaltırız.

this deyimiyle javascriptte, sınıfın kendisi kastedilmez. Bir fonksiyonun hangi obje üzerinde çağrıldığı kastedilir. obje.fonksiyon(); yani o fonksiyonun içinde this kullanıldıysa, noktanın solundaki ilk ifade olan obje ,this’e karşılık düşer. Buda javascriptin önemli farklarında biridir.

Bir fonksiyondan sonra call kullanılırak, o fonksiyonundaki this ifadesi, istediğimiz obje ile yer değiştirebiliriz.

1
2
obje1.fonksiyon(); // burda this=obje1
obje2.fonksiyon.call(obje3); // burda this=obje3

İkili bir ağaç yapısıdır. Kök hariç , her düğümün bir ebeveyni vardı. Her ebeveyninde en fazla 2 çocuğu vardı.

2 türü vardır ; Minimum heap, Maximum heap.

Amacı

En yüksek performansta, bir diziden en küçük ve en büyük değerleri teker teker sırasıyla çekebilmektir. Bu dizi, sıralı değildir. Ancak ilk elemanı(kökü) daima en büyük veya en küçük elemandır.

Kuralları

  • Eğer minimum heap ise, ebeveyn çocuklarında daima küçük olmalıdır. Maximum heapde tam tersi geçerlidir.
  • Çocuklar arası ilişki yoktur.
  • Tek indeks sahip düğüm solda, çift indekse sahip düğüm sağdadır. (yani 3>sol; 4>sağ)
  • Ebeveyninin indeksinin 2 katının 1 fazlası sol çocuğun indeksi, 2 katının 2 fazlası sağ çocuğun indeksidir. (2nin sol çocuğu 5, sağ çocuğu 6'tir)
  • Yeni eklenen düğüm, her zaman ağacın en alt sol tarafına eklenir. (Yani dizinin en sağına eklenir)
NOT : Kökün indeksi 0'dır.

p : ebeveyn indeksi
x : herhangi bir düğümün indeksi
sol : sol çocuk indeksi
sağ : sağ çocuk indeksi


sol = 2p+1
sağ = 2
p+2

x%2 = 0 ise => sağdadır.
p = x / 2 - 1
x%2 = 1 ise => soldadır.
p = (x - 1) / 2

Ekleme

  • Değer dizinin sonuna(en sağına), eklenir.
  • Eklenen değer ebeveyni ile kıyaslanır. Ebeveyninden küçük ise, onunla yer değiştiri ve bu işlemin aynısı ebeveynlerininin ebeveynleri ilede yapılır.

Çıkarma

  • Heapda, daima kök değer çıkartılır. Yani dizinin ilk elemanı çıkartılır.
  • Çıkartılan bu değer ile yeni ağaç oluşur.
  • Bu ağaçta kökten başlayan, çocuğu olmayan düğüme kadar, en küçük değere sahip çocuk ile kıyaslanır, eğer en küçük çocuktan büyük ise yer değiştirilir. Yer değiştirilen çocuk ile aynı işlem ağacın o dalı boyunca tekrarlanır.
Bu işlemi yapan, yeni yazdığım bir Heap sınıfı.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function Heap(sortFunc){
this.nodes = [];
this.sortFunc= sortFunc || function(a,b){return a-b;};

this.func = function(a,b){
return this.sortFunc(a,b) < 0;
}
}



Heap.prototype = {
add : function(e){
var x = this.nodes.length;
this.nodes.push(e);
var p = this.parent(x);

// heapify2up
while(this.func(this.nodes[x],this.nodes[p]) && x!=0){
this.nodes[x]=this.nodes[p];
this.nodes[p]=e;

x=p;
e = this.nodes[x];
p=this.parent(x);
}

return this.nodes;

},
get : function(){
var r = this.nodes.shift();

//heapify2down
var x = 0;
var childs = this.childs(x);
var min;
while(childs.length!=0){
min=childs[0];
if(childs.length==2 && !this.func(this.nodes[childs[0]],this.nodes[childs[1]])){
min = childs[1];
}

if(this.func(this.nodes[min],this.nodes[x])){
var temp = this.nodes[x];
this.nodes[x] = this.nodes[min];
this.nodes[min] = temp;
x = min;
childs = this.childs(x);
}
else childs=[]
}
return r;
},
isEmpty : function(){
return this.nodes.length==0;
},
parent : function(x){
if(this.right(x)) return x/2-1;
return (x-1)/2;
},
childs : function(x){
var a = [];
if(this.nodes[2*x+1]){
a.push(2*x+1);
if(this.nodes[2*x+2])
a.push(2*x+2);
}
return a;
},
right : function(x){
return x%2==0;
}
};

Amacı : Bir düğümden, diğer düğüme en az maliyetli çözümü bulmak

Türü : Arama Algoritması, Sezgisel Algoritma (Yapay zeka)

Kâşifleri : Nils Nilsson,Bertram Raphael , Peter E. Hart

Kullanım yerleri :

  • Yol bulma
  • Oyunlarda aktörün hedefe doğru izleyeceği yolların tespiti
  • Gezgin satıcı probleminin çözümü
  • Labirentten en kısa çıkışı bulma
 

f(x) : durum fonksiyonu. Az olması, o durumun daha az maliyetli olduğunu belirtir.

f(x) = g(x) + h(x)

g(x) : Başlangıç durumuna göre maliyetimiz.

h(x) : Bitiş duruma olan sezgisel maliyet.

Algoritma

OPEN -> // fCost'a göre sıralı dizi

OPEN.ekle(başlangıç_düğümü)

DÖNGÜ - OPEN dizi boyutu 0 olmadığı müddetçe
şuanki_düğüm <- OPEN.ilk elemanı
OPEN.sil(şuanki düğüm)
EĞER şuanki_düğüm, hedef düğüm ise
DÖNGÜden çık // HEDEFE ULAŞTI
şuanki_düğüm.closed=true
şuanki_düğüm.gCostHesapla()
komşular = şuanki_düğüm.komşular
DÖNGÜ komşu <- komşular
EĞER komşu.closed ise SONRAKİ_KOMŞUYA_GEÇ
maliyet = şuanki_düğüm.gCost + komşuya_uzaklık
komşu.gCostHesapla()
EĞER komşu.OPENdaDeğilse veya maliyet<komşu.gCost ise
komşu.gCost = maliyet
komşu.hCostHesapla()
komşu.ebeveyn = şuanki_düğüm
EĞER komşu.OPENdaDeğilse
OPEN.ekle(komşu)
OPEN dizi boyutu 0 olduğu için DÖNGÜden çıkıldıysa // HEDEFE ULAŞAMADI

Javascript Kodu

FIND (Yol bulmayı başlat)
RELOAD (Gridi yeniden yükle)
ilk tık -> başlangıç karesi
2. tık -> hedef kare
sonraki tıklar -> engel oluştur

See the Pen A* Algoritması by farukcan (@farukcan) on CodePen.

Bu oyunda YZ, oyuncunun yaptığı hamlenin ardından, kendi yapacağı hamlelerin durum uzayını oluşturup sezgisel fonksiyon ile ileriye yönelik hamleleri bir puan vermektedir. Bunu yaparken, rakibinin bir sonraki hamlesini de göz önüne alır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

/**
* Created by Faruk Can on 6.4.2016.
*/

var ç = new CanvasRender("canvas1");

var canvasboyut = 500;

var tahta = [
[0,0,0],
[0,0,0],
[0,0,0]
];
// 1 : X
// diğer : O
// 0 : boş



// kontrol mekanizması
ç.addClickListener(function(x,y){
console.log(x,y);
});
var hamleyapmakiçinarray = [];
for(var m=0;m<3;m++)
for(var n=0;n<3;n++){
hamleyapmakiçinarray.push({
"height" : canvasboyut/3,
"width" : canvasboyut/3,
"top" : canvasboyut/3*m,
"left" : canvasboyut/3*n
});
}
hamleyapmakiçinarray[0].func = function (){hamleyap(0,0)};
hamleyapmakiçinarray[1].func = function (){hamleyap(0,1)};
hamleyapmakiçinarray[2].func = function (){hamleyap(0,2)};
hamleyapmakiçinarray[3].func = function (){hamleyap(1,0)};
hamleyapmakiçinarray[4].func = function (){hamleyap(1,1)};
hamleyapmakiçinarray[5].func = function (){hamleyap(1,2)};
hamleyapmakiçinarray[6].func = function (){hamleyap(2,0)};
hamleyapmakiçinarray[7].func = function (){hamleyap(2,1)};
hamleyapmakiçinarray[8].func = function (){hamleyap(2,2)};
ç.clickElement = hamleyapmakiçinarray;



// ilk durum
var oyunKimde = "X";
var sıra = 0;
tahtayıÇiz();
hamleleriÇiz(true);





function hamleyap(m,n){
if(oyunKimde == "X" && tahta[m][n]==0){
tahta[m][n] = 1;
oyunKimde = "O";
ç.clear();
tahtayıÇiz();
hamleleriÇiz();
sıra++;
if(!oyunsonu())
setTimeout(YZhamleyap,500);
}
}

function oyunsonu(){
if(sıra>8) return beraber();
var taraf = 1;
kontrolEdilecekYerler.forEach(function(yerler){
var kactane1var = 0;
yerler.every(function(y){
var n= (y-1)%3;
var m= Math.floor((y-1)/3);
if(tahta[m][n]*taraf==-1) {
kactane1var=0;
return false;
}
if(tahta[m][n]*taraf==1) kactane1var++;
return true;
});
if(kactane1var==3) {
Xkazandı();
}
});
var taraf = -1;
kontrolEdilecekYerler.forEach(function(yerler){
var kactane1var = 0;
yerler.every(function(y){
var n= (y-1)%3;
var m= Math.floor((y-1)/3);
if(tahta[m][n]*taraf==-1) {
kactane1var=0;
return false;
}
if(tahta[m][n]*taraf==1) kactane1var++;
return true;
});
if(kactane1var==3) {
Okazandı();
}
});

}

function Xkazandı(){
alert("X kazandı");
reload();
}
function Okazandı(){
alert("O kazandı");
reload();
}
function beraber(){
alert("Berabere");
reload();
}

function reload(){
setTimeout(function(){location.reload();},2000);
}


var kontrolEdilecekYerler = [
[1,2,3],
[4,5,6],
[7,8,9],
[1,4,7],
[2,5,8],
[3,6,9],
[1,5,9],
[3,5,7]
];

// # tek taraf sezgisel fonksiyon h2
// -- her satır, sutun ve 2çarpraz için
// --- Eğer -1 varsa : 0 puan
// --- Eğer 1 tane 1 varsa : 1 puan
// --- Eğer 2 tane 1 varsa : 3 puan
// --- Eğer 3 tane 1 varsa : 99 puan
function h2(taraf,durum){
var puan=0;
kontrolEdilecekYerler.forEach(function(yerler){
var kactane1var = 0;
yerler.every(function(y){
var n= (y-1)%3;
var m= Math.floor((y-1)/3);
if(durum[m][n]*taraf==-1) {
kactane1var=0;
return false;
}
if(durum[m][n]*taraf==1) kactane1var++;
return true;
});
if(kactane1var==3) puan+=999;
else if(kactane1var==2) puan+=3;
else puan+=kactane1var;
});
return puan;
}

// rahibin sonraki el en iyi hamlesinin puanını belirle
var h3iterasyon=0;
function h3(taraf,durum){

if(++h3iterasyon==100) return 0;

var olasıHamleler = [];
/*
{
m: (x)
n: (y)
h:(sayı) // hamlenin sezgisel fonksiyon değeri
}
*/
for(var m=0;m<3;m++)
for(var n=0;n<3;n++){
if(durum[m][n]==0){
// boş olan yerlere hamle yapılabilir
var d = JSON.parse(JSON.stringify(durum)) // dunyayı klonla
d[m][n] = taraf; //hamleyi duruma dahil et
olasıHamleler.push(
{
"m" : m,
"n" : n,
"h" : h(taraf,d)
}
);
}
}

// en iyi hamleleri sırala
olasıHamleler.sort(function(a,b){
return b.h - a.h;
});
if(typeof olasıHamleler[0] == "undefined") return 0;
return olasıHamleler[0].h;
}

// # çift taraf sezgisel fonksiyon h
// -- h = h2 - h3
function h(taraf,durum){
return h2(taraf,durum) - h3(-taraf,durum);
}

function YZhamleyap(){

h3iterasyon=0;
sıra++;

var olasıHamleler = [];
/*
{
m: (x)
n: (y)
h:(sayı) // hamlenin sezgisel fonksiyon değeri
}
*/
for(var m=0;m<3;m++)
for(var n=0;n<3;n++){
if(tahta[m][n]==0){
// boş olan yerlere hamle yapılabilir
var durum = JSON.parse(JSON.stringify(tahta)) // dunyayı klonla
durum[m][n] = -1; //hamleyi duruma dahil et
olasıHamleler.push(
{
"m" : m,
"n" : n,
"h" : h(-1,durum)
}
);
}
}

// en iyi hamleleri sırala
olasıHamleler.sort(function(a,b){
return b.h - a.h;
});

tahta[olasıHamleler[0].m][olasıHamleler[0].n] = -1;
console.log(olasıHamleler);
oyunKimde = "X";
ç.clear();
tahtayıÇiz();
hamleleriÇiz(true);
oyunsonu();
}


function tahtayıÇiz(){
// tik tak to tahtası
for(var i=1;i<3;i++){
ç.line(canvasboyut/3*i,20,canvasboyut/3*i,canvasboyut-20);
ç.line(20,canvasboyut/3*i,canvasboyut-20,canvasboyut/3*i);
}

}

function hamleleriÇiz(num){
// tahta üzerinde yazan meretler
var sira = 0;
for(var m=0;m<3;m++)
for(var n=0;n<3;n++){
sira++;
if(tahta[m][n]==0){
if(num){
ç.font(ç.standartFont);
ç.text(sira,canvasboyut/6+canvasboyut/3*n,canvasboyut/6+canvasboyut/3*m);
}
}
else if(tahta[m][n]==1){
ç.font("233px Arial");
ç.text("X",canvasboyut/3*n,canvasboyut/3+canvasboyut/3*m);
}else{
ç.font("213px Arial");
ç.text("O",canvasboyut/3*n,canvasboyut/3+canvasboyut/3*m-5);
}
}


ç.font(ç.standartFont);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
var checksum=false;
var seqnumenabled = false;
var onlyack = false;
var seqnum = 0;
var rtd30 = false;
var seqnumold = seqnum;
var tcp = false;

function send(){

delay();

checksum = $("#checksum").is(":checked");
seqnumenabled = $("#seqnum").is(":checked");
onlyack = $("#onlyack").is(":checked");
rtd30 = $("#rtd30").is(":checked");;
tcp = $("#tcp").is(":checked");;

if(!checksum)
return tabloyaekle($("#datawillsend").val(),"==>",recieve());
else{
if(seqnumenabled){
if(onlyack){
if(rtd30){

if(tcp){
var recieved = recieve();
var crecieved = checksummed(recieved);
var sended = $("#datawillsend").val();
var csended = checksummed(sended);
if(kayboldumu()){

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","=[KAYIP]>","");

setTimeout(send,$("#time").val());

}else{

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");

seqnumold = seqnum;

sendACKforTCP(csended==crecieved)


setTimeout(function () {
if(seqnumold == seqnum)
send();
},$("#time").val());


}

}
else{

var recieved = recieve();
var crecieved = checksummed(recieved);
var sended = $("#datawillsend").val();
var csended = checksummed(sended);

if(kayboldumu()){

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","=[KAYIP]>","");

setTimeout(send,$("#time").val());

}else{

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");

seqnumold = seqnum;

sendACKwithCS2withLoss(csended==crecieved)


setTimeout(function () {
if(seqnumold == seqnum)
send();
},$("#time").val());


}

}



}else{

var recieved = recieve();
var crecieved = checksummed(recieved);
var sended = $("#datawillsend").val();
var csended = checksummed(sended);

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");

seqnumold = seqnum;

sendACKwithCS2(csended==crecieved);

setTimeout(function () {
if(seqnumold == seqnum)
send();
},$("#time").val());

}


}else{
var recieved = recieve();
var crecieved = checksummed(recieved);
var sended = $("#datawillsend").val();
var csended = checksummed(sended);

tabloyaekle("["+seqnum+"] "+sended+"("+csended+")","==> ","["+seqnum+"] "+recieved+"("+csended+"/"+crecieved+")");

if(csended==crecieved){
sendACKwithCS();
}else{
sendNACKwithCS();
}
}




}else{
var recieved = recieve();
var crecieved = checksummed(recieved);
var sended = $("#datawillsend").val();
var csended = checksummed(sended);

tabloyaekle(sended+"("+csended+")" , " ==>" , recieved+"("+csended+"/"+crecieved+")");


if(csended==crecieved){
sendACK();
}else{
sendNACK();
}

}

}
}

function sendACK(){
delay();

if(bozuldumu()){
tabloyaekle("?NACK?"," <== ","ACK");
send();
return tabloyaekle("","","! HATA : duplikasyon tespit edildi ?");
}
else
return tabloyaekle("ACK"," <== ","ACK") + tabloyaekle("","BiTTi","");
}
function sendNACK(){
delay();

if(bozuldumu()){
tabloyaekle("?ACK?"," <== ","NACK");
return tabloyaekle("","","! HATA : istenen veri alınamadı ?");
}
else
return tabloyaekle("NACK"," <== ","NACK");
return send();
}

function sendACKwithCS(){
delay();

if(bozuldumu()){
if(checksumdogrumu()){
tabloyaekle("NACK (A)"," <== ","ACK (A)");
tabloyaekle("checksum eşleşmedi"," ","");
tabloyaekle("","","! DÜZELTİLDİ : duplikasyon tespit edildi?");
send();
}else{
tabloyaekle("NACK (N)"," <== ","ACK (A)");
send();
}
}else{
tabloyaekle("ACK (A)"," <== ","ACK (A)");
seqnum++;
tabloyaekle("","BiTTi","");
}
}

function sendNACKwithCS(){
if(bozuldumu()){
if(checksumdogrumu()){
tabloyaekle("ACK (N)"," <== ","NACK (N)");
tabloyaekle("checksum eşleşmedi"," ","");
send();
}else{
tabloyaekle("ACK (A)"," <== ","NACK (N)");
seqnum++;
return tabloyaekle("","","! HATA : istenen veri alınamadı ?");
}
}else{
tabloyaekle("NACK (N)"," <== ","NACK (N)");
send();
}
}

function sendACKwithCS2(checksum){
delay();

if(bozuldumu()){
{
tabloyaekle("["+seqnum+"] ACK (N)"," <== ","["+seqnum+"] ACK (A)");
tabloyaekle("checksum eşleşmedi"," ","");
send();
tabloyaekle("","","! DÜZELTİLDİ : duplikasyon tespit edildi ?");
}
}else{
if(checksum){
tabloyaekle("["+seqnum+"] ACK (A)"," <== ","["+seqnum+"] ACK (A)");
seqnum++;
tabloyaekle("","BiTTi","");
}
}


}

function sendACKwithCS2withLoss(checksum){
delay();

if(kayboldumu()){
tabloyaekle(""," <[KAYIP]= ","["+seqnum+"] ACK");
}else{
sendACKwithCS2(checksum);
}

}

function sendACKforTCP(checksum){
delay();
if(kayboldumu()){
tabloyaekle(""," <[KAYIP]= ","["+seqnum+"] ACK");
}else{
if(bozuldumu()){
{
if(checksum) {
tabloyaekle("[" + seqnum + "] ACK (N)", " <== ", "[" + seqnum + "] ACK (A)");
tabloyaekle("checksum eşleşmedi", " ", "");
send();
}
}
}else{
if(checksum){
tabloyaekle("["+seqnum+"] ACK (A)"," <== ","["+seqnum+"] ACK (A)");
seqnum+=$("#datawillsend").val().length;
tabloyaekle("","BiTTi","");
}
}
}
}

function checksummed(t){
var csum = 0;
for(var i= 0;i<t.length;i++){
if(t[i]=="1") csum++;
}
return csum;
}
function recieve(){
var t = $("#datawillsend").val();
for(var i= 0;i<t.length;i++){
if(bozuldumu()){
if(t[i]=="0") t = t.replaceAt(i, "1");
else t = t.replaceAt(i, "0");;
}
}
return t;
}


function bozuldumu(){
return Math.random()*100<parseInt($("#bozulma").val());
}
function kayboldumu(){
return Math.random()*100<parseInt($("#kayip").val());
}
function checksumdogrumu(){
return Math.random()*100<50;
}
function tabloyaekle(a,b,c){
$("#tablo").append("<tr><td>"+Date.now().toTime()+"</td></td><td>"+a+"</td><td>"+b+"</td><td>"+c+"</td></tr>");
}

function temizle(){
$("#tablo").html("<tr><th>GÖNDEREN</th><th>ARA</th><th>ALAN</th></tr>");
seqnum = 0;
}
String.prototype.replaceAt=function(index, character) {
return this.substr(0, index) + character + this.substr(index+character.length);
}

Number.prototype.toTime = function(){
return Math.floor(this%3600000/60000)+":"+ Math.floor(this%60000/1000) + ':' + this%1000
};

function delay(){
sleep(parseInt($("#thr").val()));
}
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
 var sozluk=[];

function print(a){
$("#out").html($("#out").html()+a);
}
function clone(oldObject){
return jQuery.extend({}, oldObject);
}

$("#buton").click(function(e){
calc();
});


function Node(ust,left,right,level,frekans,char){
this.ust = ust;
this.left = left;
this.right = right;
this.level = level ;
this.char = char;
this.frekans = frekans;
this.kod="";
}

function calc(){
var text = $("#tb").val();
var array = text.split("");
var chars = [];
var frekans = [];
var sorted = [];

$("#out").html("Toplam : "+array.length+"<h2>Frekanslar</h2>");

for(k in array){
if(chars.indexOf(array[k]) == -1)
chars.push(array[k]);
}

for(k in array){
ch = chars.indexOf(array[k]);
if(ch != -1){
if(frekans[ch]){
frekans[ch]++;
}
else
{
frekans[ch]=1;
}
}
}

for(i in chars){
print("'"+chars[i]+"' "+( frekans[i]/array.length)+"<br>" );
sorted.push({
"char" : chars[i],
"frekans" : (frekans[i]/array.length)
});
}


var levels=[[]];

for(i=0;i<sorted.length;i++){
levels[0].push(new Node(false,false,false,0,sorted[i].frekans,sorted[i].char));
}

var level = 0;
while(levels[level].length>2){

levels[level].sort(function(a, b) {
return parseFloat(b.frekans) - parseFloat(a.frekans);
});

level++;
levels.push([]);

i = levels[level-1].length-1;

levels[level].push(new Node(false,levels[level-1][i-1],levels[level-1][i],level,(levels[level-1][i-1].frekans+levels[level-1][i].frekans),"yok"));

levels[level-1][i-1].ust = levels[level][levels[level].length-1];
levels[level-1][i].ust = levels[level][levels[level].length-1];

for(var j = levels[level-1].length-3 ; j>=0;j--){
levels[level].push(levels[level-1][j]);
levels[level-1][j].ust = levels[level][levels[level].length-1];
}


}

levels[level].sort(function(a, b) {
return parseFloat(b.frekans) - parseFloat(a.frekans);
});



GenerateCode(levels[level][0],"1");
GenerateCode(levels[level][1],"0");







print("<h2>Ağaç</h2>");



levels.forEach(function(e){
print("<br>");
e.forEach(function(l){
print(Math.round(l.frekans*100)/100+" | ");
})
});

print("<h2>Kod</h2>");



levels.forEach(function(e){
print("<br>");
e.forEach(function(l){
print(l.kod+" | ");
})
});

sozluk=[];

print("<h2>Kodlama</h2>");
levels[0].forEach(function(l){
print(l.char+" = "+l.kod+" <br> ");
sozluk.push({
"char" : l.char,
"kod" : l.kod
});
})

print("<h2>Encode</h2>");

array.forEach(function(e){
print(encode(e));
});

console.log(levels);


}


function GenerateCode(node,kod){
node.kod=kod;
if(node.left)
GenerateCode(node.left,"1"+node.kod);
if(node.right)
GenerateCode(node.right,"0"+node.kod);
}

function encode(char){
for(k in sozluk){
if(sozluk[k].char==char)
return sozluk[k].kod;
}
return "?";
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
var w, // ağırlık
A, B, // girişler
dA,dB; // istenenler


function calculate(){
$('#console').html('');
MAXLOOP=Number($("#maxloop").val());

var data = [];
data.push(A);
data.push(B);
var beklenen = [];
beklenen.push(dA);
beklenen.push(dB);

var c=Number($("#c").val());
var k=1; // itarasyon ks
var E=1; //ERROR
var o=0; //sign(toplam)
var p=0; // adım sayısı
while (E>0 && p < MAXLOOP) {

E = 0;
p++;
if (p == MAXLOOP - 1){
alert("MAX LOOP Aşıldı");
break;
}

for (var j = 0; j < data.length; j++) {
o = sign(toplam(data[j], w));

if (o == beklenen[j]) {
//ok
} else {

for (var i = 0; i < w.length; i++) {
w[i] = w[i] + c * (beklenen[j] - o) * data[j][i] / 2;
}
}

E = E + 1 / 2 * (Math.pow(beklenen[j] - o, 2));

}
k++;

print("<br>w = "+w.toString()+"[ E= "+E+" ]");


}

alert("w = "+w.toString());

}

function toplam(x,w){
var toplam=0;
for(key in w){
toplam+=w[key]*x[key];
}
return toplam;
}

function sign(x){
return Math.sign(x);
}

function f(x){
return 2/(1+Math.exp(-1*x))-1;
}

ekran

bezier2.cview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#include <stdio.h>
#include <math.h>
#include <GL/glut.h>

// 16 adet bezier noktası
GLfloat k[4][4][3] = {
{{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0},
{0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
{{-1.5, -0.5, 1.0}, {-0.5, -0.5, 1.0},
{1.5, -0.5, 0.0}, {1.5, -0.5, -1.0}},
{{-1.5, 0.5, 4.0}, {-1.5, 0.5, 0.0},
{0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}},
{{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},
{0.5, 1.5, 0.0}, {3.5, 1.5, -1.0}}
};

// Işık kaynağının kordinatı
GLfloat light[3] = {0.5f,1.5f,0.0f} ;

// bezier yüzeyinin gerçekçiliği
int hassasiyet = 30;

// Kamera yönü için dönüş açısı
float angle = 0.0f;
// Kameranın yönünü temsil eden asıl vektör
float lx=0.0f,lz=-1.0f;
// Kameranın XZ konumu
float x=0.0f, z=5.0f;
// tuş durumları. Bu değişkenler sıfır olacak
// Hiç tuş basımı olmadığında
float deltaAngle = 0.0f;
float deltaMove = 0;
int xOrigin = -1;

int faktoriyel(int s){
if(s <= 1) return 1;
return s * faktoriyel(s - 1);
}
int permutasyon(int n,int i){
return faktoriyel(n)/(faktoriyel(i)*faktoriyel(n-i));
}
float ust(float x,int k){
return (float)pow((double)x,(double)k);
}

// Bi,n(u) Bezierin için n.dereceden binom fonksiyonu
float B(int i,int n,float u){
return ((float)permutasyon(n,i)) * ust(u,i) * ust((1.0f-u),(n-i));
}

// p(u,v) - Bezier noktasını veren fonksiyon
float p(float u,float v,int d/* d : dimesion boyut 0x 1y 2z */){
int i,j; /* cache */
float out=0; /* çıktı */

for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++){
out = out + B(i,3,u) * B(j,3,v) * k[i][j][d];
}
return out;
}


/* 2 nokta arasındaki farkı bulur */
float d(float x1,float y1,float z1,float x2,float y2,float z2){
return (float)(sqrt((double)(ust((x2-x1),2) + ust((y2-y1),2) + ust((z2-z1),2))));
}



void bezirYuzey(void){ // bu fonksiyon bezier yüzeyi oluşturur
int i,j,v;
float I,f,x[4],y[4],z[4],nx,ny,nz,nd,lx,ly,lz,ld,alfa,calfa,k=0.0000001f;

// ışığın birim vektörünü hesaplayalım
ld = d(0.0f,0.0f,0.0f,light[0],light[1],light[2]);
lx = light[0]/ld;
ly = light[1]/ld;
lz = light[2]/ld;


glPointSize(2.0);
for (i = 0; i < hassasiyet; i++)
for (j = 0; j < hassasiyet; j++) {
// yüzeyin noktalarını hesapla
x[0] = p(1.00f*i/hassasiyet,1.00f*j/hassasiyet,0);
x[1] = p(1.00f*i/hassasiyet,1.00f*(j+1)/hassasiyet,0);
x[2] = p(1.00f*(i+1)/hassasiyet,1.00f*(j+1)/hassasiyet,0);
x[3] = p(1.00f*(i+1)/hassasiyet,1.00f*j/hassasiyet,0);
y[0]= p(1.00f*i/hassasiyet,1.00f*j/hassasiyet,1);
y[1]= p(1.00f*i/hassasiyet,1.00f*(j+1)/hassasiyet,1);
y[2]= p(1.00f*(i+1)/hassasiyet,1.00f*(j+1)/hassasiyet,1);
y[3]= p(1.00f*(i+1)/hassasiyet,1.00f*j/hassasiyet,1);
z[0] = p(1.00f*i/hassasiyet,1.00f*j/hassasiyet,2);
z[1] = p(1.00f*i/hassasiyet,1.00f*(j+1)/hassasiyet,2);
z[2] = p(1.00f*(i+1)/hassasiyet,1.00f*(j+1)/hassasiyet,2);
z[3] = p(1.00f*(i+1)/hassasiyet,1.00f*j/hassasiyet,2);

// normal vektorü hesaplayalım
nx = ((y[1] - y[2]) * (z[2] - z[3])) - ((z[1] - z[2]) * (y[2] - y[3]));
ny = ((z[1] - z[2]) * (x[2] - x[3])) - ((x[1] - x[2]) * (z[2] - z[3]));
nz = ((x[1] - x[2]) * (y[2] - y[3])) - ((y[1] - y[2]) * (x[2] - x[3]));
// normal vektörünün uzunluğu
nd = d(0.0f,0.0f,0.0f,nx,ny,nz);
// normal vektörünü, birim vektor haline getirelin
nx /= nd;
ny /= nd;
nz /= nd;



//alfa ; ışık vektörü ile normal vektörü arasındaki açıdır
// <n,l> = |n|*|l|*cosALFA; n ve l nin uzunluğu 1dir
alfa = (float)acos((double)((nx*lx) + (ny*ly) + (nz*lz)));

// calfa = cos(alfa)'dır'
calfa = (float)cos((double)alfa);

// f : normal(orta nokta) ile ışık kaynağı arası mesafe
f = d(light[0],light[1],light[2],p(1.00f*(i+0.5f)/hassasiyet,1.00f*(j+0.5f)/hassasiyet,0),p(1.00f*(i+0.5f)/hassasiyet,1.00f*(j+0.5f)/hassasiyet,1),p(1.00f*(i+0.5f)/hassasiyet,1.00f*(j+0.5f)/hassasiyet,2));

// ışık şiddetini hesapla
I = 1.0f*calfa / (f+k); // ışık fonksiyonu

glColor3f(I*0.05f,I,I); // ışıklandırmaya göre yüze renk ver

glBegin(GL_QUADS); // yüzeyi çiz
for(v = 0; v< 4;v++ )
glVertex3f(x[v],y[v],z[v]);
glEnd();

}

}



void changeSize(int w, int h) { //penceri boyutu değişirse
// sıfırla bölmeyi önle.
if (h == 0)
h = 1;

float ratio = w * 1.0 / h;

// Projection Matrisini aktif et
glMatrixMode(GL_PROJECTION);

// Matrisi resetle
glLoadIdentity();

// viewport olarak tüm pencereyi set et
glViewport(0, 0, w, h);

// uygun perspektifi set et.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);

// Modelview’e geç
glMatrixMode(GL_MODELVIEW);
}


void computePos(float deltaMove) { // kamere pozisyonu hesapla
x += deltaMove * lx * 0.1f;
z += deltaMove * lz * 0.1f;
}

void renderScene(void) {
int i,j;
if (deltaMove)
computePos(deltaMove);

// Color ve Depth Bufferları temizle
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// dönüşümleri Resetle

glLoadIdentity();

// kamerayı set et
gluLookAt(
x, 1.0f, z,
x+lx, 1.0f, z+lz,
0.0f, 1.0f, 0.0f);

// bezier noktalarını çiz
glPointSize(5.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
glVertex3fv(&k[i][j][0]);
glEnd();

glPointSize(10.0);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POINTS);
glVertex3fv(&light[0]);
glEnd();


// bezier yüzeyini çız
bezirYuzey();

// bezier yüzeyin noktalarını hareket ver
/*k[3][3][2] = k[3][3][2] + 0.01f;
k[1][2][2] = k[1][2][2] - 0.01f;*/
light[2] += 0.01f;
light[1] -= 0.001f;

glutSwapBuffers();
}

// -----------------------------------//
//KLAVYE
// -----------------------------------
void processNormalKeys(unsigned char key, int xx, int yy) {
if (key == 27)
exit(0);
}
void pressKey(int key, int xx, int yy) {
switch (key) {
case GLUT_KEY_UP : deltaMove = 0.5f; break;
case GLUT_KEY_DOWN : deltaMove = -0.5f; break;
}
}
void releaseKey(int key, int x, int y) {
switch (key) {
case GLUT_KEY_UP :
case GLUT_KEY_DOWN : deltaMove = 0;break;
}
}

// -----------------------------------
//
//FARE
// -----------------------------------
void mouseMove(int x, int y) {// Bu sadece, sol düğme basılı olduğu zaman doğru olacak
if (xOrigin >= 0) {
// deltaAngle’i güncelle
deltaAngle = (x - xOrigin) * 0.001f;
// kamera'nın yönünü güncelle
lx = sin(angle + deltaAngle);
lz = -cos(angle + deltaAngle);
}
}
void mouseButton(int button, int state, int x, int y) {
// Sadece eğer sol düğme basılırsa harekete başla
if (button == GLUT_LEFT_BUTTON) {
// Düğme bırakıldığı zaman
if (state == GLUT_UP) {
angle += deltaAngle;
xOrigin = -1;
}
else {// state = GLUT_DOWN
xOrigin = x;
}
}
}

// -----------------------------------
//
//MAIN
// -----------------------------------
int main(int argc, char **argv) {
// GLUT’u ilkle ve pencereyi yarat
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(900,900);
glutCreateWindow("Bezier Egrisi");
// callbackleri kaydet
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);
glutIgnoreKeyRepeat(1);
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(pressKey);
glutSpecialUpFunc(releaseKey);
// iki yeni fonksiyon burada
glutMouseFunc(mouseButton);
glutMotionFunc(mouseMove);
// OpenGL ilklemeleri
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

// GLUT olay işleme döngüsüne gir
glutMainLoop();
return 0;
}

bezier

bezier.cview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdlib.h>
#include <GL/glut.h>

#define EKRAN 720

/*
### CC BY-SA Lisansı ###
http://ozgurlisanslar.org.tr/creative-commons/attribution-sharealike-cc-by-sa/
Faruk Can tarafından geliştirildi.
Hakları Saklıdır. ve Faruk Can'a aittir
Lütfen alıntı yaptığınızı belirtiniz.
[email protected]
*/

GLfloat p[4][2] = {
    {-0.9f,0}, // p0
    {0.1f,0.9f}, // p1
    {0.5,0.9f}, // p2
    {0.9f,0} // p3
}; // 4 adet bezier noktası

int hassasiyet = 5; // bezier eğirisinin kaç çizgiden oluşacağını belirler

// fonk - draw - görüntüyü çizer
void draw (void)
{

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // önceki görüntüyü temizle

   bezierEgrisi(hassasiyet);
   bezierNoktalari();

   glFlush();

}//enddraw

// fonk - c - bezier noktalarını oluşturan formül c(t) = p0*(1-t)^3 + 3p1*t*(1-t)^2 + 3p2t^2(1-t) + p3t^3
GLfloat c (
    /* in */ GLfloat t,
    /* in */ int y)
{

    /*out*/ return p[0][y]*(1.0f-t)*(1.0f-t)*(1.0f-t) +
            3*p[1][y]*t*(1.0f-t)*(1.0f-t) +
            3*p[2][y]*t*t*(1.0f-t) +
            p[3][y]*t*t*t;
} //endc

// fonk - bezierEgrisi - bezir egrisi çizer
void bezierEgrisi (
   /* in */        int hassasiyet )
{
   /* cache */    int i;

   glColor3f(1.0, 1.0, 1.0); // beyaz renkte çiz

   glBegin(GL_LINE_STRIP);

    for(i = 0 ; i<=hassasiyet ; i++)
        glVertex3f(c(1.00f*i/hassasiyet,0),c(1.00f*i/hassasiyet,1),0.0f);

   glEnd();
}

// fonk - bezierNoktalari - bezir noktalarını çizer
void bezierNoktalari (
    /* - */ void)
{
   /* cache */ int i;

   glColor3f(1.0, 0.0, 0.0); // kırmızı renkte çiz
   glPointSize(5.0f); // 5kat büyük nokta
   glBegin(GL_POINTS);
    for (i = 0; i < 4; i++)
        glVertex3f(p[i][0],p[i][1],0.0f);
   glEnd();

}

// fonk - farkkare - iki nokta arası farkın karesidir
float farkkare(float x,float y,float m,float n){
    return (m-x)*(m-x) + (n-y)*(n-y);
}

// mouse ün koordinat düzlemini, opengl koordinat düzlemi çevirirler.
float ekran2koorx(float x){
    return (((float)x/(float)EKRAN))*2 -1;
}
float ekran2koory(float x){
    return (((float)x/(float)EKRAN))*-2 + 1;
}

// yeri değiştirmek üzere seçilen noktadır
int secili_nokta=0;
// fonk - mousea tıklandığında en yakın noktayı seçer
void bezir_noktasi_sec( int x, int y){
    float min=2.0f,d;
    int i;
    for (i = 0; i < 4; i++){
        d = farkkare(ekran2koorx(x),ekran2koory(y),p[i][0],p[i][y]);
        printf("fark nokta %f\n",d );

        if( d < min){
            min = d;
            secili_nokta = i;            
        }
    }
    printf("secili nokta %i\n",secili_nokta );
}

// fonk - seçili noktanın koordinatlarını değiştirir
void bezir_noktasi_degistir(int x, int y){
 p[secili_nokta][0] = ekran2koorx(x);
 p[secili_nokta][1] = ekran2koory(y);
}

void keyboard(unsigned char key, int x, int y){
    printf("%c %i | %i %i \n",key,key,x,y );
    if(key==43) hassasiyet+=1; // hassasiyeti arttır + tuşu
    if(key==45) hassasiyet-=1; // hassasiyeti azalt - tuşu
    if(key==104) printf("hassasiyet : %i\n",hassasiyet ); // h tuşu
}
void skeyboard(unsigned char key, int x, int y){
    printf("skey %i | %i %i \n",key,key,x,y );
}

void mouse(int buton,int durum,int x,int y){
    printf("mouse %i %i %i %i\n",buton,durum,x,y );
    if(buton==0 &amp;&amp; durum==0) bezir_noktasi_sec(x,y); // mouse tıklmasında en yakın nokta sec
    else if((buton==0 &amp;&amp; durum==1) ) bezir_noktasi_degistir(x,y); // en yakın noktayı değiştir
}

int main(int argc, char** argv)
{
   glutInit(&amp;argc, argv);
   glutInitDisplayMode (GLUT_ALPHA | GLUT_RGBA);

   glutInitWindowSize (EKRAN, EKRAN); //pencere boyutu
   glutInitWindowPosition (100, 100); // pencerenin ana konumu

   glutCreateWindow (argv[0]);

   glutIdleFunc(draw);
   glutKeyboardFunc(keyboard);
   glutSpecialFunc(skeyboard);
   glutMouseFunc(mouse);

   glutMainLoop();

   return 0;
}

Argumentum ad ignorantiam, cahiliye-safsatası olarak türkçeye çevrilebilir. Bilgi eksikliğiyle oluşturulan veya bilgi eksikliğinin kullanıldığı safsata argumanlardır. Bilgi eksikliği olarak daha çok “kanıtlayıcı bilgi” eksikliği kullanılır. (Bunlara “ispatlama mecburiyeti safsatası” da diyebiliriz)

Dikkat etmeliyiz ki, bir şey

  • Doğru
  • Yanlış
  • Doğruluğu ve yanlışlığı bilinmiyor
  • Doğruluğu ve yanlışlığı bilinemez
olur.

Örnekler

Ben Adem'den üstünüm çünkü ben ateşten o topraktan yaratıldı. (Ateşin topraktan üstünlüğü bilinmeyen birşeydir.)

Tanrının yokluğu kimse tarafından ispatlanamamıştır. Öyleyse tanrı vardır.

Tanrının olmadığını ispat edemezsin, o zaman yoktur diyemezsin. (Bu argüman doğrudur. [Fakat karşıdaki “vardır da diyemezsin” diye cevap verme hakkına sahiptir] Üstteki ile farkına dikkat edin)

Ben bilmiyorum, öyleyse yoktur.

UFO’ların olamayacakları ispat edilemediğine göre, UFO’lar mevcuttur.

Sen zeki misin? O zaman ispatla . İspatlayamadığına göre zeki değilsin.