QGraphicsViewにインタラクティブなスプラインのような曲線を実装するための最良の方法は何ですか?

ジョージ

私は、ユーザーが岩の亀裂の画像をアップロードし、その亀裂にスプライン近似を適用できるようにするアプリケーションを開発しています。

その目的のためにQGraphicsView、アップロードされた画像を表示します。画像がアップロードされると、ユーザーはにポイントを描画するオプションがありますscene。これ、一貫して線で接続したいものです。それらの接続されたポイントは曲線を作ります、それは私がインタラクティブになりたいです。インタラクティブとは、ユーザーが曲線を壊さずにポイントをドラッグし、ポイントを接続する線をポイントとともに移動できるようにすることを意味します。また、ユーザーが選択したポイントを削除して、隣接するポイントが接続されたままになるようにしたいです。これらは私が望むすべての機能ではありませんが、私はあなたがアイデアを得ると思います。

私が行ったことは、1つの個別のポイントに関するすべての情報MeasurePointを継承しQGraphicsItem、含むクラス作成したことです。次のフィールドがあります。

int xPos;
int yPos;
int index;
bool movable;
bool selected;

そのクラスには、これらのポイントを管理するためのいくつかのメソッドもあります(フィールドのゲッター関数とセッター関数など)。ただし、接続機能は個々のポイントに関する情報のみが含まれ、それ以上は含まれないため、そのクラスには実装しません。ポイントをシーンに追加するだけのポイントの動作が気に入っています。しかし今、私は前に説明した方法でそれらを接続する必要があり、それを行う方法を本当に理解することはできません。

ポイントを保存するための最良の方法は何ですか?ポイント間の接続をどの程度正確に実装する必要がありますか?可能な限りの助けをいただければ幸いです。

MeasurePointこの質問でクラスの実装が必要な場合は、編集します。

Romha Korev

QGraphicsPathItem使用してスプラインを描画します。次に、このQPainterPath::cubicToメソッドを使用して、ポイント間の接続を作成します。

2点間に滑らかなベジェ曲線を描くには、制御点を計算する必要があります。

二次ベジェ曲線に基づいたより優れたライブラリがたくさんありますが、以下の簡単な例では、Qtタイプと単純なアプローチを使用して、コントロールポイントを取得する方法を理解しています。

QPair<QPointF, QPointF> controlPoints(QPointF const& p0, QPointF const& p1, QPointF const& p2, qreal t=0.25)
{
    QPair<QPointF, QPointF> pair;
    qreal d01 = qSqrt( ( p1.x() - p0.x() ) * ( p1.x() - p0.x() ) + ( p1.y() - p0.y() ) * ( p1.y() - p0.y() ) );
    qreal d12 = qSqrt( ( p2.x() - p1.x() ) * ( p2.x() - p1.x() ) + ( p2.y() - p1.y() ) * ( p2.y() - p1.y() ) );

    qreal fa = t * d01 / ( d01 + d12 );
    qreal fb = t * d12 / ( d01 + d12 );

    qreal c1x = p1.x() - fa * ( p2.x() - p0.x() );
    qreal c1y = p1.y() - fa * ( p2.y() - p0.y() );
    qreal c2x = p1.x() + fb * ( p2.x() - p0.x() );
    qreal c2y = p1.y() + fb * ( p2.y() - p0.y() );

    pair.first = QPointF( c1x, c1y );
    pair.second = QPointF( c2x, c2y );

    return pair;
}

次に、ポイントリストを参照してQPainterPathを作成します

QPainterPath BackgroundBuilder::buildPath(QList<QPointF> const& points)
{
    QPainterPath pth;

    QPair<QPointF, QPointF> pair = controlPoints(points.at(0), points.at(1), points.at(2));
    QPointF p0 = pair.second;
    pth.moveTo(0, 0);
    pth.lineTo(p0);
    for (int i = 2; i != points.count() - 1; ++i)
    {
        QPair<QPointF, QPointF> pair = controlPoints( points.at(i - 1), points.at(i), points.at(i + 1));
        pth.cubicTo( p0, pair.first, points.at( i ) );
        p0 = pair.second;
    }
    return pth;
}

このコードを汎用的に保つにはMeasurePointに変換する必要がある場合がありますQPointF

