在2D绘图中维护和刷新连接

时间:2013-03-20 19:15:26

标签: c# algorithm graph-algorithm

我搜索了 2D,绘图,算法这样的关键字,但是没有找到或至少注意到这可能是SOF上的重复,所以请让我知道然后我会很乐意删除它是为了遵循StackOverFlow政策!

长话短说,我需要知道是否有人使用或了解用于在画布上移动2D矩形的优化算法。 (目前我们正在使用WPF)

这是我们的代码,我们的问题是在节点/点连接的移动对象与使用鼠标移动的矩形。考虑用户抓住节点的情况,让我们说出右下角并将其拖到画布上。

矩形移动正常但是当它有其他形状连接到它时,例如另一个矩形,直线或圆形。目前它出错了,设计/草图变形了。

我想,为了澄清我的问题,或许我应该问一下:哪种算法或哪种数据结构可以帮助我跟踪和维护其他链接形状与此矩形的连接?

注意:好的,我需要在这里添加的一件事是我们的代码在所有情况下工作正常但是,我们注意到当我们的形状或绘图变得复杂时,整个设计或对象占用太多时间。 我们在之前的版本中做了什么(直到矩形)连接两条线,其中列表将存储所有连接信息,因此对于矩形,我们将信息存储在线的每个起点和终点。 但是,在新版本(正在开发)中,我们使用Point类中的对象来存储 那些信息。因此,我们不是将信息存储在8个点中,而是将连接信息存储在4个点中,希望能够优化系统。现在,我们遇到了这样的连接问题,即移动矩形没有正确发生,矩形可以变成破碎的矩形甚至是单行。 请参阅随附的快照。

    public void RefreshDirectConnections()
    {
        if (!this.IsTraversed)
        {
            this.IsTraversed = true;                    
            TestDrawingCanvas canvas = this.Parent as TestDrawingCanvas;

            foreach (TestConnection con in this.Connections)
            {
                TestShapeBase shape = canvas.GetByID(con.ConnectedShapeID);


                if (!shape.IsValidMove(this.GetHandle(con.ThisHandle), con.ConnectedHandle))
                {
                    InValid = true;

                    canvas.DrawInvalidRect(this.GetHandle(con.ThisHandle));

                }
                else
                {
                    shape.MoveHandleTo(this.GetHandle(con.ThisHandle), con.ConnectedHandle);
                    shape.RefreshDrawing();                        
                }
            }
        }            
    }

enter image description here enter image description here enter image description here

1 个答案:

答案 0 :(得分:3)

维护对象/向量/事物的大多数2d和3d应用程序使用scenegraph。 该图是一种树结构,其中每个对象(根除外)都有父对象。每个子节点都有相对于它的父节点定义的位置。这使得如果你移动一个孩子,它的所有孩子都会自动移动。 如果需要,您也可以选择存储相对缩放或旋转。