如何部分或仅按百分比沿路径过渡

2024-06-19

我是 d3 的初学者,目前无法使用最新版本,但我使用的是 3.x 版本。

我想要实现的应该很简单,但遗憾的是我没有找到有关如何做到这一点的资源:

目标是在我的 svg 中显示一条路径。然后我想显示例如一个圆并沿着路径过渡/移动/追踪圆。如果我想要遵循完整路径,这很好用。

但我们的目标只是部分地遵循这条道路。

如果我希望圆从路径的位置 0 开始并跟随它直到例如25% 的路径?

再说一遍,如果圆圈位于 25%,我怎样才能从那里走到路径的 50%,而不从路径的位置 0 重新开始?

我将非常感谢您在这里提供的任何意见。非常感谢。


我使用 Mike Bostock 的代码(根据需要使用 D3 v3.x)构建了我的答案:https://bl.ocks.org/mbostock/1705868 https://bl.ocks.org/mbostock/1705868

首先,我创建了一个数据数组,指定how much每个圆应该沿着路径行进:

var data = [0.9, 1, 0.8, 0.75, 1.2];

这里的值以百分比表示。因此,我们有 5 个圆圈:第一个圆圈(下面演示中的蓝色)将停在路径的 90% 处,第二个圆圈(橙色)停在 100% 处,第三个圆圈(绿色)停在 80% 处,第四个圆圈(红色)的速度为 75%,第五个(演示中为紫色)将行驶 120% 的路径,也就是说,它将行驶整个路径的长度,并多行驶 20%。

然后,我改变了Bostock的功能translateAlong得到datum每个圆的:

function translateAlong(d, path) {
    var l = path.getTotalLength() * d;
    return function(d, i, a) {
        return function(t) {
            var p = (t * l) < path.getTotalLength() ?
                path.getPointAtLength(t * l) : path.getPointAtLength(t * l - path.getTotalLength());
            return "translate(" + p.x + "," + p.y + ")";
        };
    };
}

这里重要的部分是:

var l = path.getTotalLength() * d;

这将决定每个圆圈的最终位置。三元运算符很重要,因为我们最后一个圆将移动more超过路径的 100%。

最后,我们必须调用转换,传递数据和路径本身:

circle.transition()
    .duration(10000)
    .attrTween("transform", function(d) {
        return translateAlong(d, path.node())()
    });

这是演示:

var points = [
     [240, 100],
     [290, 200],
     [340, 50],
     [390, 150],
     [90, 150],
     [140, 50],
     [190, 200]
 ];

 var svg = d3.select("body").append("svg")
     .attr("width", 500)
     .attr("height", 300);

 var path = svg.append("path")
     .data([points])
     .attr("d", d3.svg.line()
         .tension(0) // Catmull–Rom
         .interpolate("cardinal-closed"));

 var color = d3.scale.category10();

 var data = [0.9, 1, 0.8, 0.75, 1.2];

 svg.selectAll(".point")
     .data(points)
     .enter().append("circle")
     .attr("r", 4)
     .attr("transform", function(d) {
         return "translate(" + d + ")";
     });

 var circle = svg.selectAll("foo")
     .data(data)
     .enter()
     .append("circle")
     .attr("r", 13)
     .attr("fill", function(d, i) {
         return color(i)
     })
     .attr("transform", "translate(" + points[0] + ")");


 circle.transition()
     .duration(10000)
     .attrTween("transform", function(d) {
         return translateAlong(d, path.node())()
     });

 // Returns an attrTween for translating along the specified path element.
 function translateAlong(d, path) {
     var l = path.getTotalLength() * d;
     return function(d, i, a) {
         return function(t) {
             var p = (t * l) < path.getTotalLength() ?
                 path.getPointAtLength(t * l) : path.getPointAtLength(t * l - path.getTotalLength());
             return "translate(" + p.x + "," + p.y + ")";
         };
     };
 }
path {
  fill: none;
  stroke: #000;
  stroke-width: 3px;
}
    
circle {
  stroke: #fff;
  stroke-width: 3px;
}
<script src="//d3js.org/d3.v3.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何部分或仅按百分比沿路径过渡 的相关文章

