2D拓扑的应用在电信网管和电力SCADA领域早已习以为常了,随着OpenGL特别是WebGL技术的普及,3D方式的数据可视化也慢慢从佛殿神堂步入了寻常百姓家,似乎和最近高档会所被整改为普通茶馆是一样的节奏。
3D呈现固然比2D方式更直观,但如果摆放图元布局却比2D麻烦,毕竟增加了一个维度,手工布局不如以前2D手工操作方便,因此3D的自动布局功能比2D凸显其重要性。最近玩了玩HT的弹力自动布局插件挺有意思,特别在平板上Touch方式拖拽三维空间图元节点时,对我这种控制欲较强者很有满足感。
弹力布局也不是啥新鲜玩意儿了,传统弹力布局算法都是采用通过CPU迭代运算的方式,对于海量数据特别是在纯客户端运算的方式肯定是不可行的,因此这些年也有很多采用GPU的方式进行并行计算的方式可极大提高性能,等OpenCL更成熟HT for Web提供了WebCL的解决方案我再来张开这个话题。今天的话题采用的还是CPU,只不过我把自动布局的算法拉到了Web Worker来运算,纯属为了好玩实际意义不大,毕竟Worker运算结果还得不断序列化给GUI页面层,不断来回数据传输也挺耗性能,当然如果你让Worker运行一段时间,只把最终结果push回Web层进行呈现还是有点实际意义的,毕竟不用Worker时js单线程运行,对这种计算密集型的算法只会卡死界面无法进行其他业务操作。
以下是页面部分的代码,通过new Worker('workderjs')构建Worker后台运行对象,通过worker.addEventListener('message', ..)监听后台自动布局后派发的图元位置信息进行更新,通过worker.postMessage(info)发送界面拖拽图元位置变化信息。
function reload() { var info = { A: parseInt($("A").value), B: parseInt($("B").value) }; reloadModel(dataModel, info); worker.postMessage(info); } function init() { dataModel = new ht.DataModel(); g3d = new ht.graph3d.Graph3dView(dataModel); toolbar = new ht.widget.Toolbar(items); borderPane = new ht.widget.BorderPane(); borderPane.setTopView(toolbar); borderPane.setCenterView(g3d); g3d.mi(function(evt){ if(evt.kind === 'betweenMove'){ moveMap = {}; g3d.sm().each(function(data){ if(data instanceof ht.Node){ moveMap[data._id] = data.p3(); } }); worker.postMessage({moveMap: moveMap}); } }); worker = new Worker("worker.js"); worker.addEventListener('message', function(e) { var info = e.data; for(var id in info.result){ var data = dataModel.getDataById([id]); if(data && !g3d.isSelected(data)){ data.p3(info.result[id]); } } }); reload(); }
以下是后台Work.js的代码,通过importScripts("ht.js")引入HT核心包,通过importScripts("ht-forcelayout.js")引入HT的弹力布局插件,通过importScripts("util.js")引入和页面代码共享的一些通用函数,通过self.postMessage({result: result})发送自动布局运算结果推送到页面,通过
self.addEventListener('message', ...)监听页面发过来的位置变化信息,从而实现了前后台的互通。
importScripts("ht.js"); importScripts("ht-forcelayout.js"); importScripts("util.js"); ht = self.ht; dataModel = new ht.DataModel(); forceLayout = new ht.layout.Force3dLayout(dataModel); forceLayout.onRelaxed = function(){ var result = {}; dataModel.each(function(data){ if(data instanceof ht.Node){ result[data._id] = data.p3(); } }); self.postMessage({result: result}); }; forceLayout.start(); self.addEventListener('message', function(e) { var info = e.data; if(info.moveMap){ dataModel.sm().cs(); for(var id in info.moveMap){ var data = dataModel.getDataById(id); if(data){ data.p3(info.moveMap[id]); dataModel.sm().as(data); } } } else{ reloadModel(dataModel, info); } }, false);
以下视频为在Android平板上跑3D拓扑自动布局的效果,这个例子纯粹为了玩玩Web Workers,这样折腾性能并不会提高,甚至因为来回序列化更费性能,Web Worker可以使用的场景并不太多,比较适合纯数学运算的业务逻辑,同时还需要注意跑在Worker的代码是不能操作任何界面对象,例如window和document之类的对象。
下篇《3D拓扑自动布局之Node.js篇》我们再将算法移到Node.js端玩
http://v.youku.com/v_show/id_XNjc1MjYzODg4.html
相关推荐
本压缩包包含四篇关于网络拓扑自动布局算法的论文,每篇都提供了不同的方法和视角来解决这一问题。 1. "mcguffin-2012-simpleNetVis.pdf":这篇论文可能介绍了SimpleNetVis,一个简单的网络可视化工具,可能采用了...
在工程设计领域,拓扑优化是一种非常重要的方法,它通过数学模型来寻找结构最优化的布局,以达到在满足性能要求的同时,降低重量、节省材料的目的。本话题将重点介绍如何利用MATLAB进行3D拓扑优化,以及相关的关键...
3D拓扑优化算法,经典169行代码,MATLAB语言
针对现有网络拓扑图布局算法多以节点分布均匀为目标,没有考虑边的布局,可能会导致生成的拓扑图中边布局不清晰,提出一种基于扩展力学模型的网络拓扑图布局算法。该算法通过引入点边斥力保证边布局清晰,通过节点...
NULL 博文链接:https://xhload3d.iteye.com/blog/2226706
本文将详细介绍"3DMAX一键拓扑神器"——Quad Remesher,这是一款专为3DS MAX设计的自动拓扑重构插件,能够将复杂的三角面网格转换为更利于编辑的四边面网格。 Quad Remesher 是一款高效工具,尤其对于那些需要进行...
"bbd_dude"是一款专为网络管理员和工程师设计的免费网络拓扑自动发现构建工具。它能够自动扫描并绘制出企业网络的拓扑结构,极大地简化了网络管理任务,提高了问题定位和故障排除的效率。 网络拓扑是描述网络设备、...
3D拓扑优化是一种在工程设计中广泛应用的技术,它通过数学方法寻找结构最优的几何布局,以达到在满足性能约束的同时最小化材料使用。在这个压缩包中,包含的是一款基于MATLAB开发的3D拓扑优化软件的源代码。MATLAB是...
NetworkView v3.1是一款专为网络管理员设计的局域网拓扑图自动生成器,它可以帮助用户快速、准确地描绘出网络的物理和逻辑布局。 首先,我们来深入理解什么是局域网拓扑图。局域网拓扑图是表示局域网中各个设备(如...
topology optimization 学习资料,主要涉及2d -3d 基础的拓扑优化知识,附件为论文与lsm的199行代码。欢迎大家下载学习
这段代码主要用于在Web页面上显示一个网络连接的拓扑图。 #### 代码结构解析 - **JSP 导入声明**:通过 `<%@ page import="..." %>` 语法导入所需的 Java 类库,如 `NetworkStatus`、`ArrayList` 和 `List`。 - **...
3D拓扑优化是一种在工程设计中广泛应用的技术,它通过数学方法寻找结构最优的几何布局,以达到在满足性能约束的同时最小化材料使用或重量。在这个主题中,我们主要探讨的是一个基于MATLAB实现的3D拓扑优化程序。...
可以使用经典的布局算法,如力导向布局(Fruchterman-Reingold算法)或层次布局,来自动排列节点。 7. **实时更新**:在实际应用中,网络拓扑可能需要实时反映状态变化。这就需要定期更新图形,如改变故障节点的...
自动绘制网络拓扑是一项技术,它允许系统通过编程方式生成网络结构的可视化表示,从而简化网络管理和故障排查工作。本项目是一个基于Java的实现,能够根据提供的节点信息自动生成网络拓扑图。 首先,我们需要了解...
主要针对拓扑优化结果的难以加工,为了实现设计加工一体化,提出一种类似3D打印的技术思想
**3D模型拓扑软件——Topogun** 在3D建模领域,拓扑优化是一项至关重要的技术。拓扑优化是指调整模型的面、边和顶点结构,使其更符合渲染、动画和物理模拟的需求。Topogun作为一款专业的3D模型拓扑软件,为艺术家...
在IT行业中,网络拓扑自动搜索算法是网络管理和监控领域中的关键组成部分,它涉及到网络设备的识别、连接关系的建立以及网络状态的实时反映。本文主要探讨了如何利用MIB-Ⅱ(Management Information Base II)来构建...
用户对于网管自动化拓扑的需求,主要包括支持设备全面、自动高效地生成拓扑、体现中间件/数据库连接关系、支持特殊的拓扑操作实现。针于网管自动化拓扑的需求,智和网管平台提出了自动化拓扑解决方案,通过网管平台...