Thread overview
Ayın evreleri benzetimini (animation) nasıl yapabilirim?
Sep 06, 2012
Salih Dinçer
Sep 09, 2012
Salih Dinçer
September 06, 2012

Merhaba,

Bir sürü deneme yaptım ama tam olarak beceremiyorum. İlk aklıma gelen, bayrak çiziminde olduğu gibi, içi dolu iki çemberi (circle) sahneye almak ve beyaz olanını sabit tutup diğerinin x/y değeri ile çapını büyütmek. Sizce başka yöntem var mı?

Aslında üç noktalı eğriyi (curve) de denedim olmadı. Sanki onunla tüm evreleri tıpkı bir gitar telinin sağa sola yaylanması gibi yapabileceğimi zannediyorum. Ama kesme (cutting) işlemi düşündürdüğü gibi elimdeki Bézier Curve algoritması iyi çalışmıyor. Örneğin a noktası kuzey, b noktası güneye bakıyorsa eğer eğri açısını veren nokta sağındaysa (diyelim ki!) çalışıyor ama soluna geçtiğinde çalışmıyor. O yüzde a ile b yer değiştirmek ya da döndürülmek zorunda kalıyorum. Çok kafa yediritdiği için bu yöntemden uzaklaşmak zorunda kaldım...:(

Şu küçük bir deneme kodu belki başlangıç için yararlı olabilir:

''**import **'sdlmini (https://raw.github.com/salihdb/SDLbindings/master/sdlmini.d); // <-- ilinti yoksa tıkla ve çek'

enum { delay = 1000,
      width = 50
    }
void main() {
 int xy = width, r = width-10;
 int xSay; // animation frame

 with( new draw(600, 600, "Hilal v0.1") ){
   do {
     setBackground(clr.black);
     yuvarlak (width, width, width-10);
     //xy++; /*
     switch(xSay) {
       case 0: xy++; break;
       case 1: r+=1; xy+=1; break;
       case 2: r+=2; xy+=1; break;
       case 3: r+=3; xy+=1; break;
       case 4: r+=4; xy+=1; break;
       case 5: r+=5; xy+=-1; break;
       case 6: r+=6; xy+=-1; break;
       case 7: r+=7; xy+=-1; break;
       case 8: r+=8; xy+=-1; break;
       case 9: r+=9; xy+=-1; break;
       default: r+=10; xy+=-2;
     }
     xSay++; //* Deneme 3 */

     yuvarlak (xy, xy, r, clr.black);
     SDL_Flip (scr);
     SDL_Delay (delay);
    } while( keyEvent(1) );
 }
 SDL_Quit();
}

Teşekkürler...

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

September 07, 2012

Öncelikle, evreleri olacak herhalde... ;)

Üst üste iki yuvarlak bana da mantıklı geliyor. Ama şunu görebiliyorum: Ay tamamen karanlık olduğunda karanlık yuvarlak ile beyaz yuvarlağın merkezleri ve çapları aynı. Ay hilalden yarım aya doğru ilerlerken karanlık yuvarlağın merkezi sağa doğru kayıyor ve çapı büyüyor. Tam yarım ay olduğunda merkez sonsuzda ve çap sonsuz.

Merkezin kaydırılma hızı ve çapın büyütülmesi herhalde trigonometrik bir fonksiyonladır ama hiçbir fikrim yok. :)

Ali

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

September 09, 2012

Alıntı (acehreli:1347040264):

>

Tam yarım ay olduğunda merkez sonsuzda ve çap sonsuz.
Evet hocam, işte bu nedenden dolayı mantıklı görülmüyordu. Çünkü kesme görevinde olan yuvarlak, 3000x3000 beneklik bir pencere alanına ihtiyaç duyuyor. Bu da o sırada, ekranı gizleseniz (pencere ekrana gelmeden evvel işlem yapmak ve bittiğinde normal ekran boyutlarında açmak) bile yavaşlığa sebep olacak. Bende korkarak şu 'curve()' işlevine el attım. Ama yeni evlenmiş gelin gibi çok hassas kendisi...:)

Şöyle bir şey (4-5 XOR'lama ile!) yapabiliyorum, şimdi de x/y cambazlığına* sıra geldi...

import sdlmini;

void main() {
 int delay = 2000;
 clr rengi = clr.red;

 with( new draw(400, 400, "Çokgen Boya v0.0.1", clr.black) ) {
   enum curveParameter : int {
     a = 10,  /* w Offset (iki yandan en) */
              /* elleme */ b = 400/2, c  = 400-a, ç = 200, d = 400,
     e = -10  /* h Offset (üst ve alttan boy) */
   }
   do {
     yuvarlak((w-100)/2, 50, 50, clr.white);

     with (curveParameter) {
       curve(a, b, ç, e, c, b+1, rengi);
       curve(a, b, ç, e, c+1, b-1, rengi);

       curve(a, b, ç, d-e, c+1, b+1, rengi);
       curve(a, b, ç, d-e, c, b-1, rengi);
     }
     SDL_Flip(scr); SDL_Delay(delay);
     fillPolygon(rengi);
     SDL_Flip(scr); SDL_Delay(delay);
     invertColor(1, false, rengi);
   } while( keyEvent(0) );
 }
}

Çıktısı:
http://img823.imageshack.us/img823/8403/curvelunarcut.gif

(*) Sanırım sdlmini.d'ye 'ufaltKes()' işlevini de eklemeliyim. Kullandıkça ihtiyaç duyulan şeyler artıyor ve minilikten çıkıyor gibi...:)

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