Forum: SDL RSS
Kutu Arama Algoritması
Sayfa:  önceki  1  2 
acehreli (Moderatör) #16
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 8119
Programda tabii ki hata olabilir ama yine de sorun yok. :) İki durum çok farklı sayılır.

iki_numara == 0 durumu:

1) Nokta(0, 15)'teki dörtgeni kaldırmak istiyorsun; ama olmuyor çünkü orada 2 var onun üstünde de 3 var.

2) Nokta(1, 10)'daki dörtgeni kaldırmak istiyorsun; oluyor ve 3 gidiyor.

3) Nokta(0, 15)'teki dörtgeni kaldırmak istiyorsun; orada 2 var ve üstü boş; gidiyor.


iki_numara == 1 durumu:

1) Nokta(1, 15)'teki dörtgeni kaldırmak istiyorsun; orada 3 var; gidiyor. (Bence zaten fark tam da burada: 2 numarayı kaydırıyorsun ama deneyini de değiştirmiş oluyorsun. Bu deneyde 2'nin köşesi dediğin yerde bambaşka bir dörtgen var. O gidince bütün olay değişiyor. Örneğin, bir sonraki adım zaten bu yüzden başarısız oluyor.)

2) Nokta(1, 10)'daki dörtgeni kaldırmak istiyorsun; orada dörtgen yok çünkü 3 bir önce silindi.

3) Nokta(1, 15)'daki dörtgeni kaldırmak istiyorsun; oraada 2 var; üstü boş; gidiyor.

Ali
Avatar
Salih Dinçer #17
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ama 3 numaralı kutu 1, 10 (on)'da o yüzden 1, 15 (onbeş) verdiğimizde bunun kalkması doğru mu?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #18
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben seni başından beri yanlış anlamışım galiba çünkü evet, 1,15 verildiğinde de 3 numaralı dörtgen kalkmalı çünkü o nokta seçildiğinde de 3 numaralı dörtgen var.

Sen ise dörtgenler yalnızca sol üst köşeleriyle belirlensinler istemişsin. Benim programın senin istediğinle bir ilgisi yok. :) Benimki "şu noktaya tıkladığımda rastladığım dörtgeni üstünde başka dörtgen yoksa kaldır" mantığına yardım ediyor. Pardon...  :blush:

Ali
Avatar
Salih Dinçer #19
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Estağfurullah hocam yazı olayı böyle...:)

Ancak şaka maka Nokta ve Kağıt yapıları bayağı gelişti. Ben derslerden beri hatırlarım, bununla çok örnek çözülüyor. Acaba diyorum; bu yapıları bir sınıf altında toplayıp "universal" bir hale getirsek mi? Çünkü çıktı yönünü değiştirip, bir dosya hatta grafik ekranı bile yapabiliriz. Düşünsene nokta basacağına setpixel() işlevini çağıracak.

Hoş bir kaç ay evvel kutuyu kapat oyununda da benzer bir şey denemiştin ya da ben şununla karıştırıyorum: Ekran dışına taşan ve ok yönleri ile kağıt üzerinde gezen başka bir uygulaman vardı. Evet, evet karıştırıyor olmalıyım ne alaka kutu!

Kutular ile kafayı bozdum...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #20
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Oldu! Biraz kafayı bozmak gerekiyormuş...:)

Olayı eşleştirme ile hallettim. Yani tıklanan kutunun o an ki görüntüsünü ekrandan kesip kendisi ile XOR'ladım. Şu işlev şimdilik işimi görüyor:

bool eşMi(SDL_Surface * a, SDL_Surface * b) {
  bool AYNI = true;
  size_t SINIR = a.w * a.h;
  
  while(SINIR+1) {
      if((cast(uint*)a.pixels)[SINIR] ^ 
         (cast(uint*)b.pixels)[SINIR]) {
        AYNI = false;
        break;
      }
      SINIR--;
  }
  return AYNI;
}

