如何创建环型、树型双层布局

TWaver的Demo中有常用的环型布局和树型布局,但是当网元数量较多,又不想zoomOverView,聪明的我们自然会想到使用双层布局,整体效果既不会显得很拥挤,也能刚好充满整个窗口,如下图的效果:


实现这样布局效果实现的步骤:
1.将link个数最多的Node作为圆点或顶点。
2.分别计算所有点的位置。
查找圆点或顶点的核心代码如下:

1var sizes = [];
2 this.box.forEach(function (element) {
3     if (element instanceof  twaver.Node) {
4         sizes.push(element.getLinks().size());
5     }
6});
7 
8Array.max=function(array)
9{
10     return Math.max.apply(Math,array);
11}
12 this.box.forEach(function(element){
13    if(element instanceof  twaver.Node){
14        if(Array.max(sizes) == element.getLinks().size()){
15            <a href='http://twaver.servasoft.com/wp-content/uploads/2014/09/AutoLayoutDemo.html'>AutoLayoutDemo</a>element.setClient('center','center');
16        }
17    }
18});

圆形布局核心代码如下:

1function roundLayout() {
2             var datas = box.getDatas().toArray();
3             var size = box.getDatas().toArray().length;
4             if (window.innerWidth)
5                 winWidth = window.innerWidth;
6             else if ((document.body) && (document.body.clientWidth))
7                 winWidth = document.body.clientWidth;
8// 获取窗口高度
9             if (window.innerHeight)
10                 winHeight = window.innerHeight;
11             else if ((document.body) && (document.body.clientHeight))
12                 winHeight = document.body.clientHeight;
13             var centerX = winWidth / 2;//圆心坐标
14             var centerY = winHeight / 2;
15             var radius = 0;//半径
16             var N = 0; //total number of node
17 
18             box.forEach(function (data) {
19                 if (data.getClient('center') !== undefined) {
20                     data.setCenterLocation(centerX, centerY);
21                 }
22                 if (data instanceof  twaver.Node && data.getClient('center') == undefined) {
23                     N++;
24                 }
25             });
26 
27             var c = getCRound(N);
28             var i = 0;
29             var n = parseInt(N / c);
30             radius = network.viewRect.height / 2 / c - 30 / c;
31             if (box.getClient("radius")) {
32                 radius = parseInt(box.getClient("radius"));
33             }
34             box.forEach(function (data) {
35                 if (data instanceof  twaver.Node && data.getClient('center') == undefined) {
36                     var e = parseInt(i / n);
37                     var x = centerX + (radius * Math.pow(1.5, e) * Math.cos(Math.PI * 2 / n * i + 0.2 * e));
38                     var y = centerY + (radius * Math.pow(1.5, e) * Math.sin(Math.PI * 2 / n * i + 0.2 * e));
39                     i++;
40                     data.setCenterLocation(x, y);
41                     data.setClient('level', e);
42                 }
43             });
44         }

树型布局核心代码:

1function roundLayout() {
2             var datas = box.getDatas().toArray();
3             var size = box.getDatas().toArray().length;
4             if (window.innerWidth)
5                 winWidth = window.innerWidth;
6             else if ((document.body) && (document.body.clientWidth))
7                 winWidth = document.body.clientWidth;
8// 获取窗口高度
9             if (window.innerHeight)
10                 winHeight = window.innerHeight;
11             else if ((document.body) && (document.body.clientHeight))
12                 winHeight = document.body.clientHeight;
13             var centerX = winWidth / 2;//圆心坐标
14             var centerY = winHeight / 2;
15             var radius = 0;//半径
16             var N = 0; //total number of node
17 
18             box.forEach(function (data) {
19                 if (data.getClient('center') !== undefined) {
20                     data.setCenterLocation(centerX, centerY);
21                 }
22                 if (data instanceof  twaver.Node && data.getClient('center') == undefined) {
23                     N++;
24                 }
25             });
26 
27             var c = getCRound(N);
28             var i = 0;
29             var n = parseInt(N / c);
30             radius = network.viewRect.height / 2 / c - 30 / c;
31             if (box.getClient("radius")) {
32                 radius = parseInt(box.getClient("radius"));
33             }
34             box.forEach(function (data) {
35                 if (data instanceof  twaver.Node && data.getClient('center') == undefined) {
36                     var e = parseInt(i / n);
37                     var x = centerX + (radius * Math.pow(1.5, e) * Math.cos(Math.PI * 2 / n * i + 0.2 * e));
38                     var y = centerY + (radius * Math.pow(1.5, e) * Math.sin(Math.PI * 2 / n * i + 0.2 * e));
39                     i++;
40                     data.setCenterLocation(x, y);
41                     data.setClient('level', e);
42                 }
43             });
44         }
【微服务】Spring Aop原理深入解析 spring原理深度解析 阅读详情

