Forum: SDL RSS
Benek (pixel) Dünyasına Yolculuk
SDL Denemeleri
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Benek (pixel) Dünyasına Yolculuk
Merhaba,

Bir süredir SDL üzerine deneme yapmıyordum. Son günlerde benekleri (pixel) anlamak için denemeleri yoğunlaştırdım. Hala çözemediğim şeyler yanında ilginç gördüklerimi paylaşmak istiyorum. Deneyebilmeniz için de her şey en basite indirdim. İhtiyacınız olan SDL kütüphanesi/D ilintileri yanında aşağıdaki main() işlevi:
void main() {
  //with(new draw(256, 312)) {  /* sınıf ile yapılan kolaylık, yakında...
  SDL_Surface* scr = SDL_SetVideoMode(256, 312, 0, SDL_HWSURFACE); 
  bool DEVAM = true;
  while(DEVAM) {
 
    // ... sahnede gösterilecek nesneler ...
 
    SDL_Flip (scr);
    //DEVAM = waitAndExit();  /*<--- ilk ESC'de dur, ikincisinde çık
    SDL_Event event;
    SDL_PollEvent (&event);
    if(event.type           == SDL_KEYDOWN &&
       event.key.keysym.sym == SDLK_ESCAPE) DEVAM = false;//*/
  }//} // with()
  SDL_Quit();
}
Garip Sistem:
[Resim: http://img9.imageshack.us/img9/6392/garipsistem.png]

Hayır, bu bir dikdörtgen kafa değil...:)

Burada beneklerin rengini sürekli değiştirerek nasıl bir sonuç elde edeceğimi görmek istedim. Süreklilikten kasıt; damlaya damlaya göl olur hesabı, siyah ile beyaz arası meydana gelen sürekli bir değişim demek. Bunu da setPixel() amacıyla kullandığımız işlevin son satırındaki eşitliğe + ekleyerek yaptım: *benek += c;

Dikkat ederseniz, ekran görüntüsündeki alta kalan içi dolu daire desenli. Çünkü algoritmanın özelliğinden dolayı küçülen çemberlerden üst üste oluşurken boş benekler meydana geliyor. İşle bu boşluklar, sahnenin başlangıcında bulut veya plasma görünümünde bir oluşum meydana getiriyor. Elbette bunu yapmanın daha güzel ve kolay yolları var...:)

Eğer aşağıdaki kodda yer alan gizlenmiş iki küçük bölgeyi de derlemeye dahil ederseniz (bunu yapmak içik tek bir taksim işareti yetiyor) paylaştığım ekran görüntüsüne benzer bir görüntü elde ediyorsunuz. Sanki bu bir gaz/toz bulutu ve kütle çekim etkisiyle iki yıldızlık bir sistem oluşuyor. Renkleri yeşil/sarı...

  void circleRGB(int c_x, int c_y, int r, int c = 0xFF0000) {
    void renkArttır(int x, int y, int c = int.max) {
      uint *benek = cast(uint*)scr.pixels  + y *
                               scr.pitch/4 + x;
           *benek += c;
    }
    int y, x = -r;
    int yeniÇap = 2 - 2 * r;
 
    while(x < 0) {
      r = yeniÇap;
      renkArttır(c_x + y, c_y + x, c)// sağ üst çeyrek yayı
      renkArttır(c_x - x, c_y + y, c)// sağ alt çeyrek yayı
      renkArttır(c_x - y, c_y - x, c)// sol alt çeyrek yayı
      renkArttır(c_x + x, c_y - y, c)// sol üst çeyrek yayı
      if(r <= y) yeniÇap += ++y * 2 + 1;
      if(r >  x) yeniÇap += ++x * 2 + 1;
    }
  }
  void garipSistem(int x = 0, int y = 0) { 
  //* ZEMİNDEKİ İÇ İÇE OLUŞAN BÖLGE (ekranın yarısı kadar...)
    x = uniform(32, scr.w-32);
    y = uniform(32, scr.h-188);
    foreach(r; 1..32) circleRGB(x, y, r, 1);//*/
 
  /* SOLDAKİ ÇOK KÜÇÜK BÖLGE (neredeyse daire kadar!)
    x = uniform(32, scr.w-160);
    y = uniform(64, scr.h-220);
    foreach(r; 1..32) circleRGB(x, y, r, 1);//*/
 
  /* SAĞDAKİ ÇOK KÜÇÜK BÖLGE (neredeyse daire kadar!)
    x = uniform(160, scr.w-32);
    y = uniform(64, scr.h-220);
    foreach(r; 1..32) circleRGB(x, y, r, 1);//*/ 
  }
