Bresenham
Eski zamanlarda insanlar hala çizgi ve daire çizmek için kendi temel video rutinlerini yazarken, bunun için Bresenham çizgi algoritmasını kullanmaktan hiç hoşlanmadılar.
Bresenham bu sorunu çözüyor: Ekranda dx
pikselleri yatay yönde hareket ettiren , aynı zamanda dy
dikey yönde pikselleri kapsayan bir çizgi çizmek istiyorsunuz . Satırlara doğal bir "floaty" karakteri vardır; Tamsayılı pikselleriniz olsa bile, rasyonel eğilimler ile sonuçlanır.
Algoritma hızlı olmasına rağmen, bu sadece tamsayı aritmetiğini kullanabileceği anlamına gelir; ve ayrıca herhangi bir çarpma veya bölme olmadan, sadece toplama ve çıkarma işleminden kurtulur.
Bunu davanıza uyarlayabilirsiniz:
- "X yönü" (Bresenham algoritması açısından) saatinizdir.
- "Y yönünüz", artırmak istediğiniz değerdir (yani, karakterinizin konumu - dikkatli olun, bu aslında sizin sprite "y" ya da ekrandaki herhangi bir şey değil, daha soyut bir değerdir)
Burada "x / y", ekrandaki konum değil, zamanın boyutlarından birinin değeri. Açıkçası, sprite ekranınızda isteğe bağlı bir yönde çalışıyorsa, ayrı ayrı çalışan 2B, 2B ve 3B olmak üzere birden fazla Bresenham'ınız olacaktır.
Örnek
Diyelim ki karakterinizi eksenlerinizden biri boyunca 0 - 25 arasında basit bir hareketle hareket ettirmek istediğinizi varsayalım. Hız 2.5 ile hareket ettiğinden, şasiye 10 da ulaşacaktır.
Bu, (0,0) ile (10,25) arası bir çizgi çizme ile aynıdır. Bresenham'ın çizgi algoritmasını alın ve çalışmasına izin verin. Doğru yaparsanız (ve onu incelerken, nasıl doğru bir şekilde yaptığınız çok çabuk anlaşılacaktır), o zaman sizin için 11 "puan" üretecektir (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25).
Adaptasyonla ilgili ipuçları
Bu algoritmayı googleda tutar ve bir kod bulursanız (Wikipedia'da oldukça büyük bir anlaşma vardır), dikkat etmeniz gereken bazı şeyler vardır:
- Açıkçası her türlü
dx
ve çalışır dy
. Ancak belirli bir vakaya ilgi duyuyorsunuz (yani asla sahip olmayacaksınız dx=0
).
- Her zamanki uygulama bağlı olarak ekranda çeyrek daire için birkaç farklı durumlarda sahip olacak
dx
ve dy
olumlu, olumsuz, ve ayrıca olsun abs(dx)>abs(dy)
veya olmasın. Elbette burada ihtiyacınız olanı da seçebilirsiniz. Özellikle 1
her kene tarafından arttırılan yönün daima “saat” yönünüz olduğundan emin olmalısınız .
Bu basitleştirmeleri uygularsanız, sonuç gerçekten çok basit olacak ve tüm gerçeklerden tamamen kurtulacak.