实现矩形间正交连接器:如何生成‘感兴趣水平/垂直线段’?
嘿,我来帮你拆解一下这篇论文里的“感兴趣水平/垂直线段”怎么落地,结合你的C#代码来捋清楚思路~
搞定正交连接器的“感兴趣线段”:从论文到代码实现
先搞懂论文里的“感兴趣线段”是什么
论文里的**水平感兴趣线段(HSIs)和垂直感兴趣线段(VSIs)**其实就是画布上矩形边界里,能作为正交连接器路径“锚点”或“转折点”的线段——简单说,就是矩形的四条边(以及后续可能合并/筛选后的有效线段,先从基础的矩形边开始):
- 水平感兴趣线段(HSIs):每个矩形的上下两条边,是连接器可以水平附着或转向的基础线段
- 垂直感兴趣线段(VSIs):每个矩形的左右两条边,对应垂直方向的锚点/转向线段
这些线段是后续生成正交路径的核心基础——连接器的路径只会在这些线段的端点或交点上转折,保证全程只有水平、垂直方向的正交走向。
结合你的C#代码生成这些线段
你的代码已经在往图里添加矩形的四个顶点了,接下来只需要把这些顶点连成线段,就能得到最初的HSIs和VSIs。补全后的代码大概是这样:
foreach (var item in this.AllItems.OfType<DesignerItemViewModel>()) { #region Boundaries // 先定义矩形的四个顶点 Point topLeft = new Point(item.Left, item.Top); Point topRight = new Point(item.Left + item.Width, item.Top); Point bottomLeft = new Point(item.Left, item.Top + item.Height); Point bottomRight = new Point(item.Left + item.Width, item.Top + item.Height); // 添加顶点到图结构中 graph.AddVertex(topLeft, null); graph.AddVertex(topRight, null); graph.AddVertex(bottomLeft, null); graph.AddVertex(bottomRight, null); // 生成水平感兴趣线段(HSIs):矩形的上下两条边 // 这里假设你的graph类有专门添加线段的方法,如果没有可以用AddEdge并标记类型 graph.AddHorizontalSegment(topLeft, topRight); graph.AddHorizontalSegment(bottomLeft, bottomRight); // 生成垂直感兴趣线段(VSIs):矩形的左右两条边 graph.AddVerticalSegment(topLeft, bottomLeft); graph.AddVerticalSegment(topRight, bottomRight); #endregion }
下一步:基于这些线段生成正交路径
有了HSIs和VSIs之后,你就可以按照论文里的算法继续推进:
- 构建线段之间的连接关系:比如,一条HSI和VSI的交点,就是可以转向的节点
- 用最短路径算法(比如Dijkstra)找到从起点矩形边到终点矩形边的最优正交路径
- 后续还可以优化路径,比如去掉多余的转折点,避免路径交叉等
如果之后在路径生成阶段遇到问题,随时可以再细化讨论~
内容的提问来源于stack exchange,提问作者Ondra Rada
相关产品推荐
相关产品推荐

