Tavla pulu tasnif etmek

Başlatan muhittin_kaplan, 12 Eylül 2017, 17:48:59

muhittin_kaplan

Bir kaynaktan ardı ardına, değişik renklerde, üzerlerinde renklerine göre guruplandırılmış vaziyette sıralı sayılar(ardışık değil küçükten büyüğe karışık) olan Tavla Pulları düşmektedir.
Bu tavla pullarını renklerine göre ayırıp, üzerindeki sayı 360 olduğunda yada geçtiğinde, sepeti sayıp, boşaltıp yeni sepet koyacak bir algoritmaya ihtiyacım var.
Tavla Pullarının renklerinin kaç çeşit olduğu önceden verilecek, max 16 olabilecek. tavla pulunun kaç adet olacağı belli değil.

Andromeda

Algoritmadan önce kullanılacak mekanik sistem ve algılama sensörleri daha önemli değil mi...bunlar olmadan ancak kaba bir akış diyagramı kurulabilir gibime geliyor...
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

muhittin_kaplan

#2
Mekanik birşey yok hocam, aslında tavla pulu tavla pulu değil. UDP den gelen veriler. Bu haliyle anlatması daha kolay olur diye yazdım.

mir_as82

Hocam 16 tane değişken, 16 tane de bool değişken.


İlgili Bool ile ilgili değişkeni artır,
İnt ired;
Bool bred;


(bred == true  && gelen sayi==360) veya( bred==true&&ired==360 ) ise, ired i sıfırla onu başka bir totalRed değişkenine at.
Bu şekilde 16 renk 16 bool 16 da total leri tutan değişken al.
Anladığım kadar cevaplamaya çalıştım






tunayk

Hocam anladığım kadarıya, parçalamış halde gelen büyük bir paketiniz var ve siz verileri yerli yerine koyarak gerçek dataya ulaşmak istiyorsunuz.

Birinci yol;
Bir bufferınız olur. Data geldikçe, gelen datanın boyu kadar bufferı genişletirsiniz (Yada sabit bir uzunluk ise baştan belirlersiniz. ) Gelen datanın numarası  mevcutlardan büyükse, açtığınız yere doğrudan yazarsınız. En küçükse, tüm bloğu sona kaydırıp en başa yeni geleni yazarsınız. Ortada kalacak ise, kendinden sonrakileri ötelersiniz. Böylece toplam boyut 360 a ulaştığında başa sararsınız.

İkinci yol;

Yukarıdaki öteleme işini yapmazsınız. Arraylist vb. elemena her gelen datayı ekleyerek gidersiniz. Ayrı bir listedede, hangi data kaçıncı indexten başlıyor, boy nedir vb.  onu tutarsınız.  Her alımda toplam sayıyı kontrol eder, istenen elde edildi ise, elinizdeki klavuz diziye göre gerçek datayı oluşturursunuz. Bu biraz windowsun FAT sistemi gibi .


muhittin_kaplan

1.Onceden verilen renklerin sayisi kadar array olusturdum.
2.Gelen pullari renklerine gore tasnif edip ilgili array i artirdim (bunu pul sayisini tespit icin kullaniyorum)
3.gelen pullari kntrol ettim 360 olmusmu olduysa sayilari sifirladim.


Bugun bu calismayi yaptim. Hep bir problem. Ben sirali geldigini dusunurken birden birkac sayi geriye dusuyor.
Soyle
Mavi 3
Mavi 4
Kirmizi 2
.....
Mavi 360
Mavi 356
Kirmizi 90
Mavi 361 gibi dolayisyla yanlis bir "sepet doldu, icini say ve sepeti bosalt" olayi olusuyor.


Daha iyi anlatabilmek adina,
Yerleri surekli degisen, degisken ama cok sayida mesala 600 den fazla, nesneyi bir ultrasonic sensorun 360 der. Etrafina dagitin. Herbir nesnenin sadece sensore gore acisini ogrenebiliyorsunuz. Her bir donusundeki elemanlarin sayisini nasil ogrenebiliriz.
(Herhangi bir encoder bagli degil, elimizdeki bilgi sadece elemanlarin acilari.)




tunayk

Hocam biraz daha detay olsa sanki daha kolay bir çözüm bulunabilir gibi.

Şimdi siz adetsel olarak 360'a ulaştığınızda mı işlem yapmak istiyorsunuz yoksa 360numarayı görüğünüz durumda henüz adetsel toplam 360'a ulaşmasa da işlem yapılacak mı? Gelen pulların sıralarının nasıl geldiği çok mühim değil aslen önemli olan sizin "durumu" nasıl yönettiğiniz.  Gelen pulları bir arraya atıyor iseniz, Array boyundan adetsel olarak 360'a ulaşılmış mı kontrol edersiniz. Eğer pul dediğiniz 0 - 360 arası 1 wordluk bir sayıdan ibaret ise array elemanlarını sıraya koyarak toplam data elde edilmiş olur. Yok pullar aslında çok byte'tan oluşan ham veri içeriyor ve kendi numarası data içinde yer almıyor ise, önceki mesajda bahsettiğim ikincil bir arrayda, sıralamayı tutarsınız. Bu sizin index tablonuz olup, her satır sizin aldığınız data hakkında boy, sıra numarası vb. bilgi içerir.  Bu dizideki eleman sayısı 360'a ulaştığında 360 adet alım yapmışsınız demektir. Numara olarak 360'ın gelip gelmediğiniz de sonuçta her data alımında varmı yok mu diye bakarsınz. Eğer istediğiniz sayıya ulaşmışılmış ise, datayı oluşturmak için index arraydan faydalanılarak sırayla data arrayindeki elemanlar okunarak doğru veri oluşturulabilir.

Döner sensör örneğinde sadece diziliş sıralı olmayıp elemanlar yer değiştirmiyor olsa, o zaman sensör aynı elemanı tekrar gördüğünde başa dönmüş diyebilirdik. Ancak hem diziliş farklı hem de elemanlar yer değiştiriyor ise, sensörün dönüş miktarını belirleyemeyiz. Sonuçta dönüş bir konum bilgisi ve konum da bir noktayı referans alarak belirleniyor. Elemanlar yer değiştirir ise, referans nokta değişeceği için artık yeni konum bilgisi ile eskisi arasında bağ kalmaz.

Konu açık olmadığından belki çok alt seviye anlatmış olabilirim. Kusura bakmayın

muhittin_kaplan

#7
Hocam yardımlarınız için teşekkür ederim.