2016-06-01 3 views
1

私は、長方形のノードと無向エッジからなるJavaで「ペイント」アプリケーションを作成しています。問題は、エッジの始まりがエッジが接続されている矩形の中央にあり、エッジの終わりがこのエッジが接続されている他の矩形の中央にあることです。Javaを正しい順序で描画する

矩形とエッジの交点を描くのを避けるために、最初にエッジを描き、それをエッジの上に配置して交差を隠すようにします。

この問題は、エッジに対応していない別のノードがエッジに沿って配置されている場合に発生します。このシナリオでは、エッジが最初に描画されるため、ノードはエッジの上に表示されます。しかし、それは私が望むものではありません。ノードの上にエッジが表示されるようにします。

画像: how it ishow it should be

最初のノードを描き、その後、それが接続されている2つのノードとエッジの交差を回避辺を描くようになり、この問題を解決するために私は考えることができる最も包括的な方法。しかし、私はdrawLineを使ってエッジを描くので、紙ではできません。交差点を確認することはできません。

これは私が最初にエッジを描く理由ですが、私が言及した問題が発生します。何か案は?

+0

問題は、ノードが優先度のようなものを持っていれば解けるだけで、ノードの優先度でソートすることができます。最初にノードの接続をレンダリングし、ノードをレンダリングします。フォローイングノードのために繰り返します。発注基準のようなものがない場合、正しい単一の解決策はない - あるいはむしろ正しい解決策が考えられる。 – Durandal

答えて

0

必要なのは、問題#1の解決策です。エッジの端点を矩形の中心から「移動」する必要があります。そうすれば、最後にノードを描画する必要がなくなり、自動的に問題を解決できます。

ステップ2で提案したソリューションは、接続ノードが左右にある場合にのみ機能します。それ以外の場合は、ステップ2.1で少し前進した高度な計算が必要です。

ステップ1:エッジは2つしかないPointここで、Pointはちょうどxyの値です。各エッジのxを比較して、エッジの左端と右端を見つけます。わかりやすくするため、xLeftxRightyLeft、という名前で保存します。たぶんあなたはこれのために別のものを持っているかもしれませんが、あなたはそのアイディアを得ます。

手順2:xLeftを長方形の幅の半分を右に移動し、長方形の幅の半分をxRightから引きます。

(オプション)ステップ2.1:2つの接続ノードが互いに重なっている場合は、Math.atan2(yRight-yLeft, xRight-xLeft)を使用して角度を計算できます。値が低いスペクトル(-3pi/4-pi/4の間)にある場合は、それぞれのy値に四角形の高さの半分を加算して減算します。あなたが望むなら、これを使って4つの方向すべての数学と論理を作成することができます。

ステップ3:ノードを描画した後に新しいエッジを描画します。エッジは、現在、長方形のエッジに「接続」されています。

質問をすることは自由ですが、最初にこれをコードに入れてみることをおすすめします。

関連する問題