Hızlı kenar yumuşatma hattı çizimi


11

Bresenham'ın çizgi algoritması, yalnızca hızlı tamsayı işlemlerini (toplama, çıkarma ve 2 ile çarpma) kullanarak düz çizgiler çizmenin bir yoludur. Ancak, takma satırlar oluşturur. Kenar yumuşatılmış çizgiler çizmenin benzer hızlı bir yolu var mı?


1
Birkaç soru ... CPU veya GPU'da çizim mantığı mı yapıyorsunuz? Ayrıca, tamsayı tabanlı algoritmalar veya kayan nokta mı arıyorsunuz?
Alan Wolfe

5
@AlanWolfe, CPU üzerinde tamsayı algoritmaları - Bresenham'ın algoritması için tasarlanan ortam.
Mark

3
en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algoritma klasik bir sayfadır, ancak wikipedia sayfası oldukça yarı pişmiş ve kağıda erişimim yok. Yine de bu tembel bir soru gibi geliyor, çünkü bunu basit bir googling yaparak bulmak oldukça kolay.
yuriks

2
Sadece yüksek sesle düşünerek, çok piksel kalınlığında çizgiler çizmek için Bresenham'ı uyarlamanın kolay olması gerektiğini düşünüyorum. Daha sonra her bir piksel merkezinin matematiksel ideal çizgiden uzaklığını hesaplayarak ve bazı falloff işlevi uygulayarak kenar yumuşatma yapabilirsiniz.
Nathan Reed

2
Yine de bir yorumu doğru olarak işaretleyemiyorum.
Mark

Yanıtlar:


9

Kenar yumuşatılmış çizgiler çizmenin benzer hızlı bir yolu var mı?

Hayır, çünkü tanım gereği kenar yumuşatılmış bir çizgi daha fazla piksele temas eder. Bu algoritmalar daha yavaş olacaktır.


Bir yazılım rasterleştiricide, kenar yumuşatılmış çizgiler çizmenin yaygın yolu Xiaolin Wu'nun çizgi algoritmasıdır . Uygulanması zor değil ve yine de bu bağlantıda alışılmadık derecede yüksek kaliteli sahte kod var.

Bir donanım tarama borusunda, ilkel çizgi, varsayılan (veya kullanıcı tarafından sağlanan) geometri gölgelendirici tarafından bir ekran boşluğu dörtlüsüne genişletilir ve daha sonra normal yollarla kenar yumuşatılabilen iki üçgen olarak çizilir.

Bir ışın izleyicide çeşitli seçenekler vardır. 1D nesnesini nasıl çizmek istediğinizi düşünmeye değer. Belki bir silindir olarak (gölgeler woo!). Bunun, istediğiniz şey olabilecek (veya olmayabilecek) perspektif / foreshortening konularını getirdiğini unutmayın. Net bir genelleme yoktur. O zaman, açıkçası, ne yaparsanız yapın, sadece süper örnekleme yaparsınız.


"Ve yine de bu bağlantıda alışılmadık derecede yüksek kaliteli sözde kod var", katılmıyorum. Bu sahte kod, web'deki sayısız yerde kullanılmış gibi görünse de, Wu'nun algoritmasının uygun bir uygulaması değildir. Wu'nun orijinal algoritması her iki uçtan merkeze doğru çekildi ve aslında Bresenham'ınkinden daha hızlıydı çünkü daha fazla piksele yazsa bile yaklaşık yarı işlem gerçekleştiriyor. Wu'nun gerçek algoritmasından bahsediyorum , bağlantılı wikipedia makalesinde yayınlananlardan değil .
Ahtapot

@Octopus [Özellikle daha hızlı bitte belirsiz şüpheciliği ifade eder, ancak çürütmek veya onaylamak için bağlamdan yoksundur - eğer öyleyse, kaynaklar, düzeltmeler ve düzenlemeler elbette hoş karşılanır.]
imallett

Ne saydığına bağlı. Her iki uçtan içe doğru çizerseniz, Wu'nun algoritması hesaplamaların yarısını yapar, ancak iki piksel yazma işleminin iki katıdır. Wu'nun Wikipedia'daki bağlantılı makalesinde Tablo 1'e bakınız. Peki bir seri bağlantıda bir TFT'ye yazarken olduğu gibi piksel yazmaları pahalıysa, Wu'nun algoritması Bresenham'ınkinden daha pahalıdır. (Bresenham'ın algoritmasının neden simetriyi kullanamayacağını anlamıyorum.)
Jan-Åke Larsson

1
Ama @Octopus ile aynı fikirdeyim, "bir uçtan diğer uca çiz" i bile kabul ediyorum, sözde kod, yalnızca tamsayı aritmetiği kullanılırsa Wu'nun algoritması. Çevrimiçi görüyorum Kodu önemli bir değişiklik kayan nokta aritmetik kullanır. Wu'nun makalesinde, algoritma sadece tamsayı aritmetiği (veya aslında sabit nokta aritmetiği) kullanır.
Jan-Åke Larsson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.