设置树的边界(数据结构)

时间:2012-11-15 22:43:09

标签: c# wpf algorithm

我们正在处理一个项目,该项目涉及基于树/森林算法的编码工作。

在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”在这里没有用。

那么我们如何找出一条线何时结束?实际上我需要知道如何为树分配边界。

感谢。

1 个答案:

答案 0 :(得分:1)

好的,所以我在这里出去了。您有节点(A,B,C,D),并且它们之间有线段。这可以被视为图形(V,E),它可能比树更适合你。

现在为WPF:

您的Vertex类将具有ObservableCollection类型的Edges属性 您的Vertex类将具有Point类型的Point属性。 您的Edge类将具有ObservableCollection类型的Vertices属性,该属性为2。

您的ViewModel将包含您将绑定到的所有边和所有顶点的列表。

您的视图将DataTemplate作为一条线的边缘。在DataTemplate中,您将钻入边缘的两个顶点以获得线的任一端。 (您可以为Vertex使用一个小椭圆。)

现在为数学:

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