Jump to page: 1 2 3
Thread overview
Kutu Arama Algoritması
Oct 20, 2012
Salih Dinçer
Oct 20, 2012
Salih Dinçer
Oct 20, 2012
mert
Oct 20, 2012
Salih Dinçer
Oct 20, 2012
mert
Oct 21, 2012
Salih Dinçer
Oct 21, 2012
Salih Dinçer
Oct 21, 2012
Salih Dinçer
Oct 24, 2012
Salih Dinçer
Oct 24, 2012
Salih Dinçer
Oct 24, 2012
Salih Dinçer
Oct 25, 2012
Salih Dinçer
Oct 25, 2012
Salih Dinçer
Oct 25, 2012
Salih Dinçer
Oct 25, 2012
Salih Dinçer
Oct 25, 2012
Salih Dinçer
Oct 28, 2012
Salih Dinçer
October 20, 2012

Merhaba,

Ekranda rasgele yerleştirilmiş renkli kutular var. Bunların hepsi de mouse hareketlerine duyarlı. Tıpkı Mahjong oyunu gibi üstteki taşlar daha öncelikli. Yani altta kalan bir kutunun tamamı başka kutular tarafından kapanıyorsa bunun üzerine tıklayarak kapatmanız mümkün değil. Belli bir sırayı takip etmelisiniz.

Şimdi bu konuda en iyi arama algoritmasını geliştirmeye çalışıyorum. Her ne kadar konuyu SDL'de açmış olsam da işin kuramsal kısmı diziler, hızlı sıralama algoritması gibi şeyler...:)

Sizce nereden başlamalı ve nasıl devam etmeli?

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

October 20, 2012

Eklemeliyim; ihtiyacımız olabilecek ve/veya başlangıçta sahip olduğumuz veriler şöyle:

  • Mouse tıklama anındaki m(X, Y) bilgisi (m->mouse demek)
  • Ekrandaki kutuların sayısı
  • Her bir kutunun b(X, Y) ve W, H verisi (b-> box demek)
  • Kutuların ekranda oluşturma sırası L(evel)

Aklıma hızı arttırmak için ilk olarak şöyle bir süzgeç(filter) adımı geldi:

  • Tıklanan m(X, Y) noktasından büyük b(X, Y)'lerin hepsini yok farzetmek;
  • Aynı şekilde koorinat ekseninin 2 ve 3 bölgesinde olan ama b(X, Y) ile b(X+W, Y+H) arasında kalmayanları süzüp,
  • Son olarak en üstte olan kutudan başlamak suretiyle (dizi reverse edilebilir) tek tek uygun olanla eşleştirmek...

veee nihayetinde o kutuyu oluşturan nesneyi silip sahneyi yenilemek...:)

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

October 20, 2012

Alıntı:

>

Mouse tıklama anındaki m(X, Y) bilgisi (m->mouse demek)
Her bir kutunun b(X, Y) ve W, H verisi (b-> box demek)

mouse fare demek olsa box demek de kutu olsa (yazıldığı gibi kısaltmalar değil ama.) Mahjong oynamadığım halde hiç nasıl çözümleneceğini izleyebilirdim sanki.

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

October 20, 2012

Şuradaki klasik sürümü güzeldir: http://cdn.gamepilot.com/data/1/6/1/16144.swf

Tavsiye ederim...:)

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

October 20, 2012

Hoşmuş. Teşekkür ederim Salih.

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

October 21, 2012

Merhaba,

Biraz kafam karıştı ben de olayı görselleştireyim istedim. Zaten algoritma görsel programlama da kullanılacak. Ancak zorlandığımı itiraf etmeliyim! Ortadaki ekran görüntüsünde şu kutular yer almakta:
Alıntı:

>

' # x y w h
1 - [ 155, 200, 150, 150 ]
2 - [ 205, 255, 200, 150 ]
3 - [ 240, 345, 175, 190 ]
4 - [ 65, 30, 200, 200 ]
5 - [ 120, 5, 125, 190 ]'
'http://imageshack.us/scaled/thumb/546/kutular.png (http://imageshack.us/photo/my-images/546/kutular.png/)'

Buna göre ilk olarak 5. kutu (sonra 4) üzerine tıklanıyor. Bizim algıladığımız biçimde, bir altına ulaşabilmek için en üstte olanı kapamak gerekiyor. Tabi henüz algoritma bunu anlamıyor...:)

