2012-11-15 2 views
0

트리/포리스트 알고리즘에 대한 기본 코딩 작업이 포함 된 프로젝트를 처리하고 있습니다.트리에 대한 경계 설정 (데이터 구조)

2D 그래픽 환경에서 선 AB, BC 및 CD 세트를 그립니다. 이 세 선분은 B 및 C 점에서 연결됩니다.

enter image description here

는 AB와 BC가 수평,의 상상 해보자하지만 CD는 수직이다.

이제 AB도 (시계 반대 방향)를 90도 회전하면 나머지 줄은 동일한 회전 각도를 따라야합니다. 이제 우리의 코드 AB와 BC는 잘 작동하지만 CD의 경우 나머지 라인을 따르지 않습니다.

enter image description here

우리는, 그러나 우리는 CD가 마지막에 또 다른 선을, 예를 들어 얻을 수 끝날 수도 있기 때문에 여기에서 고려해야 할 경계의 종류를 확인 재귀 적 방법을 필요가 없습니다 같다 :로

그래서 뭔가를 기대 DE 그래서 부울 플래그를 "bLastLine"으로 추가하는 것은 여기서 도움이되지 않습니다.

그럼 언제 줄을 끊을 수 있습니까? 사실 나무에 경계를 지정하는 방법을 알아야합니다.

감사합니다.

+0

나는 당신에게 답을 줄지 모르지만, 나는 당신의 기대 한 결과를 먼저보고 싶습니다. 회전 된 출력을 보여주는 두 번째 그림을 게시 할 수 있습니까? –

+0

또한 이미지가 트리 구조로 표시되지 않습니다. 그러나 bLastLine은 부울이 필요하지 않습니다. Children.Count == 0은 데이터를 올바르게 모델링하는 것으로 충분합니다. –

+0

기대 출력은 내 질문에 업로드됩니다. 상기 참조하십시오. –

답변

1

좋아, 그래서 나는 사지에 외출 중이다. 노드 (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을 업데이트합니다.