Güzel radyal ağaç yerleşimi oluşturmak ve biraz kavisli kenarları ile tökezlemek istiyorum. Sorun, kaynak ve hedef noktaları arasındaki farklı açılarda kenarların farklı şekilde çizilmesidir. Sağlanan resimler tek grafikten, böylece farklı kenar yönleri için nasıl farklı olduklarını görebilirsiniz. Bence nokta beizer eğrisi kontrol noktalarının üretilmesinde ve bunların nasıl düzeltileceğini anlayamıyorum.Radyal ağaç grafik düzeni: düzeltmek berat eğrileri
Kenarların yönü ne olursa olsun aynı şekilde çizilmelerini istiyorum.
Bunu Pic1'deki gibi nasıl yapabilirim? Pic2'deki gibi bunu nasıl yapabilirim? Burada gibi
: https://bl.ocks.org/mbostock/4063550
teşekkür ederiz!
Kodu:
//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);
GÜNCELLEME 1: Math.Atan2 (önceki: Ben aşağıdaki formül kullanılarak radyan önceki tepe noktası ve kaynağı arasındaki açıyı var. Y - source.Y, source.X - prev.X); Ama yine de kenarları Pic.4'de görüyorum.
GÜNCELLEME 2 branchAngle hesaplanması için önceki köşe konum yüzden branchAngle gibi bir dal tüm kenarları arasında bir ortalama açı almaya karar tutarlı. Bu yaklaşım, bir brachin kenarları 180 derece işareti civarında olduğunda ve şube 175, 176 .. -176 gibi kenar açılarına sahip olduğunda başarısız olur!
var angle = Math.Atan2(point1.Y - point2.Y, point1.X - point2.X);
while (angle < 0d)
angle += Math.PI*2;
Ama şimdi açıları 350, 359 .. 2 olabilir !!!: Ben hepsini olumlu yapmak için bu kodu kullanın Ortalama olarak hesaplamak oldukça zor :) Bu konuda nasıl çalışabilirim?
Cevabınız için teşekkürler, ancak yine de garip sonuçlar alıyorum, lütfen op. –
@Alexander bu konuda üzgün, dx ve dy calc bir hata yaptı. CosB ile anahtarlanmış sinB ve tersi. – Funk
Düzenlemenizde bir yazım hatası var gibi görünüyor, branchAngle 'Math.Atan2 (prev.Y - source.Y, prev.X - source.X) 'olmalıdır. – Funk