Her türlü fikire açığım, teşekkürler...

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

October 21, 2012

Yanıt için çok teşekkür ederim...:)

Eniyileştirme konusuna başlangıçta çok umursamıyorum. Aksine herhangi bir algoritma benim için mihenk taşı olacağı için eniyileştirme için kılavuz anlamında işe yarayacaktır.

Nesnelerin diziye (sahne kümesine) girerken ve çıkarlarken işlem tekrarının azaltılması iyi fikir gibi görünüyor. Ancak resimde aslında iki tane tıklanabilecek resim var. Ben 5.'nin en üstte olduğunu biliyorum ama 3.'ü de en üstte aslında...:)

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

October 21, 2012

Anlıyorum, anlamaya çalışıyorum...:)

SDL'ye uyarladıktan sonra tekrar yazacağım....

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

October 21, 2012

İngilizce aramaya çalıştığımda "collision detection algorithm"a da rastladım. Belki bu konu da onunla çözülen bir problemdir. (?)

En hızlıca aklıma gelen yöntem şu: Düzlemdeki her nokta bir dilimden oluşur. Bu dilimin ilk elemanı o noktaya rastlayan nesnelerden en alttakinin numarasıdır.

Yeni şekil yerleştirildiğinde onun rastladığı bütün noktalara şeklin numarası eklenir. Sonuçta, bir noktaya tıklandığında orada hangi şeklin göründüğü o noktadaki dilimin son elemanıdır.

O noktadan yola çıkarak bu sefer şekli oluşturan bütün noktalara bakılır. Eğer hepsinin de son elemanı aynı numaraya sahipse şekil serbest demektir.

Uyarı: Aklıma ilk gelen algoritma olduğu için büyük olasılıkla en hızlı algoritma değildir. :p

Aslında belki de bir eniyileştirme görülüyor: Şekillerin serbest olup olmamaları yalnızca şekil eklenmesi ve çıkartılması olaylarına bağlı olduğundan, bunu her tıklamada hesaplamak yerine her ekleme ve çıkarmada hesaplamak daha iyi olabilir. Yani her şeklin serbest olup olmadığını belirleyen bir bilgisi tutulur. Yeni şekil yerleştirildiğinde bu bilgisi true'dur. Ortamdan şekil kaldırıldıkça onun noktalarına rastlayan diğer şekillerin artık serbest olup olmadıkları o an hesaplanabilir.

Ali

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

October 21, 2012

Alıntı (Salih Dinçer):

>

Ben 5.'nin en üstte olduğunu biliyorum ama 3.'ü de en üstte aslında...:)

Biliyorum. Bu algoritma verilen bir noktadan yola çıkıyor. O noktada en üstteki dörtgenin numarasına bakıyor. Sonra, o dörtgeni oluşturan bütün konumlardaki en üstteki nokta yine bu dörtgene aitse, dörtgen serbest (en üstte) demektir.

Şu programda uyguladım:

import std.stdio;
import std.array;
import std.string;
import std.conv;

struct Nokta
{
   size_t satır;
   size_t sütun;
}

struct Dörtgen
{
   Nokta solÜstKöşe;
   Nokta sağAltKöşe;

   int opApply(int delegate(Nokta nokta) işlem) const
   {
       int sonuç = 0;

       foreach (satır; solÜstKöşe.satır .. sağAltKöşe.satır + 1) {
           foreach (sütun; solÜstKöşe.sütun .. sağAltKöşe.sütun + 1) {
               sonuç = işlem(Nokta(satır, sütun));

               if (sonuç) {
                   return sonuç;
               }
           }
       }

       return sonuç;
   }
}

struct Kağıt
{
   alias size_t[] Konum;       // Her konum bir dörtgen numarası dilimi
   alias Konum[] Satır;        // Her satır Konum diliminden oluşuyor
   alias Satır[] Satırlar;     // Bütün düzlem

   Satırlar konumlar;          // Üç boyut: satır, sütun, ve dörtgen numaraları

   Dörtgen[size_t] dörtgenler; // Numaradan dörtgene eşleme tablosu

   this (size_t boy, size_t en)
   {
       konumlar = new Satırlar(boy, en);
   }

   void yerleştir(Dörtgen dörtgen, size_t numara)
   {
       // Her konumun en üstüne bu dörtgenin parçası gelir
       foreach (nokta; dörtgen) {
           konumlar[nokta.satır][nokta.sütun] ~= numara;
       }

       // Daha sonra numarasından dörtgen elde edebilmek için
       dörtgenler[numara] = dörtgen;
   }

