From 042fce5127bf17aa2746ba46026f14d29f670b77 Mon Sep 17 00:00:00 2001 From: lang Date: Thu, 8 Aug 2013 11:10:46 +0800 Subject: [PATCH] fix the velocity constraint, add some extra config --- src/chart/force.js | 31 ++++++++++++++++++++++--------- src/config.js | 6 ++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/chart/force.js b/src/chart/force.js index a3be16415..f82709964 100644 --- a/src/chart/force.js +++ b/src/chart/force.js @@ -71,7 +71,14 @@ define(function(require) { var temperature; var k; + + //- ----------外部参数 var density; + var coolDown; + var centripetal; + var initializeSize; + var attractiveness; + //- ---------- var stepTime = 1/20; @@ -97,7 +104,15 @@ define(function(require) { var minRadius = self.deepQuery([serie], 'minRadius'); var maxRadius = self.deepQuery([serie], 'maxRadius'); + // ----------获取外部参数 + attractiveness = self.deepQuery( + [serie], 'attractiveness' + ); density = self.deepQuery([serie], 'density'); + initSize = self.deepQuery([serie], 'initSize'); + centripetal = self.deepQuery([serie], 'centripetal'); + coolDown = self.deepQuery([serie], 'coolDown'); + // ---------- categories = self.deepQuery([serie], 'categories'); @@ -141,9 +156,7 @@ define(function(require) { linkShapes = []; var area = viewportWidth * viewportHeight; - var attractiveness = self.deepQuery( - [serie], 'attractiveness' - ); + // Formula in 'Graph Drawing by Force-directed Placement' k = 0.5 / attractiveness * Math.sqrt( area / nodesRawData.length ); @@ -208,7 +221,7 @@ define(function(require) { var r = radius[i]; var random = _randomInSquare( - viewportWidth/2, viewportHeight/2, 300 + viewportWidth/2, viewportHeight/2, initSize ); x = typeof(node.initial) === 'undefined' ? random.x @@ -466,7 +479,7 @@ define(function(require) { var d2 = vec2.lengthSquare(v12); vec2.normalize(v12, v12); // 100是可调参数 - var forceFactor = d2 / 100; + var forceFactor = d2 / 100 * centripetal; vec2.scale(v12, v12, forceFactor); vec2.add(nodeForces[i], nodeForces[i], v12); @@ -504,8 +517,8 @@ define(function(require) { // Damping vec2.scale(velocity, velocity, temperature); // 防止速度太大 - velocity[0] = Math.min(velocity[0], 100); - velocity[1] = Math.min(velocity[1], 100); + velocity[0] = Math.max(Math.min(velocity[0], 100), -100); + velocity[1] = Math.max(Math.min(velocity[1], 100), -100); vec2.add(p, p, velocity); nodeShapes[i].position[0] = p[0]; @@ -537,7 +550,7 @@ define(function(require) { zr.refresh(); // Cool Down - temperature *= 0.999; + temperature *= coolDown; } var _updating; @@ -558,7 +571,7 @@ define(function(require) { setTimeout(cb, stepTime); } } - setTimeout(cb, stepTime); + setTimeout(cb, stepTime * 1000); } function refresh() { diff --git a/src/config.js b/src/config.js index 2b10e26c5..a95c87fab 100644 --- a/src/config.js +++ b/src/config.js @@ -482,6 +482,12 @@ define(function() { maxRadius : 20, density : 1.0, attractiveness : 1.0, + // 初始化的随机大小位置 + initSize : 300, + // 向心力因子,越大向心力越大 + centripetal : 1, + // 冷却因子 + coolDown : 0.99, // 分类里如果有样式会覆盖节点默认样式 categories : [], itemStyle: { -- GitLab