わかりました、だから私はここで手足を出します。ノード (A、B、C、D) があり、それらの間に線分があります。これは、ツリーよりも適している可能性がある Graph(V,E) と見なすことができます。
WPFの場合:
Vertex クラスには ObservableCollection 型の Edges プロパティがあり、Vertex クラスには Point 型の Point プロパティがあります。Edge クラスには、ObservableCollection タイプの Vertices プロパティがあり、これは 2 になります。
ViewModel には、バインドするすべてのエッジとすべての頂点のリストが含まれます。
View は、エッジを Line として 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
.