Spritelarınızın dikdörtgenler olan fayans kümeleri içerdiğini varsayarsak (rastgele kümeler işgal ederse, genel durumda doğru şekilde çizemezsiniz), sorun, öğeler arasında toplam sipariş ilişkisi olmamasıdır. O (nlogn) karşılaştırmalarıyla sonuçlanacak bir sıralama kullanır.
Herhangi iki A ve B nesnesi için A'nın B (A <- B) 'den önce çizilmesi gerektiğini, B'nin A (B <- A)' dan önce çizilmesi gerektiğini veya herhangi bir sırada çizilebileceğini unutmayın. Kısmi bir düzen oluştururlar. Kendinizi üst üste gelen 3 nesne ile birkaç örnek çizerseniz, 1. ve 3. nesnelerin çakışmamasına rağmen, doğrudan bir bağımlılığa sahip olmasa bile, çizim sıralarının aralarındaki 2. nesneye bağlı olduğunu fark edebilirsiniz. yerleştirirseniz, farklı çizim siparişleri alırsınız. Özetle - geleneksel türler burada işe yaramıyor.
Bir çözüm (Dani tarafından belirtilen) karşılaştırmayı kullanmak ve bağımlılıklarını belirlemek ve bir bağımlılık grafiği (bir DAG olacak) oluşturmak için her nesneyi birbiriyle karşılaştırmaktır. Ardından çizim sırasını belirlemek için grafik üzerinde topolojik bir sıralama yapın. Çok fazla nesne yoksa, bu yeterince hızlı olabilir O(n^2)
.
Başka bir çözüm (dengeleme için - sözde ) dört ağaç kullanmak ve tüm nesnelerin dikdörtgenlerini içine saklamaktır.
Daha sonra tüm X nesnelerini tekrarlayın ve dört ağacını kullanarak X nesnesinin üzerindeki şeritte X nesnesinin en soluyla başlayan ve X nesnesinin en sağ köşesiyle biten - Y gibi tüm Y, Y < - X. Bunun gibi, yine de bir grafik oluşturmalı ve topolojik olarak sıralamalısınız.
Ama bundan kaçınabilirsiniz. Q nesnelerinin bir listesini ve T nesnelerinin bir tablosunu kullanırsınız. X eksenindeki (bir satır) daha küçük olandan daha büyük değerlere kadar tüm görünür yuvaları yineleyerek y ekseninde satır satır ilerlersiniz. Bu yuvada bir nesnenin alt köşesi varsa, bağımlılıkları belirlemek için yukarıdaki prosedürü uygulayın. X nesnesi, kısmen üstünde olan başka bir Y nesnesine (Y <- X) bağlıysa ve bu Y'nin her biri zaten Q'da ise, X'i Q'ya ekleyin. Q'da olmayan bir Y varsa, X'i T ve Y <- X olduğunu belirtin. Q'ya her nesne eklediğinizde, T'de bekleyen nesnelerin bağımlılıklarını kaldırırsınız. Tüm bağımlılıklar kaldırılırsa, T'deki bir nesne Q'ya taşınır.
Nesne spritelarının alt, sol veya sağdaki yuvalarından dışarı bakmadığını varsayıyoruz (sadece üstte, resminizdeki ağaçlar gibi). Bu, çok sayıda nesne için performansı iyileştirmelidir. Bu yaklaşım yine olacaktır O(n^2)
, ancak sadece garip boyutlu nesneler ve / veya nesnelerin garip konfigürasyonlarını içeren en kötü durumda olacaktır. Çoğu durumda, öyle O(n * logn * sqrt(n))
. Spritelarınızın yüksekliğini bilmek, ortadan kaldırabilir sqrt(n)
, çünkü yukarıdaki tüm şeridi kontrol etmeniz gerekmez. Ekrandaki nesne sayısına bağlı olarak, dörtlü ağacı hangi yuvaların çekildiğini belirten bir dizi ile değiştirmeyi deneyebilirsiniz (çok sayıda nesne varsa mantıklıdır).
Son olarak, bu kaynak kodunu bazı fikirler için incelemekten çekinmeyin: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala