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

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


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

var sizes = [];
this.box.forEach(function (element) {
    if (element instanceof  twaver.Node) {
        sizes.push(element.getLinks().size());
    }
});

Array.max=function(array)
{
    return Math.max.apply(Math,array);
}
this.box.forEach(function(element){
   if(element instanceof  twaver.Node){
       if(Array.max(sizes) == element.getLinks().size()){
           <a href=‘http://twaver.servasoft.com/wp-content/uploads/2014/09/AutoLayoutDemo.html‘>AutoLayoutDemo</a>element.setClient(‘center‘, ‘center‘);
       }
   }
});

圆形布局核心代码如下:

 function roundLayout() {
            var datas = box.getDatas().toArray();
            var size = box.getDatas().toArray().length;
            if (window.innerWidth)
                winWidth = window.innerWidth;
            else if ((document.body) && (document.body.clientWidth))
                winWidth = document.body.clientWidth;
// 获取窗口高度
            if (window.innerHeight)
                winHeight = window.innerHeight;
            else if ((document.body) && (document.body.clientHeight))
                winHeight = document.body.clientHeight;
            var centerX = winWidth / 2;//圆心坐标
            var centerY = winHeight / 2;
            var radius = 0;//半径
            var N = 0; //total number of node

            box.forEach(function (data) {
                if (data.getClient(‘center‘) !== undefined) {
                    data.setCenterLocation(centerX, centerY);
                }
                if (data instanceof  twaver.Node && data.getClient(‘center‘) == undefined) {
                    N++;
                }
            });

            var c = getCRound(N);
            var i = 0;
            var n = parseInt(N / c);
            radius = network.viewRect.height / 2 / c - 30 / c;
            if (box.getClient("radius")) {
                radius = parseInt(box.getClient("radius"));
            }
            box.forEach(function (data) {
                if (data instanceof  twaver.Node && data.getClient(‘center‘) == undefined) {
                    var e = parseInt(i / n);
                    var x = centerX + (radius * Math.pow(1.5, e) * Math.cos(Math.PI * 2 / n * i + 0.2 * e));
                    var y = centerY + (radius * Math.pow(1.5, e) * Math.sin(Math.PI * 2 / n * i + 0.2 * e));
                    i++;
                    data.setCenterLocation(x, y);
                    data.setClient(‘level‘, e);
                }
            });
        }

树型布局核心代码:

 function roundLayout() {
            var datas = box.getDatas().toArray();
            var size = box.getDatas().toArray().length;
            if (window.innerWidth)
                winWidth = window.innerWidth;
            else if ((document.body) && (document.body.clientWidth))
                winWidth = document.body.clientWidth;
// 获取窗口高度
            if (window.innerHeight)
                winHeight = window.innerHeight;
            else if ((document.body) && (document.body.clientHeight))
                winHeight = document.body.clientHeight;
            var centerX = winWidth / 2;//圆心坐标
            var centerY = winHeight / 2;
            var radius = 0;//半径
            var N = 0; //total number of node

            box.forEach(function (data) {
                if (data.getClient(‘center‘) !== undefined) {
                    data.setCenterLocation(centerX, centerY);
                }
                if (data instanceof  twaver.Node && data.getClient(‘center‘) == undefined) {
                    N++;
                }
            });

            var c = getCRound(N);
            var i = 0;
            var n = parseInt(N / c);
            radius = network.viewRect.height / 2 / c - 30 / c;
            if (box.getClient("radius")) {
                radius = parseInt(box.getClient("radius"));
            }
            box.forEach(function (data) {
                if (data instanceof  twaver.Node && data.getClient(‘center‘) == undefined) {
                    var e = parseInt(i / n);
                    var x = centerX + (radius * Math.pow(1.5, e) * Math.cos(Math.PI * 2 / n * i + 0.2 * e));
                    var y = centerY + (radius * Math.pow(1.5, e) * Math.sin(Math.PI * 2 / n * i + 0.2 * e));
                    i++;
                    data.setCenterLocation(x, y);
                    data.setClient(‘level‘, e);
                }
            });
        }
时间: 2024-10-05 08:17:15

如何创建环型、树型双层布局的相关文章

php通用的树型类创建无限级树型菜单

生成树型结构所需要的2维数组,var $arr = array()数组格式如下: array( 1 => array('id'=>'1','parentID'=>0,'name'=>'一级栏目一'), 2 => array('id'=>'2','parentID'=>0,'name'=>'一级栏目二'), 3 => array('id'=>'3','parentID'=>1,'name'=>'二级栏目一'), 4 => arra

[HAOI2010][BZOJ2427] 软件安装|tarjan|树型dp

2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 463  Solved: 194[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(

在一个树型结构数据中,查找相邻有相同属性的节点的最大数量的方法

本文介绍的是一个在一个树型数据结构中,查找 type 属性均为 a 的相邻节点的最长链路的节点数量,如果中间有任何其他节点插在其中,那这个长度就结束了,必须是相邻的.一个最简单的示例就是在一个树型结构中,有两个节点要进行连接,但是连接的节点如果都是 type 为 a 的话,则最长不能超过5个,超过五个则节点不能进行连接. 如下图: 在进行节点之间的连接时,如过相邻的节点 type 属性均为 a 的超过五个就不能连接.假设上图的节点都有 type 属性,且都为 a ,则在连接时 2.1 节点是可以

oracle使用connect by进行级联查询 树型菜单

Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关系的,最顶级的菜单对应的parent_id为0.现假设我们拥有如下记录: id name parent_id 1 菜单01 0 2 菜单02 0 3 菜单03 0 4 菜单0101 1 5 菜单0102

HDU1561 The more, The Better(树型DP)

题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过各自分配若干的城堡去攻克转移的,一个排列组合数,阶乘,是指数级的时间复杂度! 看了题解,原来这是依赖背包,没看背包九讲..不过网上的博客似乎没说清楚,事实上这个状态应该是三个维度来表示: dp[u][

POJ3659 Cell Phone Network(树上最小支配集:树型DP)

题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. 树上的每个结点作为其子树的根可以有三个状态: 不属于支配集且还没被支配 不属于支配集但被其孩子支配 属于支配集 那么就是用dp[u][1\2\3]来表示动归的状态. 123转移该怎么转移就怎么转移..最后的结果就是min(dp[root][2],dp[root][3]). 要注意的是对于有些结点前2

网格部件和树型部件查找并定位焦点

在网格和树型部件中,经常遇到需要根据某字段值或关键值查找网格或树型中的某一行数据并定位焦点,如何实现这样的功能呢?1.网格部件查找定位:在网格部件中,我们可以根据显示数据的行数,进行循环,获取值与查找值进行对比,代码如下: for i=1 to 网格部件1.GridView.RowCount      if cstr(网格部件1.GetFieldValueByRowHandle(i-1,"姓名"))="张三" then        网格部件1.FocusedRow

HDU_1561_The more, The Better_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7031    Accepted Submission(s): 4121 Problem Description ACboy很喜欢玩一种战略游戏,

HDU_1520_Anniversary party_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8233    Accepted Submission(s): 3574 Problem Description There is going to b