Sahnedeki nesneler:
    // desenin bir kopyasını göster
    foreach(r; 1..32) circleRGB(scr.w/2, scr.h-64, r);
    garipSistem(); // ekşın...:) 
-DEVAMI GELECEK-
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-09-04, 12:50.
Değişiklik nedeni: İlerisi için kod güncellendi...
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salihcim derlemeye çalıştım ama hata verdi. SDL2 mi kullanmıştın acaba..

Kodun tamamını yazabilirmisin ya da gist olarak atabilirmisin.
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İyi geceler Erdem,

Kullandığım iki SDL ilinitisini (diğer sdlmini) denedim "undefined identifier uniform" hatası dışında bir hata almadım. Onun da çözümü belli zaten. Ama son denediğim kodu şuraya yaptıştırdım: http://codepad.org/4radDNpD

Bu arada ilk satıra iki tane taksim koyup satırı gizlemelisiniz. Çünkü sizde sdlmini olmayabilir. Bu sdl.d ilintisinin 100 satıra indirgenmiş hali. Yoksa sdlmini'de çalışan diğerinde de çalışır.

Dip Not: SDL2 için bir kaç modül hazırlamıştım. Şimdi SDL için basit bir modül hazırlıyorum ve bunu sdlmini ilintisi ile birleştiriyorum. Yakında yayınlayacağım ama aklımadan bir şey geçiyor. Kütüphanenin sürüm numarasına göre iki türlü derleme yani tek ilinti yazabiliriz. Böylece ileride yaşanacak sürüm farklılıkları sorununu aşabiliriz.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi deneyebildim. İlk seferinde bir hata yapmışım galiba..

Örneği çok beğendim. Eline sağlık  :-)
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Erdem,

Bugün bayrağımızı çizdim!

