2011-08-03 24 views
8

Eksperymentuję ze sposobami narysowania sinusoidalnego wykresu.Używanie Qt do rysowania wykresu sin (x)

Mój widget oczekuje tylko, że zostanie zaliczony w kilku arbitralnych punktach danych. Muszę dopasować te punkty danych, do krzywej sinusoidalnej linii:

Sin(x)

Dotychczas Próbowałem kilka metod z wykorzystaniem QPainterPath.

  1. QPainterPath :: lineTo - Próbowałem za pomocą tej funkcji można wykreślić krzywą biorąc moje punkty danych i tworzenie tak wielu punktów między nimi, że linia rzeczywiście wygładza trochę. Jest to jednak zbyt intensywne obliczeniowo.
  2. QPainterPath :: cubicTo - Z tego, co zebrałem z RTFM, jest to najlepsza droga. Jedynym problemem jest to, że nie jestem pewien, jak wykreślić moje punkty kontrolne w miejscach, w których będzie konsekwentnie i programowo wygładzać krzywą w taki sposób, w jaki chcę. Nie mogłem uzyskać pożądanego wyniku za pomocą tej funkcji.

Po kilku badaniach, natknąłem się na kilka wpisów na forum, które używały Qwt do wykreślania krzywych. Byłoby wspaniale, gdybym mógł użyć Qwt, ale to nie jest opcja, ponieważ jestem ograniczony do używania tylko Qt.

Czy ktoś ma przydatne opinie/sugestie?

Odpowiedz

6

Robię teraz bardzo podobną rzecz z malowaniem wróżebnej kreski parametrycznego korektora (długa linia z wieloma krzywymi zamiatania). Sposób, w jaki to robię (styl pseudo):

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); 

Kombinacja połączeń do setRenderHint i linii rysunek z QPointF (czyli dwa qreal) zamiast QPoint (dwa int) sprawia, że ​​wiersz bardzo sprawne.

Używamy tego w systemie SBC z systemem Ubuntu i uzyskiwaniu odświeżania taktowania (w tym całej złożonej matematyki, aby uzyskać punkty w pierwszej kolejności) o wartości ~ 80ms dla wykresu 600x300px. Wstępne testy pokazują, że enabling opengl rendering redukuje to do ~ 8ms (wyraźnie intensywnym zadaniem procesora jest malowanie z antyaliasingiem), więc jeśli możesz to zrobić, myślę, że to rozwiązanie będzie działać dla ciebie.

+0

bardzo fajnie. dzięki – kwikness

+0

@sjwarner: Cześć, próbuję zrobić coś podobnego. w twojej piątej linii (w pętli for) nie masz na myśli 'ścieżki' zamiast' malarza'? –

+0

@VahidNateghi: Tak, miałem na myśli. Pozdrawiam za wskazanie tego :) – sjwarner

2

QCustomPlot to bezpłatna i łatwa w użyciu klasa, którą można znaleźć w Internecie. Może być lepiej dla tego, co chcesz zrobić.

Powiązane problemy