随机推荐

  • Unity 4.3 - 2D,如何以编程方式将精灵分配给对象

    我正在尝试创建一个对象 该对象将负责创建和显示不同的精灵 因此我想以编程方式直接访问资产 精灵 而不是在该对象下的层次结构中拖放精灵 有没有一种方法可以以编程方式创建一个新的精灵并分配我在资产文件夹中拥有的内容 我还想要一种数据结构 其中在
  • angularjs ng-repeat 在两个级别上但只有一个输出

    我有一个看起来像这样的大物体 scope marketplaces first example second example 我想做的是循环遍历大对象 如下所示 section ul li li ul section 在循环内部 再次循环每
  • 如果通过谓词则返回值,否则返回默认值

    如果某个值未通过谓词 我该如何替换它 为了显示 assert eq 3 5 but if v v lt 0 then 0 0 我以为会有一些东西Option or Result允许这样做 但我找不到它 我以为会有一些东西Option or
  • 将控制器操作处理为 JS 而不是 HTML

    所以我有以下形式 Follow 我试图
  • iOS推送通知:当应用程序处于后台时,如何检测用户是否点击了通知?

    关于这个主题有很多 stackoverflow 线程 但我仍然没有找到好的解决方案 如果应用程序不在后台 我可以检查launchOptions UIApplicationLaunchOptionsRemoteNotificationKey
  • 实现与扩展:何时使用?有什么不同?

    请用易于理解的语言进行解释或提供某些文章的链接 extends is for 延伸一类 implements is for 实施一个接口 接口和常规类之间的区别在于 在接口中您不能实现任何声明的方法 只有 实现 接口的类才能实现方法 C 中
  • 使用 JSON 文件动态更新 HTML 内容?

    我想创建一个 JS 循环 使用 jQuery 来查看 JSON 文件 并根据是否 div ids 与 JSON id 值匹配 这需要易于扩展并且无论有多少人都可以工作 div 添加了盒子 我有一个 HTML 文件 设置如下 div clas
  • 导入错误:无法导入名称“FFProbe”

    我无法获取ffprobe包 https github com simonh10 ffprobe在 Python 3 6 中工作 我使用 pip 安装它 但是当我输入import ffprobe it says Traceback most
  • TestNG并行执行

    我有 4 个 Test 方法 并且想每个方法运行 3 次 我想在 12 个线程中同时执行这一切 我创建了一个像这样的 testng xml 文件
  • C#:DataSet.readXML( "filepath" ) 如何处理包含对象内对象内对象的 XML 文件?

    我有一个 xml 文件 格式如下
  • 如何同时支持 IPv4 和 IPv6 连接

    我目前正在开发 UDP 套接字应用程序 需要构建支持 以便 IPV4 和 IPV6 连接可以将数据包发送到服务器 我希望有人能帮助我并为我指明正确的方向 我发现的大部分文档都不完整 如果您能指出 Winsock 和 BSD 套接字之间的任何
  • 如何在 Meteor 应用程序之间共享 MongoDB 集合?

    我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序 理想情况下 我希望能够拥有一个共享的 MongoDB 集合 我怎样才能做到这一点 我尝试在两个不同的应用程序中创建具有相同名称的集合 但发现 Meteor 会将数据分开 知道我能
  • 使用非英语的通用语言? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在讨论最近项目的规范和功能要求时 我们正在与领域专家讨论荷兰语的会计术语 因为整个团队和客户都是以荷兰语为母语的人 当开发开始时 我们很自然地用英语实
  • com.android.ddmlib.AdbCommandRejectedException:设备离线(即使设备已连接)

    将 Android Studio 更新到 2 1 2 后 当我进行更改时 我多次收到以下错误 com android ddmlib AdbCommandRejectedException 设备离线 安装 APK 时出错 问题是设备从未连接且
  • CSS:多属性选择器

    我想设置 电子邮件 和 密码 类型的表单输入样式 但不设置其他任何样式 我正在想象类似以下的事情 input type email type password 然而 属性选择器的工作方式似乎将其解释为 输入 其中类型同时是 电子邮件 and
  • Z 算法背后的直觉

    Z算法是一种复杂度为O n 的字符串匹配算法 一种用例是从字符串 B 中查找字符串 A 的最长出现次数 例如 overdose from stackoverflow 将会 over 您可以通过使用组合字符串调用 Z 算法来发现这一点 ove
  • 何时使用 NodeIterator

    基准 http jsperf com qsa vs node iterator比较 QSA 和 forEach vs a NodeIterator toArray document querySelectorAll div gt a kla
  • Microsoft Edge 清理会话

    Microsoft Edge 驱动程序在运行 selenium 测试时不确保干净会话 是否有一个选项可以指定所需的功能来解决此问题 今天我自己就遇到了这个问题 所以最终我让它工作的唯一方法非常简单 您必须在 Edge 设置中选中 关闭浏览器
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 如何部分或仅按百分比沿路径过渡

    我是 d3 的初学者 目前无法使用最新版本 但我使用的是 3 x 版本 我想要实现的应该很简单 但遗憾的是我没有找到有关如何做到这一点的资源 目标是在我的 svg 中显示一条路径 然后我想显示例如一个圆并沿着路径过渡 移动 追踪圆 如果我想