d3碰撞源码分析

2023-10-27

技术

d3、 d3.force、d3.geom.quadtree。

d3.geom.quadtree

四叉树的应用:图像处理、空间数据索引、2D中的快速碰撞检测、存储稀疏数据等,游戏编程。

上图中的数据就是普通的点,点与点之间没有关系。此函数在构建四叉树的时候(原数据要么是树型的数据要么是包含位置信息的点,此例子是包含位置信息的普通的点),整个rect是一个根节点,当这个节点内部的有大于一个数据点的时候,会对这个节点进行四等分,持续下去直到每个叶子节点至多包含一个数据点。引用: https://www.sypopo.com/post/dJQbeP8Zoj/ 

四叉树碰撞应用(圆)

d3官方example:

 1 <!DOCTYPE html>
 2 <meta charset="utf-8">
 3 <body>
 4 <script src="//d3js.org/d3.v3.min.js"></script>
 5 <script>
 6 
 7     var width = 960,
 8         height = 500;
 9 
10     var nodes = d3.range(200).map(function() { return {radius: Math.random() * 12 + 4}; }),
11         root = nodes[0],
12         color = d3.scale.category10();
13 
14     root.radius = 0;
15     root.fixed = true;
16 
17     var force = d3.layout.force()
18         .gravity(0.05)
19         .charge(function(d, i) { return i ? 0 : -2000; })
20         .nodes(nodes)
21         .size([width, height]);
22 
23     force.start();
24 
25     var svg = d3.select("body").append("svg")
26         .attr("width", width)
27         .attr("height", height);
28 
29     svg.selectAll("circle")
30         .data(nodes.slice(1))
31         .enter().append("circle")
32         .attr("r", function(d) { return d.radius; })
33         .style("fill", function(d, i) { return color(i % 3); });
34 
35     force.on("tick", function(e) {
36         var q = d3.geom.quadtree(nodes),
37             i = 0,
38             n = nodes.length;
39 
40         while (++i < n) q.visit(collide(nodes[i]));  //n^2的复杂度
41 
42         svg.selectAll("circle")
43             .attr("cx", function(d) { return d.x; })
44             .attr("cy", function(d) { return d.y; });
45     });
46 
47     svg.on("mousemove", function() {
48         var p1 = d3.mouse(this);
49         root.px = p1[0];
50         root.py = p1[1];
51         force.resume();
52     });
53 
54     function collide(node) {
55         var r = node.radius + 16,
56             nx1 = node.x - r,
57             nx2 = node.x + r,
58             ny1 = node.y - r,
59             ny2 = node.y + r;
60         return function(quad, x1, y1, x2, y2) {
61             if (quad.point && (quad.point !== node)) {//是叶子节点且不是当前节点
62                 var x = node.x - quad.point.x,
63                     y = node.y - quad.point.y,
64                     l = Math.sqrt(x * x + y * y),
65                     r = node.radius + quad.point.radius;
66                 if (l < r) {
67                     l = (l - r) / l * .5;
68                     node.x -= x *= l;
69                     node.y -= y *= l;
70                     quad.point.x += x;
71                     quad.point.y += y;
72                 }
73             }
74             return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
75         };
76     }
77 
78 </script>

核心代码在 : L60-L71行。解释如下:

 

另平移因子S=(r-l)/(2l) ;利用勾股证明得:

因此,程序中偏移实际上是偏大了一点!不过绘制的结果还是挺好的。

经试验,对L36-L44行进行单独迭代,把上述代码中的力去掉。迭代大约30次左右,才能避免碰撞现象。其中迭代step,可以对L67行中的"l"进行适当缩放。注意避免震荡情况(l较大的时候)。

collide函数的分析

测试下面的函数:

 1 <script>
 2     function a(x){
 3         return x(1,2);
 4     }
 5     function b(x,y){
 6         console.log(x+":b:"+y);
 7     }
 8     function  c(x) {
 9         return function(a,b){
10             console.log(x+":"+a+":c:"+b);
11         }
12     }
13 
14 </script>

 结果:

可见,b 、c两种写法都是ok的,c更骚一点。

quadtree().visit()

前序遍历,关于回调函数返回值:

If the callback returns true for a given node, then the children of that node are not visited; otherwise, all child nodes are visited. 

 返回值: return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1; 

意思就是内部的node超出了quad的话,对当前quad的子节点标记为未访问(需要继续对其子节点进行调整)。

 

 

转载于:https://www.cnblogs.com/xunhanliu/p/10476777.html

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

d3碰撞源码分析 的相关文章