[Resim: http://img853.imageshack.us/img853/228/bayrakm.png]

Nasıl, nizami olmuş mu? Gerçi iki beneklik hata var ama bu kadarı bile iyi sayılır! Çünkü sadece 3 daire ve 5 beşgen ile çizilebilmesi mümkünmüş! Kodları ise şöyle:
import sdlmini;
// dmd bayrak sdlmini -L-lSDL -release
 
void main() {
  with( new draw(300, 200, "Ne mutlu Türküm diyene!", clr.red) ) {
    do {
      yuvarlak (70, 40, 60);          // dolunay
      yuvarlak (95, 51, 49, clr.red); // hilal kesmesi
      yuvarlak (167, 67, 33);         // yıldız zemini
      foreach(kay; 0..23) {           // dıştan yıldız kesmeleri
        polygon (173-kay,  81, 19, 5, clr.red); // sağ üstü
        polygon (173-kay, 119, 19, 5, clr.red); // sol üstü
        polygon (208, 130+kay, 20, 5, clr.red); // sol altı
        polygon (20868-kay, 20, 5, clr.red); // sağ altı
        polygon (232+kay,  99, 20, 5, clr.red); // alt orta
      }
      setPixel(225, 119, clr.red); // fix points...
      setPixel(225, 120, clr.red); // O kadarı kadı kızında da olur...)
      /* Ordinat Ekseni
      line(0, h/2, w, h/2, clr.green);
      line(w/2, 0, w/2, h, clr.green);//*/
      SDL_Delay (99);
      SDL_Flip (scr);
    } while(keyEvent(2)); // 2: Double ESC
  }
  SDL_Quit();
}
Aslında sdlmini.d'nin son halini yakında GitHub'a yükleyeceğim ama kullandığım işlevleri aşağıya nakledeyim. Sanırım şuradaki curve() işlevinde bir kaç düzeltme (son satırındaki çizgi!) yapmak gerekiyor. Ayrıca şu polygon() işlevinde de (açı kavramı gibi) bir kaç bir şey gerekebilir.

  void polygon(double x, double y, double r, int sides, int c=int.max) {
    double edge = PI*2 / sides; 
    int x0, y0;
    for(int i = 0; i <= sides; i++) {
      int x1 = cast(int)(x - cos(edge * i) * r);
      int y1 = cast(int)(y - sin(edge * i) * r2);
      if(i) line(x0, y0, x1, y1, c);
      x0 = x1; y0 = y1;
    }
  }
  void yuvarlak(int x, int y, int r, int c = int.max) {
    int len, ofs;
    for(int i = 0; i < 2 * r; i++) {
      len = cast(int)sqrt(cast(float)(r ^^ 2 - (r - i) ^^ 2));
      ofs = (y + i) * (scr.pitch / 4) + r - len + x;
      len*=2;
      for(int j = 0; j < len; j++) {
        (cast(uint*) scr.pixels)[ofs + j] = c;
      }
    }
  }
Ne mutlu Türküm diyene!
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bayrağın oranları iyi görünüyor ama ilk bakışta yıldız gözüme büyük göründü. Bildiğim kadarıyla tam ölçüleri var.

Hiç bilmeden soruyorum: Yıldız kağıda elle çizdiğimiz gibi çizilemiyor herhalde, değil mi? O zaman içinin boyanması mı bozuk oluyor. Peki tek poligon olarak denedin mi?

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hakkaten büyükmüş...:)

Şimdi, şuradaki ölçülere göre nizami yaptım. Gerçi beşgenleri çerçeve ölçülerine oranlamak imkansız gibi. Yani pencere boyutunu değiştirince kayan nokta hesabından dolayı yıldızda küçük bozulmalar oluyor. O yüzden bayrak boyutunda yıldızı başka yerde oluşturup üçüncü yuvarlağın (yıldız zemini) ortasına yapıştırılabilir, bu mümkün...

