好的,所以我要在這裏出去。你有節點(A,B,C,D),你有他們之間的線段。這可以被視爲一個圖(V,E),它可能比樹更適合你。
現在對於WPF:
你的頂點類將有你的頂點類需要有型點的點屬性類型的ObservableCollection 的邊緣特性。 您的Edge類將具有ObservableCollection類型的Vertices屬性,該類型將爲2.
您的ViewModel將包含您將綁定到的所有邊和所有頂點的列表。
您的視圖將DataTemplate作爲一條線的邊緣。在DataTemplate中,您可以鑽入邊上的兩個頂點以獲得行的任何一端。 (你可以用你的頂點一個小橢圓。)
現在的數學:
private static Point[] Translate(Point[] points, double tX, double tY)
{
return points.Select(p => new Point(p.X + tX, p.Y + tY)).ToArray();
}
private static Point[] Rotate(Point[] points, double theta)
{
return points.Select(p =>
new Point(p.X * Math.Cos(theta) - p.Y * Math.Sin(theta),
p.X * Math.Sin(theta) + p.Y * Math.Cos(theta)))
.ToArray();
}
public Point[] RotatePointsAroundPoint(Point[] points, Point origin, double theta)
{
var tPoints = Translate(points, -origin.X, -origin.Y);
tPoints = Rotate(tPoints, theta);
return Translate(tPoints, origin.X, origin.Y);
}
public void RotateGraph(Vertex[] vertices, Point origin, double theta)
{
var points = vertices.Select(v => v.Point).ToArray();
var tPoints = RotatePointsAroundPoint(points, origin, theta);
for(var i = 0; i < vertices.Length; i++)
vertices[i].Point = tPoints[i];
}
有了這個,你只需要確定原產地和旋轉的程度。一旦您撥打電話Vertex.Point
,NotifyPropertyChanged
事件將更新View
。
我想我可能會爲你找到答案,但我希望看到你的預期輸出。你能發表第二張照片顯示旋轉的輸出嗎? –
另外,我沒有看到你的圖像是一個樹形數據結構。但是,您可能不需要布爾bLastLine。如果你對數據建模的話,Children.Count == 0就足夠了。 –
期待輸出在我的問題上傳。請參閱上文。 –