2011-12-18 18 views
3

グラフアプリケーションを開発中です。アプリケーションウィンドウには、エッジで結ばれた頂点があります。ユーザーは頂点を移動することができ、頂点を移動するとエッジも移動します。私は、両方の頂点の位置に応じてエッジ方向を表す矢印を描画するパターンを見つけるのに問題があります。エッジの方向を描画するアルゴリズム

例を示します。

頂点には​​があります。エッジはVertex1の中心からVertex2の中心まで描かれます。

Vertex1.position = new Point(0,0); 
Vertex2.position = new Point(100,0); 
Edge.point1 = new Point(10,10); 
Edge.point2 = new Point(110,10); 
//Arrow representing direction from Vertex1 to Vertex2 
Arrow.point1 = new Point(100,10); 
Arrow.point2 = new Point(90,20); 
Arrow.point3 = new Point(90,0); 

質問:エッジの開始点と終了点の位置を知り、矢印ポイントを計算する方法は?

+0

1)ポイント(上端)に対する半径方向(角度/距離)の矢印ポイントを定義する、2)頂点を結ぶベクトルの角度を計算する(x軸またはy軸のいずれかの角度、重要ではない) 3)あなたが取った角度に応じて、矢印ポイントの角度を加算または減算します。4)sinとcosを使って、それぞれの矢印(左の)点の上の点からxとyのオフセットを計算し、5)addこれらの値は上の矢印の点に – neeKo

答えて

3

のは、エッジの出発点がポイント(bx, by)を終了し、座標(ax, ay)を持っているとしましょう、頂点が半径wを持って、あなたの矢印は、擬似コードで、そのポインタlの長さと矢印エッジalpha 間の角度を持っています

ex := (bx - ax) 
ey := (by - ay) 
ex := ex/sqrt(ex^2 + ey^2) 
ey := ey/sqrt(ex^2 + ey^2) 

矢印の最初のポイント:

a1x := bx - w * ex 
a1y := by - w * ey 

矢印の二点:

a2x := bx - (w + l) * ex + l * tg(alpha/2) * ey 
a2y := by - (w + l) * ey - l * tg(alpha/2) * ex 

矢印の三点目:貧弱なフォーマットのため

a3x := bx - (w + l) * ex - l * tg(alpha/2) * ey 
a3y := by - (w + l) * ey + l * tg(alpha/2) * ex 

申し訳ありませんが、私はここで数学的なマークアップを使用する方法がわかりません。計算に誤りがないことを願っています。

+0

ありがとう、素晴らしい答え。 – Zaphood

0

EDIT:あなたのアプリケーションタイプを指摘していません。 WinFormsを使用する場合は、thisが便利です。 HereはMSDNの記事LineCapです。

関連する問題