좋아, 그래서 나는 사지에 외출 중이다. 노드 (A, B, C, D)가 있고 그 사이에 선 세그먼트가 있습니다. 이것은 그래프 (V, E)로 간주 될 수 있습니다. 이것은 당신보다 나무에 더 어울릴 수 있습니다. WPF 지금
는 :
정점 클래스는 정점 클래스는 Point 형의 포인트 속성을 것이다 형 ObservableCollection에 의 가장자리 속성을 가질 것이다. Edge 클래스에는 ObservableCollection 유형의 Vertices 속성이 2가됩니다.
ViewModel에는 바인딩 할 모든 가장자리와 모든 정점 목록이 포함됩니다.
귀하의보기에서 데이터를 선으로 테스팅 할 것입니다. 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은 데이터를 올바르게 모델링하는 것으로 충분합니다. –
기대 출력은 내 질문에 업로드됩니다. 상기 참조하십시오. –