随机推荐

  • JavaScript属性描述符【待补充】

    前言 很多学习过vue的同学 在学习vue响应式数据 或者双向绑定 的原理时 都接触过get set Object defineProperty这句个函数 并且大概知道它们的用法 但是一提到属性描述符 大家就很陌生了 今天详细的给大家讲解一
  • c++11新特性之独占指针unique_ptr

    独占智能指针unique ptr 独占智能指针不允许其他智能指针共享内部的指针 可以通过它的构造函数初始化一个独占智能指针对象 但是不允许通过赋值将一个unique ptr赋值给另一个unique ptr unique ptr不允许复制 但
  • ns2仿真学习(二)-tcp拥塞窗口的跟踪

    本文主要处理 1 的输出结果 仿真脚本 basic1 tcl basic1 tcl simulation A R B Create a simulator object set ns new Simulator Open the nam f
  • Hadoop完全分布式集群搭建(超详细)

    目录 1 1 1 完全分布式介绍 1 1 2 平台软件说明 1 1 3 守护进程布局 1 2 1 集群搭建准备 1 2 2 总纲 1 2 3防火墙关闭 1 2 4 主机映射 1 2 5 免密登陆 1 2 6 jdk安装和hadoop安装及环
  • MySQL优化浅析

    1 场景简介 最近在使用Storm做日志的分析处理 众所周知 Storm是流式的处理框架 也就是每次只能处理和看到一条日志 然而做分析的时候 不可避免的要进行一些统计操作 如统计一分钟内某个ip的访问频率或者某个uid的访问频率等 于是我就
  • jquery html 清除样式,jquery怎么移除css样式

    jquery移除css样式的方法 1 通过使用 removeClass 方法去除css样式 2 通过使用 attr 方法或 css 去除单个css样式 本文操作环境 Windows7系统 jquery3 2 1版 DELL G3电脑 1 使
  • mybatis框架下select带in批量查询,返回结果集顺序与in不一致问题

    mybatis框架下select带in批量查询 返回结果集无序问题
  • 使用mybatis时paramType传入参数总结

    mybatis中SQL接受的参数分为 1 基本类型 2 对象 3 List 4 数组 5 Map 无论传哪种参数给mybatis 他都会将参数放在一个Map中 如果传入基本类型 变量名作为key 变量值作为value 此时生成的map只有一
  • Unhandled exception: Unable to determine ZooKeeper ensemble

    zookeeper hbase开启并正常 但是运行报错 17 04 24 20 13 23 ERROR master HMaster Region server icosa4 60020 1493045002304 reported a f
  • 金蝶,「起舞」在大模型时代

    在过去的几年时间里 基于EBC的平台能力 金蝶已经走出了一个新的进化之路 这条路是对自身产品竞争力的重新构建 也更是对企业数字化转型需求的更大程度满足 如今 苍穹GPT大模型更是让这种竞争力和服务力更向前一步 作者 皮爷 出品 产业家 6个
  • 2016腾旭研发工程师笔试题

    用C C 代码算出满足上述条件的值 我们首先来分析一下 step0 我们可以得到如下方程 step1 由方程 1 3 6 可得 我们可以把x1 x5 x6看成自变量 x2 x8 x7看成对应的函数 这样只要x1 x5 x6确定了 x2 x8
  • 常见的垃圾回收机制总结

    如何工作 在某些 Java 虚拟机中 堆的实现截然不同 它更像一个传送带 每分配一个新对象 它就向前移动一格 这意味着对象存储空间的分配速度特别快 Java 的 堆指针 只是简单地移动到尚未分配的区域 所以它的效率与 C 在栈上分配空间的效
  • (Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

    1 代码功能 输入 一个字符串 输出 codeword 码值 codeword所占的位数 2 代码框图 3 代码超详解 统计字符串中的字符种类 调用函数 放入数组b中 b unique str1 统计每种字符的个数 放入数组a中 for i
  • PTA L1-016 查验身份证(详解)

    前言 本期是关于查验身份证的详解 内容包括四大模块 题目 代码实现 大致思路 代码解读 今天你c了吗 题目 一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为
  • 计算机网络(第七版)谢希仁编著(转载请注明出处---https://www.cnblogs.com/qingl)...

    计算机网络复习 第七版 谢希仁编著 转载请注明出处 https www cnblogs com qingl 第一章 P39 1 15 假定网络的利用率达到了90 试估算一下现在的网络时延是它的最小值的多少倍 解 设网络利用率为U 网络时延为
  • 网络规划设计与综合布线技术详解

    一 网络工程概述 1 计算机网络及其组成 计算机网络是现代通信技术与计算机技术相结合的产物 随着计算机网络本身的发展 人们认为 计算机网络是把地理位置不同 功能独立自治的计算机系统及数据设备通过通信设备和线路连接起来 在功能完善的网络软件运
  • jQuery 绑定3种表单事件 change(value值改变),focus(获到焦点),blur(失去焦点)

    1 change 说明 元素的value值改变时 触发change事件 change事件只适用于文本框 text 文本域 textarea 下拉框 select 元素 语法 selector change function1 实例 文本框
  • 编译原理——词法分析器

    1 概述 设计 编制并调试一个简单的C语言词法分析程序 掌握利用状态转换图设计词法分析器的基本方法 利用该词法分析器完成对源程序字符串的词法分析 通过对该词法分析器的设计 加深对词法分析原理 状态转换图等编译原理知识的理解 2 使用的基本概
  • 最新bilibili怎么下载视频

    bilibili作为最火的二次元网站 很多人想下载下来 却不知道怎么下手 今天小编就来818怎么下载bilibili的视频 1 我们拿这案例来参考 https www bilibili com video av40672186 from s
  • d3碰撞源码分析

    技术 d3 d3 force d3 geom quadtree d3 geom quadtree 四叉树的应用 图像处理 空间数据索引 2D中的快速碰撞检测 存储稀疏数据等 游戏编程 上图中的数据就是普通的点 点与点之间没有关系 此函数在构