如何动态更改定向 d3.js 力布局上方向箭头的位置和大小?

2023-12-14

我目前正在我的力布局中实现箭头,如本示例中所做的那样(http://bl.ocks.org/mbostock/1153292)并且效果很好。然而,人们很快就会意识到箭头的位置和大小在这里是硬编码的,因为节点的大小永远不会改变。

我有一个图表,我动态更改节点大小,因此我希望箭头相应更新,否则它们会被节点覆盖或覆盖节点或只是不附加到节点。

我只找到一篇帖子(用箭头连接可变半径的节点)谈论这个问题。然而,它没有得到回答,并且一张海报给出的答案是让边缘结束于节点的半径而不是中心,这不是我想做的事情。这需要不断地重新计算边缘位置,考虑到我拥有的边缘数量,这是不切实际的。

我认为这会相对简单,但一直无法弄清楚。我当前正在进行的更改是将标记创建移到节点生成下方,因为否则无法获取节点大小数据,除非我想运行我正在使用的大小方法,这将是巨大的浪费处理能力(我有数百个节点)。

我正在尝试什么(粗略的例子,我的代码有点复杂)

var path = svg.append("svg:g").selectAll("path")
    .data(force.links())
  .enter().append("svg:path")
    .attr("class", function(d) { return d.target.nodeID; });

var circle = svg.append("svg:g").selectAll("circle")
    .data(force.nodes())
      .enter().append("svg:circle")
    .attr("r", nodeSize) //Dynamically determine size
    .call(force.drag);

// Per-node markers, as each node could potentially have a unique size
svg.append("svg:defs").selectAll("marker")
    .data(nodes, function(d) { return d.nodeID; })
  .enter().append("svg:marker")
    .attr("id", function(d) { return d.nodeID; })
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", function(d) { return d.r; }) //Offset by the radius of the node
    .attr("refY", 0)
    .attr("markerWidth", 6)
    .attr("markerHeight", 6)
    .attr("orient", "auto")
  .append("svg:path")
    .attr("d", "M0,-5L10,0L0,5");

//Now that we know radius data for nodes, add the arrows in
path.each(function(d) { 
    d.attr("marker-end", function(d) { return "url(#" + d.target.nodeID + ")"; })
});

有人知道解决这个问题的最佳方法吗?提前致谢!

更新:根据请求,我创建了一个 jsfiddle (http://jsfiddle.net/herbstmb/j5wJ7/)。这是一个基本的力布局,我正在尝试让动态箭头大小发挥作用。


这是一个老问题,但这是我的解决方案。这个想法是绘制连接节点的路径,使得端点位于节点的边缘而不是节点的中心。从移动专利诉讼的例子开始(http://bl.ocks.org/mbostock/1153292),我将 linkArc 方法替换为:

function drawCurve(d) {
    var sourceX = d.source.x;
    var sourceY = d.source.y;
    var targetX = d.target.x;
    var targetY = d.target.y;

    var theta = Math.atan((targetX - sourceX) / (targetY - sourceY));
    var phi = Math.atan((targetY - sourceY) / (targetX - sourceX));

    var sinTheta = d.source.r * Math.sin(theta);
    var cosTheta = d.source.r * Math.cos(theta);
    var sinPhi = d.target.r * Math.sin(phi);
    var cosPhi = d.target.r * Math.cos(phi);

    // Set the position of the link's end point at the source node
    // such that it is on the edge closest to the target node
    if (d.target.y > d.source.y) {
        sourceX = sourceX + sinTheta;
        sourceY = sourceY + cosTheta;
    }
    else {
        sourceX = sourceX - sinTheta;
        sourceY = sourceY - cosTheta;
    }

    // Set the position of the link's end point at the target node
    // such that it is on the edge closest to the source node
    if (d.source.x > d.target.x) {
        targetX = targetX + cosPhi;
        targetY = targetY + sinPhi;    
    }
    else {
        targetX = targetX - cosPhi;
        targetY = targetY - sinPhi;   
    }

    // Draw an arc between the two calculated points
    var dx = targetX - sourceX,
        dy = targetY - sourceY,
        dr = Math.sqrt(dx * dx + dy * dy);
    return "M" + sourceX + "," + sourceY + "A" + dr + "," + dr + " 0 0,1 " + targetX + "," + targetY;
}

请注意,此代码期望节点数据中包含“r”或半径属性。这相当于 jsfiddle 中的 size 属性。如果您想将链接绘制为直线,则可以返回此字符串:

return "M" + sourceX + "," + sourceY + "L" + targetX + "," + targetY;

为了将箭头点放置在正确的位置,我更改了 refX 和 refY 属性,使箭头点位于节点的边缘:

svg.append("defs").selectAll("marker")
    .data(["suit", "licensing", "resolved"])
  .enter().append("marker")
    .attr("id", function(d) { return d; })
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", 10)
    .attr("refY", 0)
    .attr("markerWidth", 6)
    .attr("markerHeight", 6)
    .attr("orient", "auto")
  .append("path")
    .attr("d", "M0,-5L10,0L0,5");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态更改定向 d3.js 力布局上方向箭头的位置和大小? 的相关文章

  • 如何将函数处理程序从控制器传递到 AngularJs 中的指令隔离范围?

    我在控制器中有以下功能 angular module app controller BodyController function this click function message alert message 我想将此函数传递到指令的
  • Web Worker 中的 RequireJS

    我正在尝试在网络工作者中使用 RequireJS 问题是我在使用它时不断收到以下错误 Uncaught Error importScripts failed for underscore at lib underscore js 我已经测试
  • 该脚本在 IE 中不起作用。我该如何修复它?

    有一个脚本可以根据用户的显示器屏幕分辨率更改页面模板 但是 它在 IE 中不起作用 请告知如何修复它 table align center tr td head td tr tr td nbsp td td nbsp td td nbsp
  • 是否有正确的方法将自定义 Javascript 添加到 ASP.NET MVC 5 页面?

    目前 我已将 jQuery 源文件添加到 ASP NET 项目的 Scripts 文件夹中 在 Layout cshtml 页面中 我包含了 Scripts jquery 2 1 1 min js 现在 我可以在我制作的每个页面上包含 jQ
  • 热成像调色板

    自热成像早期以来 红外热像仪经常使用独特的调色板 从黑色到蓝色 品红色 橙色 黄色到亮白色 这个调色板通常被称为Iron or Ironbow 这是使用前视红外相机拍摄的图像的典型假彩色可视化 来源 维基百科 术语科特 http commo
  • 如何在 Angular 中实现全局加载器

    我有一个全局加载器 其实现如下 核心模块 router events pipe filter x gt x instanceof NavigationStart subscribe gt loaderService show router
  • 为什么此 Firebase 可调用函数不返回值?

    我有一个应返回值的可调用函数 但唯一返回的是 null 以下是该功能的当前版本 我也尝试过回报第一个承诺 原来的once调用 最后在另一个then返回 GUID 在这种情况下它实际上返回了数据 但它立即返回并且 GUID 为空 我怎样才能实
  • Xml、xsl Javascript 排序

    我正在寻找一种使用 javascript 对 xml 数据进行排序的方法 并希望最终过滤掉数据 我知道这一切都可以在 xsl 文件中实现 但我想在客户端进行 我已经搜索了多个使用 javascript 进行排序的地方 但其中大部分要么太特定
  • innerText 和 html 之间的区别

    有什么区别innerText text and html innerText or text http docs jquery com Attributes text如果您使用的是 jQuery 不包含任何 HTML 标签 因此 如果您有一
  • JavaScript 语法是什么:{Ci, CC}? [复制]

    这个问题在这里已经有答案了 我正在做一些 FF 附加开发 我看到这样的语法 var Cc Ci require chrome 只是好奇这个语法是什么 以及它是否对 FF 开发或其他东西有特殊意义 这称为解构赋值 它的一个特点是JavaScr
  • 如何根据本地存储中的另一个数据响应推迟 XMLHttpRequest [重复]

    这个问题在这里已经有答案了 function to download pps compress txt from cloud server for global parameter set PPs function get pps para
  • Opera Mobile 9.7 Beta 设置焦点 [重复]

    这个问题在这里已经有答案了 我们使用手持式扫描仪将物品移入和移出库存 扫描仪运行一个 ASP 页 该页提交表单以移动项目 我们最近购买了一台运行 Windows Mobile 6 1 的新扫描仪 很快就意识到 Mobile IE 完全没用
  • 禁用 HTML 验证。如何为全局每个表单设置“novalidate”?

    我想知道是否可以做一些事情来禁用应用程序中每个表单的 HTML 验证 有什么办法可以做到这一点或者我应该添加novalidate每个表单标签的属性 看来唯一的方法是添加novalidate使用 JavaScript jQuery 为每个表单
  • Meteor:即使设置了 ANDROID_HOME 也未设置

    操作系统 Ubuntu 14 04 框架 流星1 1 0 2 应用名称 Songofy 这是输出meteor install sdk android meteor install sdk android Found Android bund
  • onDeviceReady 未在 PhoneGap hello world 应用程序中触发

    我正在尝试做一个简单的警报 测试 应用程序 但事件没有被触发 这是代码 function onLoad document addEventListener deviceready onDeviceReady false Cordova is
  • 谷歌地图的灰度

    有没有什么方法可以在不丢失任何其他功能的情况下以灰度显示 Google 地图 通过 Javascript API 嵌入 是的 他们在 api V3 中引入了StyledMaps http code google com apis maps
  • 将 async 和await 与export const 一起使用

    我无法完成这项工作 它说 await 是一个保留字 是的 当然是 而且我想使用它 怎么了 export const loginWithToken async gt return dispatch gt dispatch type SESSI
  • 带数字键的 Immutable.js 映射(包括性能测试)

    我在 React Native 应用程序中将 Immutable js 与 Redux 结合使用 元数据 例如查找表 是从服务器获取的 并作为 Immutable Map 保存在应用程序本地 查找值的键是整数 数据库中的主键 当我获取数据时
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到
  • 构造函数可以返回什么值来避免返回 this ?

    确切的情况是什么 returnJavascript 中的语句可以返回除this当使用构造函数调用时new关键词 Example function Foo return something var foo new Foo 如果我没记错的话 如

随机推荐

  • 通过 std::bind 传递右值

    我想传递一个右值std bind到 C 0x 中采用右值引用的函数 我不知道该怎么做 例如 include
  • Java、传值、引用变量

    我在理解以下示例中 Java 的 按值传递 操作时遇到问题 public class Numbers static int s ccc 7 static int t ccc 7 public static void calculate in
  • Intel 在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

    我用的是官方最新的 英特尔 64 和 IA 32 架构软件开发人员手册合并卷 1 2A 2B 2C 2D 3A 3B 3C 3D 和 4 作为了解x86 64 ISA的机器级编码的参考 第 2 卷第 2 1 3 节中提供的 ModR M 和
  • 从修订历史记录中删除特定文件

    我试图从修订历史记录中删除我无意提交的特定文件 有人可以提供一种方法来做到这一点吗 你需要使用svndumpfilter工具 该过程涉及转储您的存储库 过滤 使用svndumpfilter 你的转储文件 并将结果重新加载到新的存储库中 看本
  • 在哪里可以阅读访客信息

    UPDATE 这个问题暴露了过时的 最糟糕的方法visitors count每个人都应该避免这种情况 使用复杂的计数器 由于我没有找到令人满意的 足够简单 的解决方案 因此我想出了自己的解决方案 创建一个名为的空文件ip txt并在代码中的
  • 用python中的列表替换元素

    在Python中 用另一个列表中的元素替换列表中的元素的最佳方法是什么 例如 我有 a 1 replace this 4 我想更换replace this with 2 3 更换后必须是 a 1 2 3 4 Update 当然 可以用切片来
  • 如何复制 Azure 容器和 Blob

    我正在尝试将所有 blob 复制到不同的存储中 CloudBlobClient srcblobClient sourceStorageAccount CreateCloudBlobClient CloudBlobClient targetB
  • MapFragment:使用后退按钮后性能不佳

    我在使用时遇到性能问题MapFragment与操作栏菜单一起 当满足三个条件时就会出现该错误 Have a MapFragment实例化 从选项菜单触发片段事务 用另一个片段替换地图片段 点击后退按钮并返回到地图片段 现在性能明显下降 平移
  • 使用 ShapedDrawable 将 ColorFilter 应用于 ImageView

    我有一个ImageView with android src设置为ShapedDrawable 即一个白色圆圈 我想要的是给这个上色ImageView在运行时响应一些事件 imgView setColorFilter似乎是解决方案 但使用此
  • 使用 IP 地址从 C# HttpClient 向同一台机器发出 HTTP 请求

    基本上 我需要能够在我所在的同一台计算机上向网站发出 HTTP 请求 而无需修改主机文件来创建指向域名的指针 例如 我在一个网站上运行代码 假设 www bobsoft com 位于服务器上 我需要向位于同一服务器上的 www tedsof
  • 如何在 Sqlite 中将图像存储为 blob 以及如何检索它?

    我想将图像 来自 url 存储到 sqlite 数据库中 为此 我使用 db new DataBase getApplicationContext URL url new URL http sree cc wp content upload
  • 汇编程序不打印读取的字符串

    我编写了以下代码 允许用户输入一个数字并将其打印回来 model tiny stack 100 data userMsg db 13 10 Please enter a number dispMsg db 13 10 You have en
  • 在 Reveal.js 演示文稿末尾重复标题幻灯片

    我想在我的四开本 Reveal js 演示文稿末尾重复我的标题幻灯片 我正在寻找类似的命令title slide或其他东西 Thanks 正如我在评论中已经提到的 您可以使用一些 javascript 代码和 CSS 在演示文稿末尾自动重复
  • Node.js、WebSocket 位置问题?

    我使用 Node 监听 localhost 端口 8000 创建了一个服务器 已验证其运行正常 但我无法访问客户端上的 WebSocket Chrome 5 尝试了各种 Git 存储库 节点 websocket socketIO 文章等的几
  • 在 Go 中解组 XML 元素的异构列表

    我有一个像这样的 XML 文档
  • 如何组织过多的 mysql 表? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我们的开发数据库现在有 263 个表 在开发过程中 我们只与少数人合作 有没有办法将所有表格组织到类似文件夹的东西中 没有办法对 MySQL 有意义的分层组织表 正如其他人所指出的 您
  • 带有发布请求的 swift3 webview

    我正在运行一个学校项目 我是 swift3 的新人 通过搜索 我知道如何将数据从一个视图传递到另一个视图 将数据从 tableview 传递到 webview 在上面的帖子中 他使用 http get 请求将数据传递到网站 然后重新加载 w
  • 机械化和 JavaScript

    我想使用 Mechanize 来模拟浏览具有活动 JavaScript 的网页 包括 DOM 事件和 AJAX 但到目前为止我还没有找到这样做的方法 我查看了一些支持 JavaScript 的 Python 客户端浏览器 例如 Spynne
  • 缺少当前文件夹 Capistrano Rails 3.2

    我需要了解为什么 capistrano 不创建当前文件夹 我正在使用以下命令 cap deploy setup cap deploy check cap deploy 但是当我检查我的应用程序目录时 我没有当前文件夹 这是我的deploy
  • 如何动态更改定向 d3.js 力布局上方向箭头的位置和大小?

    我目前正在我的力布局中实现箭头 如本示例中所做的那样 http bl ocks org mbostock 1153292 并且效果很好 然而 人们很快就会意识到箭头的位置和大小在这里是硬编码的 因为节点的大小永远不会改变 我有一个图表 我动