【问题标题】:Algorithm to draw connections between nodes without overlapping nodes在没有重叠节点的情况下在节点之间绘制连接的算法
【发布时间】:2012-11-10 01:54:48
【问题描述】:

我在图中有一系列节点。节点由用户放置在特定位置。保证节点不重叠,事实上,它们之间有一个空间缓冲区。这些节点相互连接,每条边在特定点连接到一个节点。我需要在节点之间绘制边缘,以便边缘:

  • (必填)不与父节点重叠
  • (理想情况下)不会与任何节点重叠

我不担心边缘交叉。如果在 Javascript 中实现了这一点,则可以加分。我无法使用 Javascript 之外的任何库。

【问题讨论】:

  • 看看 d3.js 强制有向图布局:mbostock.github.com/d3/ex/force.html。我也认为这个 SO 答案可能会有所帮助:stackoverflow.com/questions/11397961/…
  • 从重叠的讨论中,我假设这不是图论意义上的图,具有无量纲节点。你能给例如指向图表规则的链接?
  • 节点已经放置好,所以任何重新排列节点的算法都没有帮助。我正在寻找如何在不移动节点的情况下绘制边缘。http://
  • 父节点是什么意思?您正在绘制边缘的节点?如果你从 A 到 B 画一条边,那么根据定义它会与 A 和 B 相交,不是吗?
  • 这是否意味着您并不总是想要直边?

标签: javascript algorithm graph


【解决方案1】:

一种解决方案可能是使用Bézier Curves

"一条贝塞尔曲线由一组控制点 P0 到 Pn 定义, 其中 n 称为其阶数(n = 1 表示线性,2 表示二次等)。 第一个和最后一个控制点始终是终点 曲线;但是,中间控制点(如果有)通常 不在曲线上。”

所以基本思想是使用父节点作为中间控制点。您也可以使用边缘的点作为中间控制点,以避免边缘重叠。

在 wiki 文章中你可以找到很好的 animations 解释它。

对于 javascript 实现,我查看了以下库:

但是如果你用谷歌搜索“javascript bezier library”你可以找到更多。

【讨论】:

    【解决方案2】:

    如果你熟悉 C# 和 .NET,你可以通过 ILSpy 探索 Microsoft.GLEE 库(描述为 herehere),甚至理论上将这些源保存到 .csproj,使用 @987654323 修改并重新编译它@ 到 JavaScript。

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 2020-05-05
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多