Forum: SDL RSS
Ayın evreleri benzetimini (animation) nasıl yapabilirim?
Lunar Phase Animation
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Ayın evreleri benzetimini (animation) nasıl yapabilirim?
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; // <-- 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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 3 defa değişti; son değiştiren: Salih Dinçer; zaman: 2012-09-07, 12:10.
Değişiklik nedeni: Başlık düzenlendi...
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ö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
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli on 2012-09-07, 10:51:
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ı:
[Resim: 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...:)
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-09, 07:45.
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-04-26, 12:37:42 (UTC -07:00)