Temel olarak, çok küçük üçgenlere (sol tuvalde) geometrik bir şekli kesen, üçgen demetine basit matematiksel dönüşümü uygulayan ve bunları yeniden çizen bir program tasarladım. yeni yapılandırmaları. Aşağıda ekran yakalama konusuna bakın. Bu üçgenleri çizmek içinQt/C++: verimli çizim
, ben QPainter::drawPolygon
kullanın. Sağdaki her üçgen soldaki bir üçgene karşılık gelir, bu yüzden çizmek için hangi rengi kullanmak istediğimi biliyorum.
Şimdiye kadar, iyi. Bundan çok daha fazla üçgen çizsem bile (şekli kesmek için çok daha küçük üçgenler kullandığımda), bu yeterince hızlıdır.
Programıma bir özellik ekledim: Düz üçgenler yerine bir resimden çıkarılan üçgenler çizebilirim: bkz. Aşağıdaki ekran görüntüsü.
sorun Bunu yol çok yavaş olmasıdır. İşte bunun için gereken adımları:
Bütün üçgenler her üçgen için- , ben görüntülenecektir her piksel koordinatlarını hesaplamak.
- Bu piksellerin her biri için, resimdeki ilgili pikselin koordinatlarını hesaplıyorum (bu kolay bir matematiksel işlemdir) ve bu pikselin rengini alıyorum.
- Piksel çizmek için
QPainter::setPen(QColor)
veQPainter::drawPoint(QPoint)
kullanıyorum.
Qt'de programlama konusunda yeniyim ve grafikler hakkında hiçbir şey bilmiyorum, bu yüzden gelebildim. Sorun şu ki, "kabul edilemez bir şekilde" çok yavaştır (her bir kanvasın paintEvent
'u düz üçgenler durumunda 0.01'lere kıyasla yaklaşık 0.15 saniye sürer).
, ben tuval Widget en paintEvent
, zamanın
- 58% zamanın
QPainter::drawPoint
- 27% olarak harcanmaktadır harcandığını içinde fark
QPainter::setPen
yılında o QPainter::drawPoint
çok karmaşık ve yavaş olduğunu görünüyor: sadece belirli bir rengin bir pikseli yazdırmak istediğiniz, o kadar.
Sorunumda bir çözüm bulmuş olabilirsiniz: QImage
(tuval widget'ımın bir üye değişkeni olarak), tuvalimin görüntülenmesini istediğim her şeyi temsil eder ve onu tamamen paintEvent
pikselimde piksel olarak tanımlayabilirim, ve QPainter::drawImage
ile paintEvent
'un sonunda bir kerede çizin. Bunun çok daha hızlı olacağına dair bir ipucum var. Ama kodumu tekrar tekrar yazmadan önce, gerçekten yapmak istediğim şeyin olup olmadığını bilmek istiyorum.
Umarım ölüm yapmak zorunda kalmazdım! Anlayışlarınız için şimdiden çok teşekkürler.
Piksel piksel çizimiyorsunuz ?? (zomg !!) – UmNyobe