2012-11-15 77 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:

你的頂點類將有你的頂點類需要有型點的點屬性類型的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.PointNotifyPropertyChanged事件將更新View