d3:Multi-Foci Force关键代码组件理解

2023-12-26

多焦点力的真正魔力就在这里完成;

function tick(e) {
    var k = .1 * e.alpha;

    // Push nodes toward their designated focus.
    nodes.forEach(function(o, i) {
        o.y += (foci[o.id].y - o.y) * k;
        o.x += (foci[o.id].x - o.x) * k;
    });

    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
}   

但我希望能对正在发生的事情进行一些澄清。

我相信 alpha 是一种力方法,它控制力停止的速率,接受 [0, 1] 范围内的值 - 较高的值会导致力缓慢停止,较低的值会更快。

然后,我们迭代原始数组,并将 x 和 y 位置(最初不存在,因此在 forEach 循环的第一次迭代中首次分配)增加 k * 焦点的 x 和 y 分量观点。

最终它们将始终朝着指定的 x 和 y 位置移动,但是我们如何保证根据这个本身基于 alpha 的 k 值将它们移动到那里呢?节点沿 x 轴和 y 轴移动的程度是否由 .1 常数控制?设置更高/更低意味着更多/更少向焦点的漂移?

最后为什么我们要变换节点呢?我会理解

node.attr("cx", function(d) { return d.x}) 和 y 相同。为什么要转型?

提前致谢。

jsfiddle -https://jsfiddle.net/hiwilson1/dL9r22ny/ https://jsfiddle.net/hiwilson1/dL9r22ny/

更新:我怀疑我的问题的最后一部分,为什么我们变换节点,是因为我们移动 g 元素而不是圆形元素,并且我们不能在 g 元素上使用 cx 和 cy 。不过,仍然不确定为什么我们将它们翻译为 d.x 和 d.y,这不会将它们从任意分配的 d.x 和 d.y 值移至有效地将这些位置加倍吗? (如果我们从 [10, 10] 开始并翻译另一个 [10, 10],我们最终会得到 [20, 20]?)


动画是由alpha。这是一个始终相同的几何级数:设置为 0.1 in.start()并在每个刻度处乘以0.99,当小于0.005时动画停止

alpha: 0.0990
alpha: 0.0980
alpha: 0.0970
alpha: 0.0961
alpha: 0.0951
alpha: 0.0941

...etc.

force.tick = function() {
    if ((alpha *= .99) < .005) {
        event.end({
            type: "end",
            alpha: alpha = 0
        });
        return true;
    }
    //other code...
};

它代表布局中的“热量”,因为它用于确定节点的速度。这类似于气体的温度,它与气体分子的平均动能成正比。 “冷却”被预编程为始终为当前“温度”的-1%。

元素的初始位置也设置在.start()充当Math.random() * size对于 x 和 y,其中 size 分别是宽度和高度。这个做完了before首先forEach in the tick功能。

function tick(e) {
    //var k = .1 * e.alpha;
  var k = .1 * e.alpha;
  log.text('alpha: ' + d3.format(".4f")(e.alpha * 1000))
    // Push nodes toward their designated focus.
    nodes.forEach(function (o, i) {
        o.y += (foci[o.id].y - o.y) * k;
        o.x += (foci[o.id].x - o.x) * k;
    });

在上文中,forEach语句中,如果元素 y 位置大于焦点 y 位置,那么它将被赋予一个较小的 y,与 x 位置类似。这意味着它们将以与距焦点的距离成正比的速度向焦点移动。比例常数k is 0.1*alpha呈几何递减k = 0.1*0.1 to k = 0.1*0.005,随着动画的进行。最终位置是其初始位置的函数,并且k以及其他重力、电荷和摩擦力。

节点是g除了其子元素的引用(定位上下文)之外没有任何定位的元素。这是包含的原点(左上角)svg元素及其位置是页面流和 CSS 定位的结果。的定位背景g元素可以通过其变换属性进行更改,并且该属性由其所有子元素继承。如果没有 g 元素,圆圈和文本元素都必须单独定位,这样工作量就减半了。如果没有变换,所有圆圈和文本都将定位在左上角的中心svg元素。

每个价格变动计算的新头寸是绝对值,而不是价值变化。

节点位置的变化为(foci[o.id].y - o.y) * k这将使他们朝着他们的焦点移动。这被“添加”到现有值(尽管它可能是负数)并存储在节点数据上(o.x and o.y), 这个说法

node.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });

使用新数据(d)来更新翻译,这仍然是相对于svg起源。它是一个转换, not a move,因此它不会相对于当前位置进行平移,而是会更改相对于当前位置的平移svg元素原点(这是元素的定位上下文)g)。因此,如果我们从 [10,10] 开始并且新的计算结果为 [10,10],则相对于之前的位置,位置将保持在 [10,10]。svg定位上下文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3:Multi-Foci Force关键代码组件理解 的相关文章

