2011-08-03 31 views
8

Sinüzoidal bir grafik çizmenin yollarını deniyorum.Qt Kullanımı Sin (x) Grafiğini Çizmek için

Widget'ım yalnızca birkaç rastgele veri noktasında geçmeyi bekliyor. Bir sinüs çizgi eğriye bu veri noktalarını uydurmak zorunda:

Sin(x)

Şimdiye kadar, ben QPainterPath kullanarak birkaç metot denedim.

  1. QPainterPath :: lineTo - Ben çizgi aslında biraz hafifletir, benim veri noktalarını almak ve bunlar ARASINDA kadar çok noktaları oluşturarak eğrisini çizmek için bu fonksiyonu kullanarak çalıştı. Bu biraz fazla hesaplamalı yoğun olsa da, hissediyorum.
  2. QPainterPath :: cubicTo - RTFM'den topladığımdan, gitmek için en iyi yol budur. Tek sorun, kontrol noktalarının nasıl tutarlı ve programlı olarak istediğim şekilde eğrisini düzleştireceği noktalarda nasıl çizeceğimi bilmem. Bu işlevle istenen sonucu alamadım.

Bazı yayınlamalardan sonra, eğri çizimleri için Qwt kullanan birkaç forum gönderisine rastladım. Qwt kullanabilseydim harika olurdu, ama sadece Qt kullanmayla sınırlı olduğum için bir seçenek değil.

Herkesin yararlı geribildirim/önerileri var mı?

cevap

6

Şu anda parametrik bir EQ'nun (çoklu süpürme eğrileri olan uzun bir çizgi) bode süpürmesini boyayarak çok benzer bir şey yapıyorum. Bunu yaparken ediyorum yolu (psödo tarzı):

qreal yCoords[GRAPH_WIDTH]; 
... 
QPainter Painter(this); 
Painter.setRenderHint(QPainter::Antialiasing, true); 
//Painter.setRenderHint(QPainter::HighQualityAntialiasing, true); //opengl specific 
for(int xCoord = 0; xCoord < GRAPH_WIDTH; x++) 
    Path.lineTo(QPointF(xCoord, yCoord[xCoord])); 
... 
Painter.drawPath(Path); 

setRenderHint çağrıları ve QPointF (yani, iki qreal) yerine QPoint daha (iki int) çok düzgün bir çizgi yapar çizim çizgilerin kombinasyonu.

Bunu, Ubuntu çalıştıran bir SBC üzerinde kullanıyoruz ve 600x300 piksel bir grafik için ~ 80 ms'lik (ilk etapta puanları almak için tüm karmaşık matematik dahil) zamanlamaların yeniden çizimini alıyoruz. İlk testler, enabling opengl rendering'un bunu ~ 8 ms'ye indirdiğini gösteriyor (açıkça işlemci yoğun görevi, antialiasing ile boyamadır), eğer bunu yapabiliyorsanız, bu çözümün sizin için işe yarayacağını düşünüyorum.

+0

çok iyi. teşekkürler – kwikness

+0

@sjwarner: Merhaba, benzer bir şey yapmaya çalışıyorum. Beşinci çizginizde (döngü için) "ressam" yerine "yol" demek istemediniz mi? –

+0

@VahidNateghi: Evet, öyle demek istedim. Bunu işaret için alkış :) – sjwarner

2

QCustomPlot, çevrimiçi bulunan ücretsiz ve kullanımı kolay bir sınıftır. Yapmak istediğiniz şey için daha iyi olabilir.

İlgili konular