d3.js - 强制布局边界问题 V4

2024-01-08

目前我正在参与 FCC 的项目之一国家连续性 https://www.freecodecamp.com/challenges/show-national-contiguity-with-a-force-directed-graph

本质上,我能够弄清楚如何渲染标志精灵并连接节点及其链接。

我遇到的唯一问题是实施时如何表现得与 FCC 类似example https://codepen.io/FreeCodeCamp/full/xVopBo/。具体来说,我正在尝试让节点远离边界的方法,如示例中所示。

然而,我的行为却不是这样(事实上,它非常聚集,但我不知道到底有哪些属性d3.js 强制文档 V4 https://github.com/d3/d3-force/blob/master/README.md我应该调查一下)。相反,虽然节点和链接在边界附近停止,但它在那一点停止了

const width = w - (margin.left + margin.right);
const height = h - (margin.top + margin.bottom);

let flagNodes = d3.select("#canvas")
                  .append("div")
                  .classed("flag-nodes",true)


let svg = d3.select("#canvas")
              .append("svg")
              .attr("id","chart")
              .attr("width", w)
              .attr("height", h)


let chart = svg.append("g")
                .classed("display", true)
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

let simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d,i) {
      return i;
    }))
    .force("charge", d3.forceManyBody().strength(-60).distanceMax(50).distanceMin(5))
    .force("center", d3.forceCenter(width/2, height/2))
    .force("collide", d3.forceCollide().radius(35))
    // .force("centering", d3.forceCenter(,height))
    // .force("position", d3.forceX(0).strength(.01))
    // .force("position", d3.forceY(-18))


let link = chart.append("g")
        .classed("links",true)
        .selectAll("line")
        .data(data.links)
        .enter()
          .append("line")

simulation
    .nodes(data.nodes)
    .on("tick", ticked);

simulation
    .force("link")
    .links(data.links);

let node = flagNodes.selectAll(".flag-nodes")
        .data(data.nodes)
        .enter()
          .append("div")
          .attr("class", function(d,i){
            return `flag flag-${d.code}`
          })
          .call(d3.drag()
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended)
        )

node.append("title")
.text(function(d) { return d.country; });

d3.forceX(width)

//functions provided by D3.js
//
function ticked() {
    node
        .style("left", function(d) {
          let xlimit = Math.max(radius, Math.min(width - radius, d.x))
          return (xlimit) + 'px'
        })
        .style("top", function(d) {
          let ylimit = Math.max(radius, Math.min(height - radius, d.y))
          return (ylimit - 2) + 'px'
        });
    link
        .attr("x1", function(d) {
          let x1 = Math.max(radius, Math.min(width - radius, d.source.x))
          return x1;
        })
        .attr("y1", function(d) {
          let y1 = Math.max(radius, Math.min(height - radius, d.source.y))
          return y1
        })
        .attr("x2", function(d) {
          let x2 = Math.max(radius, Math.min(width - radius, d.target.x))
          return x2;
        })
        .attr("y2", function(d) {
          let y2 = Math.max(radius, Math.min(height - radius, d.target.y))
          return y2
        });
  }

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}

Codepen http://codepen.io/neotriz/pen/jrYvjJ?editors=1010


在每个刻度上,在模拟的节点上运行此函数:

fixBounds() {
    const graphNodes = this.forceSimulation.nodes();

    graphNodes.forEach((node) => {
        if (node.x - this.nodeRadius < 0) {
            node.x = this.nodeRadius;
            node.vx = 0;
        }

        if (node.y - this.nodeRadius < 0) {
            node.y = this.nodeRadius;
            node.vy = 0;
        }

        if (this.width && node.x + this.nodeRadius > this.width) {
            node.x = this.width - this.nodeRadius;
            node.vx = 0;
        }

        if (this.height && node.y + this.nodeRadius > this.height) {
            node.y = this.height - this.nodeRadius;
            node.yx = 0;
        }
    })
} 

这将导致节点卡在边界上,并且节点之间的力将导致它们远离边界。

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

d3.js - 强制布局边界问题 V4 的相关文章

