链接力
链接力根据所需的链接距离将链接的节点推到一起或分开。力的强度与链接节点的距离与目标距离之间的差异成正比,类似于弹簧力。
forceLink(links)
源代码 · 使用指定的links和默认参数创建一个新的链接力。如果links未指定,则默认为空数组。
警告
此函数不纯;它可能会改变传入的links。见link.links.
const link = d3.forceLink(links).id((d) => d.id);
link.links(links)
源代码 · 如果指定了links,则设置与该力相关联的链接数组,重新计算每个链接的距离和强度参数,并返回该力。如果links未指定,则返回当前链接数组,该数组默认为空数组。
每个链接都是一个具有以下属性的对象
source
- 链接的源节点;见simulation.nodestarget
- 链接的目标节点;见simulation.nodesindex
- links 中的零基索引,由此方法分配
为了方便起见,链接的 source 和 target 属性可以使用数字或字符串标识符来初始化,而不是对象引用;见link.id.
警告
此函数不纯;当链接力被初始化(或重新初始化,比如当节点或链接发生变化时)时,它可能会改变传入的links。任何link.source 或 link.target 属性,如果它不是对象,将被替换为对具有给定标识符的相应node的对象引用。
如果指定的links数组被修改,比如当链接被添加到模拟中或从模拟中删除时,必须使用新的(或更改后的)数组再次调用此方法,以通知力发生更改;力不会对指定的数组进行防御性复制。
link.id(id)
源代码 · 如果指定了id,则将节点 id 访问器设置为指定的函数,并返回该力。如果id未指定,则返回当前节点 id 访问器,该访问器默认为数字node.index
function id(d) {
return d.index;
}
默认的 id 访问器允许每个链接的 source 和 target 被指定为nodes数组中的零基索引。例如
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": 0, "target": 1}, // Alice → Bob
{"source": 1, "target": 2} // Bob → Carol
];
现在考虑一个不同的 id 访问器,它返回一个字符串
function id(d) {
return d.id;
}
使用此访问器,您可以使用命名的 source 和 target
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": "Alice", "target": "Bob"},
{"source": "Bob", "target": "Carol"}
];
这在用 JSON 表示图形时特别有用,因为 JSON 不允许引用。见此示例.
无论何时初始化力,比如当nodes或links发生变化时,都会为每个节点调用 id 访问器,并将节点及其零基索引传递给它。
link.distance(distance)
源代码 · 如果指定了distance,则将距离访问器设置为指定的数字或函数,重新评估每个链接的距离访问器,并返回该力。如果distance未指定,则返回当前距离访问器,该访问器默认为
function distance() {
return 30;
}
距离访问器被调用以获取每个link,并将link及其零基index传递给它。然后,生成的数字被存储在内部,这样每个链接的距离仅在力被初始化或当此方法被调用并传入新的distance时重新计算,而不是在每次应用力时重新计算。
link.strength(strength)
源代码 · 如果指定了strength,则将强度访问器设置为指定的数字或函数,重新评估每个链接的强度访问器,并返回该力。如果strength未指定,则返回当前强度访问器,该访问器默认为
function strength(link) {
return 1 / Math.min(count(link.source), count(link.target));
}
其中count(node)是一个返回以给定节点为源或目标的链接数量的函数。选择此默认值是因为它会自动降低连接到连接密集的节点的链接的强度,从而提高稳定性。
强度访问器被调用以获取每个link,并将link及其零基index传递给它。然后,生成的数字被存储在内部,这样每个链接的强度仅在力被初始化或当此方法被调用并传入新的strength时重新计算,而不是在每次应用力时重新计算。
link.iterations(iterations)
源代码 · 如果指定了iterations,则将每次应用的迭代次数设置为指定的数字,并返回该力。如果iterations未指定,则返回当前迭代次数,该次数默认为 1。增加迭代次数会大大提高约束的刚性,这对复杂结构(如晶格)很有用,但也会增加评估力的运行时成本。