C# 正交连接器布线

C# 正交连接器布线,c#,wpf,data-structures,C#,Wpf,Data Structures,我试图实现矩形之间的正交连接。矩形在画布内。我找到了这份文件。这就是我需要的,但我不知道如何生成“有趣的水平段”(或垂直段)。这是我的密码 foreach(this.AllItems.OfType()中的var项) { #区域边界 graph.AddVertex(新点(item.Left,item.Top),null); graph.AddVertex(新点(item.Left+item.Width,item.Top),null); graph.AddVertex(新点(item.Left,it

我试图实现矩形之间的正交连接。矩形在画布内。我找到了这份文件。这就是我需要的,但我不知道如何生成“有趣的水平段”(或垂直段)。这是我的密码

foreach(this.AllItems.OfType()中的var项)
{
#区域边界
graph.AddVertex(新点(item.Left,item.Top),null);
graph.AddVertex(新点(item.Left+item.Width,item.Top),null);
graph.AddVertex(新点(item.Left,item.Top+item.Height),null);
graph.AddVertex(新点(item.Left+item.Width,item.Top+item.Height),null);
#端区
#区域连接器
AddVertex(ItemHelper.GetPointForConnector(item.LeftConnector),null);
AddVertex(ItemHelper.GetPointForConnector(item.TopConnector),null);
AddVertex(ItemHelper.GetPointForConnector(item.RightConnector),null);
AddVertex(ItemHelper.GetPointForConnector(item.BottomConnector),null);
#端区
#区域水平段
//如何创建这个?
//图.加数(…);
#端区
}
编辑:


有什么想法吗?谢谢

这个问题的核心似乎是如何确定形状的位置,这样你就可以知道如何避免它们。 这些都是矩形,看起来你的线条都是水平或垂直的。 这使得避免碰撞更加简单

您可以迭代画布的子对象,以获得对所有矩形的引用。 不管什么原因,那都不方便。 显然,您有一个DesignerItemViewModel(vm),它可能对应于每个矩形。 将Canvas.Left和Canvas.Top绑定或设置为属性。 你有一个定义左上角的点。 绑定高度和宽度。 由此计算所有角的点。 然后,您可以计算出不希望连接器交叉的垂直线和水平线。 您可以通过迭代vm列表来完成这一切。 如果您的连接器必须通过其中一个的x坐标,并且它的y在顶部和底部y内,则需要重新布线。 通过计算哪一个更靠近,即底部的顶部,可以计算出重新布线。 添加一些数字,使您的线与现有矩形分开。 然后你就有了y来表示这条线

显然,要做到这一点还有很多,但我认为迭代该集合并计算出任何冲突可能就是计算正交可见性图和相交对的意思。
我可能完全错了-我没有读技术论文。

我甚至不确定我是否遵守了你的要求。你用过Visio吗?它的点显示在矩形的每一条边的中间,您可以在它们之间画线。这些可能是wpf应用程序中的装饰器。也许这是相关的,也许不是。我不确定这个解决方案是否正是我们需要的。我编辑了我的问题。你是说你的问题是从一个点到另一个点没有碰撞?是的。“正交可见性图”应该可以解决这个问题,但我不知道如何生成垂直/水平线段。1.生成有趣的水平段HI 2。生成有趣的垂直段VI 3。通过与HI和VI中的所有线段对相交来计算正交可见性图。这三个步骤应该是解决问题的方法,但我不理解你的假设,即人们会通读你链接的论文,理解它并理解你的问题的含义。如果有人这样做,你会很幸运的。
        foreach (var item in this.AllItems.OfType<DesignerItemViewModel>())
        {
            #region Boundaries

            graph.AddVertex(new Point(item.Left, item.Top), null);
            graph.AddVertex(new Point(item.Left + item.Width, item.Top), null);
            graph.AddVertex(new Point(item.Left, item.Top + item.Height), null);
            graph.AddVertex(new Point(item.Left + item.Width, item.Top + item.Height), null);

            #endregion

            #region Connectors

            graph.AddVertex(ItemHelper.GetPointForConnector(item.LeftConnector), null);
            graph.AddVertex(ItemHelper.GetPointForConnector(item.TopConnector), null);
            graph.AddVertex(ItemHelper.GetPointForConnector(item.RightConnector), null);
            graph.AddVertex(ItemHelper.GetPointForConnector(item.BottomConnector), null);

            #endregion

            #region Horizontal segments

            // how to create this?
            // graph.AddEdge(...);

            #endregion
        }