4

QT で一連の点を通る滑らかな線を描く方法はありますか? ポイントの数と位置は実行時に設定されます。

現在、パスを作成して、ポイントからポイントへの lineTo を含む QPainterPath を描画します。render-hints アンチエイリアシングを使用していますが、パスはまだギザギザです。

この種の曲線パスを提供するように見える QSplineSeries を見てきましたが、私が使用している QT バージョンである Qt4.8 では利用できません。

頻繁に提案されている別のオプションは、ベジエ曲線を使用することですが、それらは 1 つの開始点と終了点、および 2 つの制御点を使用するため、すべてのセグメント (すべての lineTo) に対して計算し、何らかの形で私が持っていない制御点を計算する必要があります。この時点で。

4

3 に答える 3

1

ほとんどの人がこのタスクに 3 次補間を使用しており、ベジエ曲線または Catmull-Rom スプラインを選択できます。すべてのポイントをヒットする必要がある場合は、「ハンドル」またはベジエのコントロール ポイント間の線をまっすぐに保つ必要があります。次に、最小二乗法を使用して適合しますが、これは少し複雑です。

Catmull Rom スプラインには、追加の制御点が 2 つしか必要ないという利点があります (始点と終点、ミラー ポイントを作成するだけです)。ポイントが適度に滑らかである限り、線は適切に動作します。QT グラフィックスが CatMull Rom スプラインを直接描画する可能性は低いため、公開されている標準的な方法であるベジエに変換します。Catmull Rom からベジエに簡単に移行できますが、その逆ではありません。ほんの数点。

立方体で希望する曲線が得られない場合は、他の補間方法である eq quintic を使用できます。

于 2016-12-02T14:31:55.193 に答える
1

Qt 4.8 にすぐに使えるソリューションがあるとは思いません (お気づきのようQSplineSeriesに、Qt 5.x の機能です)。また、商用のモジュール ( など) のQSplineSeries一部であるため、商用ライセンスを持っていないか、プロジェクトが GPL でない限り、使用できません。QtChartsQtDataVisualization

必要な計算を手動で行い、自分で実装する必要があります (または、適切な実装を見つけます (Qt 互換は言うまでもなく、C++ である必要はありません))。

ベジェ曲線について言及したので、複合ベジェ曲線を試してみることをお勧めします。私が取り組んだプロジェクトにそのことを実装したことを覚えています。それにはいくつかの...作業が必要でした。:Dこの記事は、始めるのに役立つかもしれません。

ベジエ曲線は実際には B スプラインです (私の記憶が正しければ)。特に、ある程度の滑らかさの欠如に対処できる場合は、複合ベジエ曲線をかなり高速に生成できます。それらの堅牢性と人気のために、オンラインでまともな実装を見つけることができると私は100%確信しています. おそらく Qt フレンドリーではありませんが、適切に記述されていれば、すぐにコードを適応させることができるはずです。

これは非常に有望に見えます (これは ActionScript にありますが、まあまあです)。またはQPainterPath::cubicTo()、曲線の計算に必要な 2 つの制御点を指定して、ベジエ曲線を作成できるショットを指定することもできます。

于 2016-11-23T12:17:56.150 に答える