【问题标题】:d3 force directed layout - drawing links without changing the location of the nodesd3 强制定向布局 - 在不更改节点位置的情况下绘制链接
【发布时间】:2014-11-23 07:38:44
【问题描述】:

我正在尝试通过以下方式修改directed graph editor

  • 绘制链接时,它不会重新定位源节点和目标节点。相反,链接将在节点的当前位置之间绘制。

  • 当拖动现有节点时(使用 ctrl),它不会影响附加到它的任何附加节点的位置。相反,所有其他节点将保持在它们的位置,只有附加到被拖动节点的链接会根据拖动来改变它们的长度。

我尝试提供这个函数来强制链接距离:

force.linkDistance(function(link) {
   var deltaX = d.target.x - d.source.x,
    deltaY = d.target.y - d.source.y,
    dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
   return dist;
})

认为这将导致强制假设不需要重新定位链接每一侧的节点(遵循documentation)。

但是,这导致了我无法解决的运行时错误。

关于如何实现图表的这种行为的任何想法?

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    听起来您想使用fixed 选项,方法是将其设置为每个节点节点的属性,例如{ id:123, fixed:true }

    Here's a modified version

    固定节点根本不会被强制布局移动,所以除非你明确地给它们一个初始位置,否则它们只会被布局随机分配一个位置。还要注意,由于所有节点都已固定,没有真正的理由使用强制导向布局。

    【讨论】:

    • 谢谢,这个简单的添加成功了!我尝试研究更多布局(github.com/mbostock/d3/wiki/Layouts),但似乎没有一个符合我的需求(非物理图形布局)。您是否有针对该需求的更好布局选择的建议?
    • @user1147537 强制布局每秒重新计算节点位置 60 次,然后您的代码每秒将它们移动到这些位置 60 次。由于所有节点都是固定的,因此不需要这种布局和频繁的重绘。事实上,这里不需要任何布局。您可以从代码中删除任何提及“力”的内容。但是,每当添加节点/链接时,您都必须自己调用 tick() 函数。此外,force.drag 需要替换为 d3.behavior.drag()。
    • 非常感谢您的详细解释!我会根据您的建议更改我的代码。
    猜你喜欢
    • 2014-08-01
    • 2018-12-24
    • 2018-02-05
    • 2016-08-15
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多