2011-08-03 17 views
8

Estoy experimentando con formas de dibujar un gráfico sinusoidal.Uso de Qt para dibujar el gráfico de Sin (x)

Mi artilugio solo espera pasar en algunos puntos de datos arbitrarios. Tengo para adaptarse a estos puntos de datos a una curva sinusoidal de la línea:

Sin(x)

Hasta ahora, he intentado algunos métodos que utilizan QPainterPath.

  1. QPainterPath :: lineTo - He intentado utilizar esta función para trazar la curva tomando mis puntos de datos y la creación de tantos puntos entre ellos, que la línea realmente suaviza un poco. Sin embargo, esto es un poco demasiado computacionalmente intensivo.
  2. QPainterPath :: cubicTo - Por lo que reuní de RTFM, este es el mejor camino a seguir. El único problema es que no estoy seguro de cómo trazar mis puntos de control en los puntos en los que alineará de forma consistente y programática la curva de la forma que yo quiero. No pude obtener el resultado deseado con esta función.

Después de buscar en Google, encontré algunas publicaciones en el foro que utilizaban Qwt para el trazado de curvas. Sería genial si pudiera usar Qwt, pero no es una opción, ya que estoy restringido a usar solo Qt.

¿Alguien tiene comentarios/sugerencias útiles?

Respuesta

6

Estoy haciendo algo muy similar actualmente al pintar el bode sweep de un ecualizador paramétrico (una línea larga con múltiples curvas de barrido). La forma en que lo estoy haciendo (estilo 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); 

La combinación de las llamadas a setRenderHint y líneas de dibujo con QPointF (es decir, dos qreal) en lugar de QPoint (dos int) hace que la línea muy suave.

Estamos usando esto en un SBC con Ubuntu y obteniendo tiempos de redibujo (incluyendo todas las matemáticas complejas para obtener los puntos en primer lugar) de ~ 80ms para un gráfico de 600x300px. Las pruebas iniciales muestran que enabling opengl rendering reduce esto a ~ 8ms (claramente la tarea intensiva del procesador es la pintura con antialiasing), así que si puedes hacer eso, creo que esta solución funcionará para ti.

+0

muy bueno. gracias – kwikness

+0

@sjwarner: Hola, estoy tratando de hacer algo similar. en su quinta línea (en bucle) ¿no se refería a 'ruta' en lugar de' pintor'? –

+0

@VahidNateghi: Sí, lo dije en serio. Saludos por señalar eso :) – sjwarner

2

QCustomPlot es una clase gratuita y fácil de usar que se puede encontrar en línea. Puede ser mejor para lo que estás buscando hacer.

Cuestiones relacionadas