[Resim: http://img3.imageshack.us/img3/8484/bayrakt.png]

"acehreli":
Yıldız kağıda elle çizdiğimiz gibi çizilemiyor herhalde, değil mi? O zaman içinin boyanması mı bozuk oluyor. Peki tek poligon olarak denedin mi?
Hayır, yıldızı kağıt üzerindeki gibi çizmiyorum. Ortaya bir yuvarlağın çevresinde 5 adet beşgen oluyor. En son beşgenlerin boyutlarını bir (eşit) yaptım ve tek benek dışında düzeltmem gereken yer olmadı. Tabi bir de döngü ile (neyse ki en son 16'ya indi) beşgenleri dışarı doğru kaydırarak fazladan beyaz noktaları siliyorum. Elbette başka güzel yöntemler vardır. Bu ilk aklıma gelendi. Benzer şekilde istediğiniz platforma taşıyabilmeniz için, yıldız hariç oranlar şöyle:
yuvarlak (h/4  , h/4, h/4);          // dolunay
yuvarlak (w/4-1, w/5, h/5, clr.red); // hilal kesmesi
line(0, h/2, h/2, h/2, clr.green);   // hilal merkezi h/2 kadar uzakta...
line(h/2, 0, h/2, h, clr.green);
 
int mrk = w/25+h/2; 
 
line(mrk+1,   0, mrk+1,   h, clr.green);
line(h/2+1, h/2, mrk+1, h/2, clr.green);
 
yuvarlak (w/4+h/3, w/4, h/8);        // yıldız zemini 
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Az önce çok güzel bir animasyon denedim...
Buradaki dersler şahane: http://sol.gfxile.net/gp/ch02.html

[Resim: http://sol.gfxile.net/gp/pitch.gif]

Belki resimden çok bir şey anlaşılmıyor, o yüzden mutlaka denemelisiniz. Kodu aşağıya naklettim ama sdlmini'de SDLGetTicks() işlevi eksik, dönüş değeri uint olan bu işlev elinizdeki ilintide bulunması gerekiyor. Yoksa eklemeyi unutmayın...
import sdlmini;
 
void main(){
  enum { width = 800, height = 400 };
  with( new draw(width, height, "Hipnoz Kuşağı") ){
    do {
      int ofs, yofs, i, j, t = SDL_GetTicks();
      for(i = 0; i < height; i++) {
        for(j = 0, ofs = yofs; j < width; j++, ofs++) {
          (cast(uint*)scr.pixels)[ofs] = i*i + j*j + t*10;
        }
        yofs += scr.pitch / 4;
      }
      // Tell SDL to update the whole screen
      SDL_UpdateRect(scr, 0, 0, width, height);    
   } while( keyEvent(2) );
  }
}
Ayrıca kodu biraz değiştirdim ve özelikle hızlı olması için t'nin 10 katını aldım. Adresini verdiğim sayfada orijinal kodu bulabilirsiniz. Orada kilitleme yapılmış ama benim sistemde gerek olmadı. Bu kilitleme olayının hangi durumlarda şart olduğundan da emin değilim. Mutlaka iyi bir şeydir...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Elbette bunlar bir Macromedia/Flash Animation'ı kadar değil ve çağ dışı olsa da küçük bir gelişme işte. Boyama olarak taramalı basit bir yağmur tekniğini kullandım. Göz kapakları ise curve() işlevi 4 defa çağrılarak yapıldı...

[Resim: http://img801.imageshack.us/img801/4008/fbeye.gif]
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
Salih Dinçer:
Buradaki dersler şahane: http://sol.gfxile.net/gp/ch02.html

Belki resimden çok bir şey anlaşılmıyor, o yüzden mutlaka denemelisiniz.

İlginçmiş gerçekten de. Bağlantı için teşekkürler :)

Salih Dinçer on 2012-09-05, 03:23:
Nasıl, nizami olmuş mu? Gerçi iki beneklik hata var ama bu kadarı bile iyi sayılır!

Bu bayrak da süper olmuş. Eline sağlık !
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-09-08, 11:13.
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Maalesef bayrak o kadar nizami değil, hatta şurada ki son hali bile...

İlginçtir, bir şeyi bilinçli yapmak istediğinizde epey uğraştırıyor ve son derece kontrollü olmanız gerekiyor. Bu belki entropinin bir gereği rasgele şeyler ise inanılmaz kolay oluyor. Örneğin şu kağıt uçak istemeden oldu:

[Resim: http://img820.imageshack.us/img820/6248/kattanuak.gif]
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
şu kağıt uçak istemeden oldu

Bu bir işaret! Hemen pilotluk kurslarına başla. :-p

Ali
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İnsanoğlu bunu hep yapıyor, değil mi hocam?

Örneğin çimlere uzanıp bulutlara bakarak o pamuk gibi şekilleri bir çok şeye benzetiyorlar. Bu şey insan psikolojisinde de varmış, yatkınmışız. Özellikle duman, bulut, ışık oyunu ve ateş gibi şeylere karşı hayal gücümüz çok kuvvetli.

En bariz örneği belki de yaşadığın memleketteki 11 Eylül saldırısı olsa gerek. O acı olayda (bizden de kayıp oldu!) hayatını kaybedenleri bir tarafa bırakıp meydana gelen patlama, duman benzeri şeyleri şeytana benzetmişler. Gazeteleri okuduğumda itfaiyeciden, psikoloğuna kadar yorumlar görmüştüm. Bilimsel açıdan değerlendirdiklerinde bunlar yatkın olduğumuzu yazmışlardı. Ha keza Rorschach testi bunun en bilimsel örneği...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, dumanların arasındaki o yüzü hatırlıyorum. Bir de bulutlarda Atatürk'ün başının belirdiği fotoğraf vardır.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: SDL RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-07-22, 09:40:53 (UTC -07:00)