随机推荐

  • 如何计算多个经纬度数据之间的距离?

    我有1100个车站位置 经纬度 数据和10000个房屋位置 经纬度 数据 是否可以使用R代码计算每个房屋的车站与房屋之间的最短距离 我还想要为每栋房屋提供最短距离的车站 是否可以 这是一个用于查找之间质量距离的玩具示例m点和n城市 它应该直
  • 反序列化如何工作?

    据我了解 不会调用对象被序列化的类的构造函数 而是调用第一个不可序列化构造函数的无参数构造函数 现在考虑以下代码 public class SerializeDemo implements Serializable private Stri
  • 使用缩小的 JS 和 CSS 的公共条件 Razor 视图

    我正在使用 ASP NET MVC 5 来开发我的网站 我正在使用 Grunt 来缩小我的 CSS 和 JS 一切工作正常 但如果我正在发布 发布模式 或正在调试 我需要清楚地阅读我的 CSS 和 JS 我需要更改文件的路由源 像这样的东西
  • 是否有适用于组件类的 React Material-UI makeStyles() 函数的非钩子替代方案

    我在material UI的react库中使用makeStyles 函数 并收到以下错误 钩子只能在函数组件体内调用 下面是我正在使用的代码类型的示例 const useStyles makeStyles theme gt containe
  • React hooks useState 不随 onChange 更新[重复]

    这个问题在这里已经有答案了 更新的问题 如果我在滚动之前在输入字段中输入一些内容expandedprop 被设置为 true 正确 如果我向下滚动 扩展设置为 false 正确 如果我现在在输入字段中输入一些内容expanded还是fals
  • 在 IntelliJ 中同时推送到多个远程存储库

    我正在使用 gitIntelliJ IDEA 集成开发环境 https www jetbrains com idea 我有两个远程存储库 我想将我的提交推送到其中 如何同时推送到两个遥控器 有一个不错的博客文章 https www xeno
  • 如何从我的应用程序中检查比特币地址余额?

    假设在 Java 应用程序 或任何其他语言 中 如何检查比特币地址 任何地址 不一定是我的地址 的余额 我需要一个像上面那样的功能区块链信息 https blockchain info or 比特易网 http www biteasy co
  • 如何在intellij idea IDE中运行javafx应用程序

    我正在尝试运行 JavaFX 应用程序 但显示以下错误 错误 缺少 JavaFX 运行时组件 并且需要运行该应用程序 直到这一步 我无法导入JavaFX 并且我已经从 usr lib jvm java 8 openjdk amd64 完成了
  • 如何解决 SSIS 包中 OLE DB 目标中的非空约束?

    I m new to SSIS Package I want to transfer data from source to destination database which has different table structures
  • 为单个用户设置默认 PASE IBM i shell

    The PASE http www 01 ibm com support knowledgecenter ssw ibm i 72 rzalf rzalfintro htm lang en环境默认提供并使用 korn shell 这ibmp
  • Phonegap Android 无法上网

    我正在 Phonegap 中编写我的第一个应用程序 并且我一直在 Android 设备上对其进行测试 我相信我已授予适当的许可
  • C++ 构造函数/析构函数继承

    编辑 答案摘要 下面B是A的子类 这是一个术语问题 ctors 和 dtors 是not继承 从某种意义上说 B 的 ctor dtor 将not借用A的接口 一个类至少有一个构造函数 并且只有一个析构函数 Constructors B 不
  • OpenCV (c++) 多通道元素访问

    我正在尝试使用 新 OpenCV 2 0 c 版本 但其他一切都像简单的 C 版本一样 我在更改图像中的值时遇到一些问题 该图像是 CV 8UC3 for int i 0 i
  • 带 keycloak 的 Flask-OIDC - oidc_callback 默认回调不起作用

    我正在尝试在一个简单的 Flask 应用程序中使用 Flask oidc 以便通过 keycloak 添加身份验证 但是 一旦我使用有效凭据登录 它就会返回到不存在的 oidc callback Flask 日志显示了很多带有 302 结果
  • 多重继承的接口是否冗余?

    这不是关于抽象类和接口之间差异的另一个问题 因此请在投票关闭它之前三思而后行 我知道接口对于那些不支持多重继承的 OOP 语言 例如 C 和 Java 至关重要 但那些呢with多重继承 在具有多重继承的语言中 接口的概念 作为特定的语言功
  • 通过模板参数给定其长度,在编译时生成相同类型的 std::tuple

    在 C 中 如何实现带有指示元组长度的 int 模板参数的函数并生成具有该长度的 std tuple E g func lt 2 gt returns std tuple
  • 闪亮应用程序的 renderDataTable 中的列宽度,无需拉伸

    我想要一个数据表 及其所有排名 搜索和页面功能 它不会完全延伸到整个页面 并导致每列中有大量空白 理想情况下 列宽类似于 wrap 样式renderTable 我知道我可以修复相对列宽 但是 我的表将根据所选输入动态更新不同数量的列 我希望
  • 使用 FMOD 将输出保存到磁盘

    我正在使用 FMOD 播放一些声音 我想将生成的混音保存到磁盘 我一直在尝试 system gt recordStart 0 sound true 路径 但这保存了设备的麦克风输入 以某种方式 我想将扬声器输出重定向到磁盘 谢谢 Marc
  • XML 架构 - “此上下文中不支持元素”

    我的代码中的最后内容有问题 它说 http www w3 org 2001 XMLSchema http www w3 org 2001 XMLSchema 在这种情况下不支持 我该如何解决这个问题 问题截图
  • d3:Multi-Foci Force关键代码组件理解

    多焦点力的真正魔力就在这里完成 function tick e var k 1 e alpha Push nodes toward their designated focus nodes forEach function o i o y