1

私は現在学生で、Visual C++ アプリケーションを設計して、グラフのマトリックスを含むテキスト ファイルを作成するために、有向グラフを視覚的に挿入できるようにしようとしています。この時点で、onClick イベントを作成してノードを作成し、フォームの Paint イベントを使用してノードを描画しました。また、ノードが重ならないように条件を挿入しました。

現在、ノード間のリンクの作成に取り組んでいます。私が遭遇した問題は、2 つのノードを結ぶ線が別のノードと交差することです。この状況では、オーバーラップを検出し、それを回避するためにラインがどれだけアーチする必要があるかを計算するアルゴリズムを作成するのは面倒だと思います。

したがって、クリックして左右にドラッグすることでユーザーがアーチ状にできる線を作成することを考えましたが、これを行う方法に関するチュートリアルを見つけるのに問題がありました. したがって、誰かがプロジェクトでこの種のアーチ ラインを導入しなければならなかったことがある場合、またはこれに関する情報をどこで見つけることができるかを知っている場合は、深く感謝します.

言及:

  1. このプログラムにサードパーティのものをインストールすることに興味がないので、これを行うための派手なグラフィック ライブラリをお勧めしないでください。コードを挿入したい関数は form1_onPaint のような名前になっているので、C++ 標準ライブラリに厳密に準拠したいと考えています。
  2. クリックとドラッグで線を描くことに興味があると言ったことは知っていますが、 onPaint イベントのオーバーラップを検出する機能や、これを解決するために使用できるその他の機能など、これに対する別の実行可能な解決策を誰かが提案できれば、それは大いに役立ちます。
4

2 に答える 2

1

曲線を描きたい場合は、WindowsGDI関数を見てくださいPolyBezier()

4つのポイントの配列を作成します。最初と最後のポイントはエンドポイント、つまり2つと接続元のノードである必要があります。2つの中間点は両方とも同じである必要があり、曲線の「点」、つまりマウスでドラッグしている位置である必要があります。

于 2008-10-19T10:16:00.340 に答える
1

考えられるアプローチの 1 つは、ユーザーがコネクタ ラインの 1 つの中点をつかんでドラッグできるようにすることです。これにより、ラインが 2 つのセグメントに分割されます (両端で結合されます)。これにより、物事が単純になり、複雑な曲線を扱う必要がなくなり、実装も非常に簡単になります。工夫を凝らして行をさらに細分化できるようにすることで、1 つの行を最終的に任意の数のサブ行に分割できます。

これを行うために何が必要かについてのいくつかの基本的なアイデア:

  • 線分と端点を定義するさまざまな点の表現。1 つの端に 1 つのポイント、中間のセグメント ブレーク ポイントごとに 1 つのポイント、もう一方の端に最後のポイントを保存できます。

  • カーソルの位置を追跡する方法。カーソルが線の中点に近づいたときに、線をつかんでドラッグして分割する準備を整えることができます。「マウス移動」イベントがこれに関与します。使用しているツールキットがわからない場合、またはイベントの名前をより具体的に示したい場合は、onMouseMove の可能性があります。

  • ドラッグ操作を追跡する方法。これには、おそらく「マウスダウン」、「マウス移動」、および「マウスアップ」が含まれます。ドラッグすると、関連するセグメント ブレーク ポイントの座標が更新されます。

残念ながら、基本的な描画/ウィンドウ システムは、互いに重なっているペイントを検出しようとする場合にはあまり役に立たないと思います。あなたは自分でそれを行うことができますが、コーディングするのは面倒で退屈かもしれないというあなたの考えに同意します.

最終製品は次のようになります。


(ソース:misterfoo.com

于 2008-10-18T21:34:13.763 に答える