   // Dörtgeni oluşturan konumların en üstünde 'numara' varsa true döndürür
   bool serbest_mi(Dörtgen dörtgen, size_t numara) const
   {
       foreach (nokta; dörtgen) {
           if (konumlar[nokta.satır][nokta.sütun].back != numara) {
               // Bu dörtgenin en üstte olmadığı bir konum bulduk
               return false;
           }
       }

       // Buraya geldiysek dörtgeni oluşturan bütün noktalarda en üstte
       // 'numara' var demektir. Yani dörtgen serbest.
       return true;
   }

   void kaldır(Nokta nokta)
   {
       Konum konum = konumlar[nokta.satır][nokta.sütun];

       if (konum.empty) {
           writefln("%s konumunda dörtgen yok", nokta);

       } else {
           auto dörtgenNumarası = konum.back;  // En üstteki dörtgenin numarası
           auto dörtgen = dörtgenNumarası in dörtgenler;

           // Daha önce yerleştirdiğimize göre eşleme tablosunda bulunmalı.
           assert(dörtgen, format("%s numaralı dörtgen bulunamadı"));

           if (serbest_mi(*dörtgen, dörtgenNumarası)) {
               sil_(*dörtgen, dörtgenNumarası);
               writefln("%s numaralı dörtgen silindi", dörtgenNumarası);

           } else {
               writefln("%s numaralı dörtgen serbest değil", dörtgenNumarası);
           }
       }
   }

   // Bu işlev arayüzün parçası değil; yalnızca bu yapı çağırsın diye...
   private void sil_(Dörtgen dörtgen, size_t dörtgenNumarası)
   {
       foreach (nokta; dörtgen) {
           konumlar[nokta.satır][nokta.sütun].popBack();
       }

       dörtgenler.remove(dörtgenNumarası);
   }

   void çiz() const
   {
       foreach (satır; konumlar) {
           foreach (konum; satır) {
               // Her konumda en üstte olanı çizeceğiz
               auto görünüm = !konum.empty ? konum.back.to!string : ".";
               writef(" %s", görünüm);
           }

           writeln();
       }
   }
}

void doldur(ref Kağıt kağıt)
{
   kağıt.yerleştir(Dörtgen(Nokta(3, 3), Nokta(7, 7)), 1);
   kağıt.yerleştir(Dörtgen(Nokta(8, 15), Nokta(10, 18)), 2);
   kağıt.yerleştir(Dörtgen(Nokta(5, 5), Nokta(9, 10)), 3);
   kağıt.yerleştir(Dörtgen(Nokta(4, 4), Nokta(6, 6)), 4);
}

void main()
{
   auto kağıt = Kağıt(20, 20);

   doldur(kağıt);
   kağıt.çiz();

   kağıt.kaldır(Nokta(0, 0));    // Boş bir nokta
   kağıt.kaldır(Nokta(8, 8));    // Kaldırılamaz çünkü serbest değil
   kağıt.kaldır(Nokta(4, 4));    // Serbest
   kağıt.kaldır(Nokta(8, 8));    // Şimdi kaldırılabilir çünkü artık serbest
   kağıt.çiz();
}

Program iki kere çiz() diyor. Çıktısı şöyle:

'
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . 1 4 4 4 1 . . . . . . . . . . . .
. . . 1 4 4 4 3 3 3 3 . . . . . . . . .
. . . 1 4 4 4 3 3 3 3 . . . . . . . . .
. . . 1 1 3 3 3 3 3 3 . . . . . . . . .
. . . . . 3 3 3 3 3 3 . . . . 2 2 2 2 .
. . . . . 3 3 3 3 3 3 . . . . 2 2 2 2 .
. . . . . . . . . . . . . . . 2 2 2 2 .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Nokta(0, 0) konumunda dörtgen yok
3 numaralı dörtgen serbest değil
4 numaralı dörtgen silindi
3 numaralı dörtgen silindi
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . 1 1 1 1 1 . . . . . . . . . . . .
. . . . . . . . . . . . . . . 2 2 2 2 .
. . . . . . . . . . . . . . . 2 2 2 2 .
. . . . . . . . . . . . . . . 2 2 2 2 .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
'

Ali

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

« First   ‹ Prev
1 2 3