[Resim: http://imageshack.us/a/img90/3861/kutular.gif]

Gerçi bazen tıklama güçlüğü hissediyorum. Herhalde keyEvent() ile mouseEvent() arasında bir anlaşmazlık var. Onu sdlmini'yi geliştirdiğim zaman çözebileceğimi zannediyorum. Üstteki ekran görüntüsü ve işlev ise aşağıdaki do while döngüsünde dönmekte. Meğer olay bu kadar basitmiş ama ne kadar sistem kaynağı harcıyor bilmiyorum... :rolleyes:
      int mX, mY;
      do {
        SDL_Clear();
        foreach(kutu; kutular) kutu.exec(scr);
        
        if(!mouseEvent(mX, mY)) {
          int sil = int.max;
          foreach(kutu; kutular) with(kutu.rect) if(
                ( ( x <= mX ) && ( y <= mY ) ) &&
                ( (x+w >= mX) && (y+h >= mY) )     ) {
             sil = kutu.id;
            kutu.id.write("\t");
          } else sil = int.max;
          
          if(sil != int.max) { 
            if(eşMi(crop(kutular[sil].rect), kutular[sil].copy)) { 
              kutular[sil].clear;
              kutular = kutular[0..sil] ~ kutular[sil+1..$];
            }
          }
          writeln(mX, "/", mY);
        }
      } while(escEvent(1)); // ESC için bekle ve çık... 
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #21
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
En baştan sormam gerekeni şimdi sorayım: Amaç ne? :D Beni en çok yanıltan ilk mesajdaki "Tıpkı Mahjong oyunu gibi üstteki taşlar daha öncelikli" sözü oldu. O yüzden "üstünde başka dörtgen olmayan serbestçe kaldırılabilir" olayına takıldım.

Hatta o yüzden de senin "kutu" sözünü bile hep "dörtgen" diye algıladım. Ama sen kapaklı kutulardan bahsediyormuşsun. Öyle mi?

Ali
Avatar
Salih Dinçer #22
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kabül etmem gerekir ki kutu aldatıcı bir ifade ve tahmin ettiğin gibi dörtgen daha doğru. Ancak kapaklı olan ve açılan bir kutu yok. Özetle bir yanlış anlaşılma da yok...:)

Aslında yukarıdaki hareketli resim (animation) durumu daha iyi özetliyor. Bir resim bin söze bedelmiş ya, yine de bir kaç söz ile ifade edeyim. Dikkat ederseniz, ilk bir kaç tıklamada kutularda bir değişiklik olmuyor. Değişikliğin tek olduğu yer var o da ekranın diğer yarısı. Sahne yüksekliğini bilinçli olarak iki kat yaptım, böylece karşılaştırılan (eşleştirilen) bölgeyi görebiliyoruz.

Biri dışında, sonraki tıklamalarda ekranın diğer yarısına yansıtılan görüntünün tek dörtgen oluştuğu dikkatinizi çekti mi?

İşte, doğru sırayla tıklanırsa eşleştirilen bölge içeriği kutu ile aynı oluyor ve biz kutuyu siliyoruz...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #23
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Unutmadan amaç şu:

Sahneye farklı boyutlarda resimleri almak ve bunları tutup başka yere çekmek, gerektiğinde çift tıklama ile silmek. İşte bunu yapabilmek için önce ekrandaki nesneleri tek tıklama ile ayırt etmeliydim. O yüzden en basiti olan sahneden silinme olayını seçtim. Şimdi sırada nesnenin koordinatları (X = mX ve Y = mY) mouse ile eşitlenecek.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #24
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Düşünüyorum da bu yöntem içeriği değişebilen pencereler için uygun değil. Örneğin bir vidyo veya IMKB'nin gerçek zamanlı çizitlerinde işler karışabilir. Gerçi tıklama anından hemen önce nesne bir şekilde güncellenebilir ama bu yöntem kısır, basit...

Başka şeyler düşünüyorum ama çözebilecek kadar akıllı olduğumu söyleyemem...:)

Bir de şu var:
İstediğimiz pencereye (kutu, dörtgen vb.) tıkladığımızda bu öne gelebilir!

Neden olmasın! Bu bizim işletim sistemlerinde alışık olduğumu bir şey değil mi? Üstelik bu çok basit çünkü en üstteki ile seçilen seviyeyi yer değiştirebiliriz. Ama bu tek başına iki değerin swap() olması gibi olmamalı. Yani en üste getirilen pencerenin yerine gitmemeli, seçilenin hemen altında olmalı. Eşleşme tabloları ile çözmeye çalışalım...
import std.stdio;
 
void swap(ref string a, ref string b) {
    string t = a;
    a = b; b = t;
}
 
void main() {
    string[int] pencereler = [ 5: "uyarı",
                               4: "belgeler",
                               3: "tarayıcı",
                               2: "notlar",
                               1: "takvim",
                               0: "oynatıcı" ];
    pencereler.writeln;
 
    int üstteki = pencereler.length - 1;
    int seçilen = uniform(0, üstteki);
 
    foreach(n; seçilen..üstteki) {
        pencereler[n].swap(pencereler[n+1]);
    } 
    pencereler.writeln;
}
Sanırım buna kaydırmalı yer değiştirme diyebiliriz. Sizce bu iyi bir çözüm olabilir mi?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #25
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
içeriği değişebilen pencereler için uygun değil

Aynı sorun benim bildiğim bütün görsel arayüzlerde de var. Tam bir düğmeye tıklamak üzereyken ilgisiz başka bir pencere açılabiliyor ve farkında olmadan onun düğmelerinden birisine tıklanabiliyor.

void swap(ref string a, ref string b) {

std.algorithm.swap da var:

  http://dlang.org/phobos/std_algorithm.html#swap

iyi bir çözüm olabilir mi?

Bana mantıklı geldi.

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:
Sayfa:  önceki  1  2 
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-03-29, 06:07:36 (UTC -07:00)