相关推荐

Qt开发实战:QWebEngineView缓存路径详解与自定义配置(Windows/Linux)

本文详细解析了Qt框架中QWebEngineView组件的缓存机制,提供了Windows和Linux系统下的默认缓存路径及自定义配置方案。通过实战代码示例,展示了如何实现跨平台缓存路径管理、权限设置以及企业级应用中的多用户隔离策略,帮助开发者有效管理Web内容缓存,提升应用性能和数据安全性。

weixin_42519826的博客 403

复杂网络特征与networkx实现------(二)

图的类型 Graph类是无向图的基类,无向图能有自己的属性或参数,不包含重边,允许有回路,节点可以是任何hash的python对象,节点和边可以保存key/value属性对。该类的构造函数为Graph(data=None,**attr),其中data可以是边列表,或任意一个Networkx的图对象,默认为none;attr是关键字参数,例如key=value对形式的属性。 MultiGra...

changzoe的博客 1万+

西门子 G120 变频器报文

G120报文

mmxxoo_xxmmp的博客 8068

networkx笔记:绘制基本网络图

绘制基本网络图 用matplotlib绘制网络图 基本流程: 1. 导入networkx,matplotlib包 2. 建立网络 3. 绘制网络 nx.draw() 4. 建立布局 pos = nx.spring_layout美化作用 最基本画图程序 import import networkx as nx #导入networkx包 import matplotlib...

小白兔的窝 1万+

硬件工程师入门进阶,一文搞懂,看这篇就对了

每家公司的datasheet都有严格的规范,及独特的风格,有时候还会穿插一些原理性的介绍,比如ADI公司的一些ADC/DAC器件资料里面,还会包含AD/DA转换的原理性讲解内容,Datasheet既可以是我们设计上的好帮手,也是学习的好资料。在出货量大的产品中,尽量减少物料种类,比如开头说的,1%的电阻不得不用,那么5%的替换成1%的,物料种类就减少一种,量就大了,能不能争取更优的价格呢?如果说前面学的是内功,那这一关,是招式、是工具的使用,原理图和PCB设计都有对应的工具,教程也很多,且比较容易上手。

一路带飞的博客 5万+

从报错到优化:一次Gauss JDBC参数限制排查实录(32767参数上限避坑指南)

本文详细记录了排查GaussDB JDBC驱动因绑定参数数量超过32767上限而抛出`PSQLException`(报错信息为`Tried to send an out-of-range integer as a 2-byte value`)的全过程。文章深入分析了该限制的底层协议原理,并提供了应用层分批查询、使用临时表以及优化业务逻辑等多种解决方案,旨在帮助开发者规避此参数上限陷阱,构建更稳健的数据访问层。

rgv23456789的博客 218

树型结构的创建

方法一: 使用单向链表的方式 DECLARE id INT --父节点的id    create table #Temp  (   id INT,   parentId INT,   name CHAR  )   insert #Temp     select id, ParentId,name     from Category     where Id = @id

Dream Space 1160

VSCode配置C/C++开发环境:从零安装MinGW-w64并运行第一个C程序

在Windows系统上搭建C语言开发环境时,很多初学者混淆编辑器、编译器与调试器的分工,导致配置过程屡屡受挫。理解VSCode作为轻量级编辑器的定位,以及MinGW-w64提供的gcc编译器在源码编译中的核心作用,是顺利完成环境配置的关键。环境变量的正确设置直接影响gcc命令能否全局调用,而C/C++插件则赋予编辑器语法高亮与智能提示能力。通过安装VSCode、配置MinGW-w64、安装插件、汉化界面并运行一个最简单的hello.c程序,就能系统掌握这套开源工具链的完整工作流。无论是用于课程学习、算法练习

