2011-08-03 75 views
8

私は正弦曲線を描く方法を試しています。Qtを使ってSin(x)のグラフを描く

私のウィジェットは、いくつかの任意のデータポイントで渡すことを期待しています。

Sin(x)

をこれまでのところ、私はQPainterPathを使用して、いくつかの方法を試してみた:私は、正弦波ラインカーブにこれらのデータポイントに合わせて持っています。

  1. QPainterPath ::のlineTo - 私はラインが実際にビットを滑らかにすることを、私のデータポイントを取って、それらの間の非常に多くのポイントを作成することで、曲線をプロットするために、この機能を使用してみました。これはちょっと計算量が多すぎますが、私は感じます。
  2. QPainterPath :: cubicTo - 私はRTFMから集まったものから、これが最善の方法です。唯一の問題は、制御点を一貫してプログラムでどのように曲線を滑らかにするかという点で、コントロールポイントをどのようにプロットするのかがわかりません。私はこの機能で所望の結果を得ることができませんでした。

いくつかのグーグルでは、Qwtを使ってカーブプロットを行っていたフォーラムの記事がいくつか出てきました。私がQwtを使うことができれば素晴らしいだろうが、私はQtを使うことだけに制限されているので、それはオプションではない。

フィードバック/ご提案がありますか?

答えて

6

私はパラメトリックEQ(複数のスイープカーブを持つ長いライン)のボードスイープをペイントするのと非常によく似たことをやっています。私はそれをやっている方法(擬似スタイル):

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への呼び出しとQPointFは(すなわち、2つのqreal)ではなくQPointよりも(2 int)は非常に滑らかなラインを作ると描画の線の組み合わせ。

Ubuntuを実行しているSBCでこれを使用し、600x300pxグラフで再描画のタイミング(最初にポイントを得るための複雑な計算を含む)は〜80msです。最初のテストでは、enabling opengl renderingはこれを8msに減らしています(明らかにプロセッサーの集中的な作業はアンチエイリアス処理によるペイントです)。もしこれを行うことができれば、この解決策はあなたのために働くでしょう。

+0

非常にクールです。ありがとう – kwikness

+0

@sjwarner:こんにちは、私は似たようなことをしようとしています。あなたの5行目(forループ内)で、 'painter'ではなく' path'を意味しませんでしたか? –

+0

@VahidNateghi:はい、私はそれを意味しました。それを指摘するための乾杯:) – sjwarner

2

QCustomPlotは、オンラインで見つけられる無料の使いやすいクラスです。あなたが探しているものにとっては良いかもしれません。

関連する問題