Jump to page: 1 2
Thread overview
Benek (pixel) Dünyasına Yolculuk
Sep 04, 2012
Salih Dinçer
Sep 04, 2012
erdem
Sep 04, 2012
Salih Dinçer
Sep 04, 2012
erdem
Sep 05, 2012
Salih Dinçer
Sep 05, 2012
Salih Dinçer
Sep 07, 2012
Salih Dinçer
Sep 08, 2012
Salih Dinçer
Sep 08, 2012
erdem
Sep 08, 2012
Salih Dinçer
Sep 08, 2012
Salih Dinçer
September 04, 2012

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/ (http://www.libsdl.org/)D ilintileri (http://codepad.org/F6LfnqTy) 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:
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ı...

Alıntı:

>
>   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-

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
September 04, 2012

Salihcim derlemeye çalıştım ama hata verdi. SDL2 mi kullanmıştın acaba..

Kodun tamamını yazabilirmisin ya da gist (https://gist.github.com) olarak atabilirmisin.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 04, 2012

İ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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 04, 2012

Şimdi deneyebildim. İlk seferinde bir hata yapmışım galiba..

Örneği çok beğendim. Eline sağlık :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 05, 2012

Teşekkürler Erdem,

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

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 (208,  68-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 (https://github.com/salihdb)'a yükleyeceğim ama kullandığım işlevleri aşağıya nakledeyim. Sanırım şuradaki curve() (http://free.pages.at/easyfilter/bresenham.html) işlevinde bir kaç düzeltme (son satırındaki çizgi!) yapmak gerekiyor. Ayrıca şu polygon() (http://www.webkinesia.com/games/sdl-turtle.php) işlevinde de (açı kavramı gibi) bir kaç bir şey gerekebilir.

Alıntı:

>
>   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!

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
September 05, 2012

Hakkaten büyükmüş...:)

Şimdi, şuradaki ölçüler (http://www.haylazblog.com/wp-content/uploads/2012/04/33m2am8.png)e 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...

http://img3.imageshack.us/img3/8484/bayrakt.png

Alıntı ("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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 05, 2012

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 07, 2012

Az önce çok güzel bir animasyon denedim...
Buradaki dersler şahane: http://sol.gfxile.net/gp/ch02.html

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...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 08, 2012

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ı...

http://img801.imageshack.us/img801/4008/fbeye.gif

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 08, 2012

Alıntı (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 :)

Alıntı (Salih Dinçer:1346840594):

>

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2