QList<QPointF> points;
QList<MeasurePoint*> measures = ...;
for (MeasurePoint* measure: measures)
{
    points << QPointF(measure.xPos, measure.yPos);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アクティブなインターフェイスコントローラーとは関係なく、Apple Watchにメッセージを表示するための最良の方法は何ですか?

分類Dev

ドライブをパーティション分割するための最良の方法は何ですか?

分類Dev

プレロリポップデバイスにマテリアルデザインを実装するための最良の方法は何ですか?

分類Dev

インタラクティブなSVGHTMLフォームを作成するための最良の方法

分類Dev

さまざまな種類のデータフィールドを持つカスタマイズされた製品のデータを保存するアプリケーションを実装するための最良の方法は何ですか?

分類Dev

コントローラでDbContextクラスにアクセスできないようにするための最良の方法は何ですか?

分類Dev

クライアント側(angularjs)にデータを保存するための最良の方法は何ですか?

分類Dev

不正な形式のテンプレートのインスタンス化について通知するための最良の方法は何ですか?

分類Dev

クライアント側でCDLLを実行するための最良の方法は何ですか?

分類Dev

既存のサードパーティライブラリの既存のクラスの機能を拡張するための最良の方法は何ですか?

分類Dev

Eleventyで小さなクライアントサイドJavaScriptを実行するための最良の方法は何ですか?

分類Dev

複数のロジックブランチをサポートするイテレータを作成するための最良の方法は何ですか?

分類Dev

AntiXSSライブラリを使用して投稿から不正なHTMLコンテンツをフィルタリングする最良の方法は何ですか?

分類Dev

いくつかの(インデックス)パラメータによってパンダデータフレームの「適切な」場所に値を挿入するための最良の方法は何ですか?

分類Dev

SOAPインタラクションをデバッグするための最良の方法は何ですか?

分類Dev

2D形状(または曲線)の階段ステップ曲線(アウトライン)を生成するにはどうすればよいですか?

分類Dev

AndroidにFacebookログインを実装するための最良の方法は何ですか?

分類Dev

Gitブランチをマスターにマージするための最良の(そして最も安全な)方法は何ですか?

分類Dev

XCodeでテキスト(UILabel、ボタンタイトルなど)のスタイルを設定するための最も効率的な方法(ベストプラクティス)は何ですか?

分類Dev

アイテムのタイムゾーンが異なるリストに日付フィルターを実装する良い方法は何ですか?

分類Dev

バックグラウンドビデオがモバイルブラウザに読み込まれないようにするための最も簡単または最良の方法は何ですか?

分類Dev

angle2ルーターでスワイプナビゲーションを実装するための最良の方法は何ですか?

分類Dev

Rxハンドラーを実装するためのベストプラクティスは何ですか?

分類Dev

Matplotlibのイオンモードのようなインタラクティブな使用のためにQtを非同期で実行するにはどうすればよいですか?

分類Dev

vim-モードに基づいてステータスラインの色を変更するための最良の方法は何ですか

分類Dev

vim-モードに基づいてステータスラインの色を変更するための最良の方法は何ですか

分類Dev

オブジェクト(すでにインターフェイスを実装している)をより広いインターフェイスに拡張するためのTypeScriptの慣用的な方法は何ですか?

分類Dev

GCP:SpannerからBigQueryへの定期的なデータパイプラインを設定するための最良のオプションは何ですか

分類Dev

この春ブートアプリケーションのインターフェイスを実装する別のクラスのリストを処理するためのスマートな解決策は何ですか?

Related 関連記事

  1. 1

    アクティブなインターフェイスコントローラーとは関係なく、Apple Watchにメッセージを表示するための最良の方法は何ですか?

  2. 2

    ドライブをパーティション分割するための最良の方法は何ですか?

  3. 3

    プレロリポップデバイスにマテリアルデザインを実装するための最良の方法は何ですか?

  4. 4

    インタラクティブなSVGHTMLフォームを作成するための最良の方法

  5. 5

    さまざまな種類のデータフィールドを持つカスタマイズされた製品のデータを保存するアプリケーションを実装するための最良の方法は何ですか?

  6. 6

    コントローラでDbContextクラスにアクセスできないようにするための最良の方法は何ですか?

  7. 7

    クライアント側(angularjs)にデータを保存するための最良の方法は何ですか?

  8. 8

    不正な形式のテンプレートのインスタンス化について通知するための最良の方法は何ですか?

  9. 9

    クライアント側でCDLLを実行するための最良の方法は何ですか?

  10. 10

    既存のサードパーティライブラリの既存のクラスの機能を拡張するための最良の方法は何ですか?

  11. 11

    Eleventyで小さなクライアントサイドJavaScriptを実行するための最良の方法は何ですか?

  12. 12

    複数のロジックブランチをサポートするイテレータを作成するための最良の方法は何ですか?

  13. 13

    AntiXSSライブラリを使用して投稿から不正なHTMLコンテンツをフィルタリングする最良の方法は何ですか?

  14. 14

    いくつかの(インデックス)パラメータによってパンダデータフレームの「適切な」場所に値を挿入するための最良の方法は何ですか?

  15. 15

    SOAPインタラクションをデバッグするための最良の方法は何ですか?

  16. 16

    2D形状(または曲線)の階段ステップ曲線(アウトライン)を生成するにはどうすればよいですか?

  17. 17

    AndroidにFacebookログインを実装するための最良の方法は何ですか?

  18. 18

    Gitブランチをマスターにマージするための最良の(そして最も安全な)方法は何ですか?

  19. 19

    XCodeでテキスト(UILabel、ボタンタイトルなど)のスタイルを設定するための最も効率的な方法(ベストプラクティス)は何ですか?

  20. 20

    アイテムのタイムゾーンが異なるリストに日付フィルターを実装する良い方法は何ですか?

  21. 21

    バックグラウンドビデオがモバイルブラウザに読み込まれないようにするための最も簡単または最良の方法は何ですか?

  22. 22

    angle2ルーターでスワイプナビゲーションを実装するための最良の方法は何ですか?

  23. 23

    Rxハンドラーを実装するためのベストプラクティスは何ですか?

  24. 24

    Matplotlibのイオンモードのようなインタラクティブな使用のためにQtを非同期で実行するにはどうすればよいですか?

  25. 25

    vim-モードに基づいてステータスラインの色を変更するための最良の方法は何ですか

  26. 26

    vim-モードに基づいてステータスラインの色を変更するための最良の方法は何ですか

  27. 27

    オブジェクト(すでにインターフェイスを実装している)をより広いインターフェイスに拡張するためのTypeScriptの慣用的な方法は何ですか?

  28. 28

    GCP:SpannerからBigQueryへの定期的なデータパイプラインを設定するための最良のオプションは何ですか

  29. 29

    この春ブートアプリケーションのインターフェイスを実装する別のクラスのリストを処理するためのスマートな解決策は何ですか?

ホットタグ

アーカイブ