weixin_42531923的博客 531

JAVA多层布局_创建环型、树型双层布局

[java]代码库实现这样布局效果实现的步骤:1.将link个数最多的Node作为圆点或顶点。2.分别计算所有点的位置。查找圆点或顶点的核心代码如下:1var sizes = [];2this.box.forEach(function (element) {3if (element instanceof twaver.Node) {4sizes.push(element.getLinks().s...

weixin_29192211的博客 194

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)安装与配置指南

本文提供了在国产海光C86处理器平台上安装与配置Kylin Desktop V10 SP1操作系统的详细指南。内容涵盖从下载专用镜像、制作启动盘、BIOS关键设置、磁盘分区方案,到系统安装后的驱动优化、必备软件安装及常见故障排除,旨在帮助用户顺利完成hygon c86平台的系统部署与优化。

tree的博客 1355

零基础快速学习 ABAP 读者意见反馈和下一步写作计划表

大家在学习教程过程中,如果有任何关于 SAP ABAP 开发方面想了解的内容,可以直接在教程各篇文章下评论留言,我会将大家的意见统一汇总到下面的表格,作为我更新教程的内容参考来源之一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4270

TWaver 3D应用于大型数据中心(续)

在2014年11月份,我们当时发了一篇有关TWaver HTML5 3D应用于大型数据中心的文章,该blog比较详细的描述一些常用的功能的实现方法,比如:动态添加机柜,告警,温度,湿度等相关的功能的具体实现。其实会用这些东西的话基本上可以使用我们的TWaver HTML5 3D来实现相关的应用了,可是在有些客户觉得这还不够“动态”,都是代码一下生成的,少了一些交互,前些天同事说要不再加点功能,让...

subnetwork的专栏 2656

【2024-06-21】网易互娱秋招实习笔试三道编程题解

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。作者@TechGuide【全网同名】

试问道几许 1055

HTML5数据可视化第二弹:打造最美3D机房

最近项目开发任务告一段落,刚好有时间整理这大半年的一些成果。使用html5时间还不久,对js的认识还不够深入。没办法,以前一直搞java,对js的一些语言特性和概念一时还转换不过来。   上一篇第一弹介绍了项目中做的一个彩虹爆炸图,主要用了 html5的canvas的2d绘制技术。这一回我想介绍一下项目中的一个亮点技术:html5的3D,以及如何用它打造精美的3D机房监控系统。   目...

subnetwork的专栏 2044

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HTML5流程图之复杂关系网

关系网图的呈现方式多种多样,今天我们给大家分享的是和弦式的关系网图,先来看看效果: 例子中我们展示的是各部门员工之间的复杂关系图。在公司内部,不仅部门内部员工之间发生着关系往来,部门和部门之间的员工也在发生这各种往来关系。如果你还是用原先的那种表格来呈现,显然很难直观看出各种关系,用图形化的拓扑呈现就会显得一目了然。好了,我们就来分析一下这张图如何用twaver实现它。首先我们要定义部门的网...

subnetwork的专栏 1579

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

HTML5数据可视化第三弹:萌萌哒拓扑图分组

前言   最近忙着给客户折腾一个复杂的多层嵌套关系。客户一句话“要好看!”,哥就忙白了头啊,还好最终搞定了。   需求描述   先简单描述下这次客户的需求。 现实应用中,网络拓扑图结构可能很简单,也可能非常复杂。 比如这种节点较多的单层拓扑: 稍复杂一些的:   再复杂一些的:   在这些拓扑图中常见的场景是,很多网络节点需要组成一组,这常被称为“网元组”...

subnetwork的专栏 1212

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

HTML5组织结构图之名片式网元布局

组织结构图(Organization chart)是企业的流程运转、部门设置及职能规划等最基本的结构依据。和客户交流时,不少人都提到需要一个灵活的工具来绘制呈现企业的组织架构,今天就给大家带来一款用TWaver实现的组织结构图,提供多种布局方式,为了清晰呈现组织里每个人的职能,我们定制了名片样式来展示网元。首先来看下整体的效果,是上下布局的样式: 也可以调整为圆形布局:   这些布局...

subnetwork的专栏 855

TWaver动画之雷达扫描效果

UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上的设计,而忽略了UI。在这个“看脸”的时代,就算产品的功能很强大,如果UI跟不上步伐,你的产品都会在客户心中大打折扣。做安全和监控的项目中经常会进行扫描,一般会用一个gif图片来表示软件正在进行扫描,但是如果想更换这个图标的样式,就需要美工重新做图。TWaver提供了动画效果,如果对图标的动画样式不满意,可以通过简单的更改程序来实现,避...

subnetwork的专栏 695

如何允许WebGL从本地载入资源

随着mono-design不断推广,用户越来越多,陆续有电话来询问“为什么3D展现的时候,是一团黑?”,针对这个问题,专门写个帖子说明原因并给出解决方案,并且在mono-design编辑器中加了判断功能,同时链接到这里,不用等到发现一团黑时,才知道出问题。 好了,言归正传,开始分析问题:当发现3D展现是一团黑的时候,在控制台如果看到“Unable to get image data from...

subnetwork的专栏 552

TWaver HTML5之树形布局

转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没有这样的感觉,一天不碰电脑,总觉得生活少点什么。今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分为不同的域,比如一级域,二级域,三级域,….N级域,而且不同域之间会有连线。对于这个需求,按照常规的想法,使用group岂不是很简单,一级域是一个group,二级域也是一个group,二级域的gro...

subnetwork的专栏 356

TWaver GIS制作穹顶之下的雾霾地图

“我不满意,我不想等待,我也不再推诿,我要站出来做一点什么。我要做的事,就在此时,就在此刻,就在此地,就在此生”。自离职央视后,沉寂许久的知名记者、主持人柴静昨日携个人视频新作 《穹顶之下》宣告归来,并在短时间内引起广泛关注。生活在这个地球上,空气质量的好坏决定这我们的健康,每个人都希望能够呼吸新鲜空气,都希望抬起头看到的是蓝天和白云,而不是灰蒙蒙的雾霾。说到雾霾,我们用TWaver GIS实现...

subnetwork的专栏 327

22万个木箱!TWaver 3D极限压榨

打开个门户网站都千呼万唤,我们还能期待网页上的3D技术会有“酣畅淋漓”、“一气呵成”的感受吗?也许现在还差点火候。但是HTML5、WebGL等技术一直在飞速的发展,可能很快你就会惊讶它的能力。现在,我们就试试TWaver的3D能显示多少个木箱子,透明的木箱子。数据量当然要大才行,10万个怎么样?干脆试试20万好了,具体说是60的立方矩阵=60x60x60=216000个。只有压榨到极限才能了解...

subnetwork的专栏 281

在MONO Design中使用Flex3D

在项目开发组的努力下,HTML5 3D 的开发包变得越来越优秀,越来越健壮;基于HTML5 3D技术的MONO Design建模平台功能也变得越来越强大和完善,这个方便了很多使用我们HTML5 3D的用户。 但是对于使用TWaver Flex 3D的用户而言,有个小小的遗憾就是:整个MONO Design是面向HTML5 3D技术的,而不是Flex 3D的。其实不然,虽然MONO Design本...

subnetwork的专栏 271

用TWaver HTML5定制五彩斑斓的链路

最近有客户提到自定义链路的需求,个人感觉非常有代表意义,现在共享出来给大家参考一下。先来看看需求:1.  链路要分成两半,用两种颜色填充。2.  填充百分比在不同值域时,用不同颜色。3.  显示刻度4.  有个开关,可以控制链路变短,变短后,链路只画开始和结束部分(相当于原始链路的缩影),中间不画 5.  如果有多条链路,链路合并后两端分别显示这些链路中的最高填充百分比合并前: 合并后: 6...

subnetwork的专栏 258

在TWaver的Tree节点上画线

论坛上有同学提出如何在tree上画引导线,之前我们Flex已经实现此功能,现在最新版的HTML5也将添加此功能。先看看效果:详细的使用方法可以参考我们开发手册中可视化视图组件#Tree引导线一章,下面贴出一个Demo,没有图标,没有框选。仅供参考:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18...

subnetwork的专栏 253
上一篇: 如何创建发光的环路
下一篇: 赛瓦软件参加2014中国国际信息通信展
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值