随机推荐

  • 使用 Gulp 读取、重建和替换文件中的内容块的最有效方法是什么?

    我正在创建一个可以读取任何文件 php jsp html 等 定位块标签并根据块标签中的信息进行替换的系统 我将写入我的文件的代码 testObject name jonathan number 3 male true 所需更换 h1 Jo
  • 在 Visual Studio 中,我可以在调试时禁用对应用程序进行签名吗?

    在 Visual Studio 的项目属性 gt 签名选项卡中 我已使用代码签名证书对我的项目进行了签名 然而 在我的团队中 我是唯一拥有代码签名证书的人 即使我们处于多开发人员环境中 当其他开发人员尝试 开始调试 时 他们会收到以下消息
  • 编译错误 - Groovy 和 Lombok

    这是我的 Maven 命令 mvn clean compile test compile test for 这个项目 https github com prystasj lombok groovy example 但我面临着 错误 不再有标
  • 打开自定义 UITableViewCell 时在溢出菜单中显示/隐藏辅助功能元素

    我正在自定义中实现辅助功能UITableViewCell班级 我有一个相当简单的溢出菜单 里面有几个按钮 这些按钮是隐藏的 直到按下省略号按钮滑动打开并关闭溢出 在我的单元格的初始化程序中 我设置accessibilityElementsH
  • L 系统信息

    我即将启动一个大学项目 为现有项目建造一座程序城市 我想知道你们中是否有人有过编写 L Systems 的经验 并且知道我应该从哪里开始 在使用程序方法 Perlin 噪声和 fBm 之前我已经做了一些工作 所以我得到了分形意义上的 L 系
  • 使用嵌入式 Jetty 提供静态文件

    我正在尝试构建一个带有嵌入式 Jetty 的简单演示应用程序 该应用程序从 html 目录 当前工作目录的子目录 提供静态文件 这个想法是 包含演示 jar 和内容的目录可以移动到新位置并且仍然可以工作 我已经尝试过以下变体 但我不断收到
  • Dart 编辑器和 SDK(解压下载后)通常安装/移动到的文件夹是什么?

    Dart 编辑器和 SDK 解压下载后 通常安装 移动到的文件夹是什么 Applications 请遵循https dart dev get dart https dart dev get dart brew tap dart lang d
  • 查找活动的参加者

    我正在尝试显示 公共 谷歌日历中的事件 我的要求是获取与会者的数量 不一定是与会者的姓名 但是 当我使用日历 API 使用 API 密钥和 CalendarID 获取事件时 该活动缺少提到的整个与会者部分here https develop
  • grep R中列表内向量的精确匹配

    我有一个这样的列表 map tmp lt list ABC c EGF HIJ c KML ABC IOP SIN KMLLL gt grep ABC map tmp 1 1 3 gt grep ABC map tmp 1 1 by usi
  • 为什么 SignalProducer 不返回信号?

    我觉得我理解了 ReactiveCocoa 的所有基本组件 概念上 通过理解如何将所有部分连接在一起仍然有点令人困惑 例如 在阅读了有关 Signal 的内容后 我完全期望 SignalProducer 只有一个返回 Signal 的 st
  • apple/swift 中的 Swift 函数对象包装器

    看完之后 https github com rodionovd SWRoute wiki Function hooking in Swift https github com rodionovd SWRoute wiki Function
  • 自定义 ViewCell Xamarin Tableview C# 中的按钮

    再次期待您的帮助 我试图让最右侧的按钮能够删除表视图控件中的行 现在他们现在知道他们在哪一行 但我无法将此信息连接到父级 表视图中填充有自定义视单元 自定义视图单元格包含两个不同的选择器 两个输入字段和一个按钮 我还没有找到更干净的方法来执
  • NSFileManager 创建目录错误 518 NSFileWriteUnsupportedSchemeError

    我试图创建一个目录 NSError error nil NSString BIDirectory NSSearchPathForDirectoriesInDomains NSCachesDirectory NSUserDomainMask
  • Win32 - 从标准输入读取超时

    我正在尝试做一些我认为应该很简单的事情 从标准输入进行阻塞读取 但如果没有可用数据 则在指定的时间间隔后超时 在 Unix 世界中这很简单select 但这在 Windows 中不起作用 因为stdin不是插座 不创建额外线程等的下一个最简
  • 为我的第一个组件编写一个玩笑测试

    我刚刚写完第一篇Reactjs组件 我准备编写一些测试 我使用material ui s Table and Toggle 我读到jest and enzyme但我觉得我还缺少一些东西 我的组件如下所示 简化 export default
  • 拦截文件系统系统调用

    我正在编写一个应用程序 我需要拦截一些文件系统系统调用 例如 取消链接 我想保存一些文件 比如 abc txt 如果用户删除该文件 那么我需要将其复制到其他地方 所以我需要在删除 abc 之前取消链接来调用我的代码 以便我可以保存它 我已经
  • Xcode - 找不到架构 x86_64 的符号(iOS Lib)

    我正在构建一个静态库 构建设置将架构设置为 ARCHS STANDARD 显示为Standard Architectures armv7 armv7s arm64 我选择 iOS 设备构建库 然后使用模拟器 例如 iPhone Retina
  • 两个字符串的比较在android中不起作用[重复]

    这个问题在这里已经有答案了 这是我的代码 Eclipse 没有显示任何错误 程序工作正常 但它根本不完全符合我的要求 View image view danger rate ImageView findViewById R id origi
  • 如何模拟像 new Date() 这样的构造函数

    我有一个方法取决于new Date创建一个日期对象 然后对其进行操作 我正在测试操作是否按预期工作 因此我需要将返回日期与预期日期进行比较 为了做到这一点 我需要确保new Date在测试和正在测试的方法中返回相同的值 我怎样才能做到这一点
  • d3.js - 强制布局边界问题 V4

    目前我正在参与 FCC 的项目之一国家连续性 https www freecodecamp com challenges show national contiguity with a force directed graph 本质上 我能