私は素敵な放射状のツリーレイアウトをレンダリングしたいと思います。問題は、原点と目標点の角度が異なると、エッジが異なるように描画されることです。提供された画像は1つのグラフからのものなので、エッジ方向の違いによってどのように違いがあるかを見ることができます。私はポイントがビーチャカーブのコントロールポイントの世代にあると思うし、私はちょうどそれらを修正する方法を理解することはできません。放射状の木グラフのレイアウト:固定ビアカーブ
エッジの方向が何であっても、同じ方法で描画します。
これをPic1のようにどのように実現できますか? これをPic2のようにどのように実現できますか?ここでは同様
:https://bl.ocks.org/mbostock/4063550
ありがとうございました!
コード:
//draw using DrawingContext of the DrawingVisual
//gen 2 control points
double dx = target.X - source.X, dy = target.Y - source.Y;
var pts = new[]
{
new Point(source.X + 2*dx/3, source.Y),
new Point(target.X - dx/8, target.Y - dy/8)
};
//get geometry
var geometry = new StreamGeometry { FillRule = FillRule.EvenOdd };
using (var ctx = geometry.Open())
{
ctx.BeginFigure(START_POINT, false /* is filled */, false /* is closed */);
ctx.BezierTo(pts[0], pts[1], END_POINT, true, false);
}
geometry.Freeze();
//draw it
dc.DrawGeometry(DrawingBrush, DrawingPen, geometry);
UPDATE 1:Math.Atan2(前: 私は、次の式を使用してラジアン単位で前の頂点とソースとの間の角度を持っています。 Y - source.Y、source.X - prev.X); しかし、まだ私は図4のようなエッジを取得します。
UPDATE 2 branchAngle計算のための前の頂点posが私はbranchAngleとしてブランチ内のすべてのエッジ間の平均角度を取ることにした不正確です。このアプローチは、1つのbrachからのエッジが180 degマークの周りにあり、ブランチが175,176 .. -176のようなエッジ角を持つ場合に失敗します。私はこのコードを使用してすべての肯定的なものにします:
var angle = Math.Atan2(point1.Y - point2.Y, point1.X - point2.X);
while (angle < 0d)
angle += Math.PI*2;
しかし、今の角度は350,359 .. 2です。かなり計算するのはかなり難しい:)あなたは私がこれをどうやってうまくいくかアドバイスをお願いしますか?あなたは、ツリーの各枝がそれ自身の角度を持っているリンクからグラフを見ると
お返事ありがとうございますが、まだ奇妙な結果が出ます。オペアンプのアップデート1をご覧ください。 –
@Alexanderそれを残念に思って、dxとdyの計算に間違いを起こしました。 sinBをcosBに切り替え、その逆も同様です。 – Funk
編集にはタイプミスがあるようですが、branchAngleは 'Math.Atan2(prev.Y - source.Y、prev.X - source.X)'でなければなりません。 – Funk