如何让Microsoft Automatic Graph Layout(Rectilinear)避免重合边?
解决MSAGL直角边路由中重合边的问题
我正在使用Microsoft Automatic Graph Layout(MSAGL)的直角边路由工具处理节点间的边路由,但遇到了一个问题:工具完全不会尝试避免重合边(即多条边完全重叠的情况)。
当前生成的路由效果:
+--------+ +--------+ | Node A | | Node B | +--------+ +--------+ | | | | +-------------+ | +----------------------------+ | | Obstacle Node | | +----------------------------+ +-------------+ | | | | +--------+ +--------+ | Node X | | Node Y | +--------+ +--------+
我期望的效果是让边错开,避免重合(交叉可以接受,只要能区分边的走向):
+--------+ +--------+ | Node A | | Node B | +--------+ +--------+ | | +-+ | | +-------------+ | | +----------------------------+ | | | Obstacle Node | | | +----------------------------+ | +-------------+ +-+ | | | +--------+ +--------+ | Node X | | Node Y | +--------+ +--------+
可行的解决办法
- 调整边的偏移参数:MSAGL的
OrthogonalEdgeRouter类提供了EdgePadding参数,通过设置一个微小的偏移值(比如1-2像素),让原本重合的边在路由时自动错开。实例化路由工具时可配置该参数:var router = new OrthogonalEdgeRouter(); router.EdgePadding = 2; // 设置边之间的最小间距 router.Route(graph); - 手动添加虚拟控制点:如果自动偏移效果不理想,可以在重合边的潜在路径上手动插入微小的虚拟控制点,强制工具为不同边生成差异化的路由路径。注意需要隐藏这些虚拟节点,避免影响视觉效果。
- 扩展自定义路由逻辑:继承
OrthogonalEdgeRouter类,重写核心路由计算方法,在检测到边路径重合时主动调整拐点位置,确保边之间保持可区分的间距。 - 放宽节点位置约束:检查是否为节点设置了过于严格的固定位置约束,适当放宽限制,让布局算法有更多空间调整边的走向以避免重合。
内容的提问来源于stack exchange,提问作者Mike Nakis
相关产品推荐
相关产品推荐

