2011-08-03 69 views
8

我正在试验绘制正弦曲线图的方法。使用Qt绘制Sin(x)的图形

我的小部件只希望能够通过一些任意的数据点。我必须适应这些数据点正弦线曲线:

Sin(x)

到目前为止,我已经尝试使用QPainterPath的一些方法。

  1. QPainterPath ::了lineTo - 我试着用这个功能来绘制采取我的数据点和它们之间创造这么多点,该行实际上平滑了一点曲线。我觉得这虽然有点过于计算量。
  2. QPainterPath :: cubicTo - 从我从RTFM收集的信息中,这是最好的方法。唯一的问题是,我不知道如何绘制我的控制点,以便按照我希望的方式始终如一地并按程序化地平滑曲线。使用此功能我无法获得所需的结果。

一些谷歌搜索后,我遇到了一些使用Qwt曲线绘图的论坛帖子。如果我可以使用Qwt会很好,但这不是一个选项,因为我仅限于使用Qt。

有没有人有帮助的反馈/建议?

回答

6

我正在做一个非常类似的事情,现在用绘画参数均衡器(具有多条扫描曲线的长线)的波特扫描。我在做它的方式(伪风格):

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

来电来setRenderHintQPointF(即,两个qreal),而不是QPoint(二int)使该行非常流畅画线的组合。

我们在运行Ubuntu的SBC上使用它,并为600x300px图形获取~80ms的重绘时间(包括所有复杂的数学运算以获得第一个点)。初始测试显示enabling opengl rendering将其减少到〜8ms(显然,处理器密集型任务是带有抗锯齿功能的绘图),所以如果您可以这样做,我认为该解决方案将适用于您。

+0

很酷。谢谢 – kwikness

+0

@sjwarner:嗨,我正在尝试做类似的事情。在你的第五行(在循环中)你是不是指'路径'而不是'画家'? –

+0

@VahidNateghi:是的,我的意思是。欢呼指出,:) – sjwarner

2

QCustomPlot是一个免费的,易于使用的类,可以在网上找到。对于你想要做的事情可能会更好。