/// <summary> /// 计算链接上结点速度 /// </summary> public void forceLink() { alpha = Math.Round(alpha, 15); for (int k = 0; k < iterations; k++) { for (int i = 0; i < Links.Count; i++) { ForceLink link = Links[i]; ForceNode source = link.source, target = link.target; double x, y, l; //计算下一步的节点速度 x = target.x + target.vx - source.x - source.vx; if (x == 0) //此处有疑问 { x = jiggle(); } y = target.y + target.vy - source.y - source.vy; if (y == 0) { y = jiggle(); } l = Math.Sqrt(x * x + y * y); l = (l - distancesLink[i]) / l * alpha * strengthsLink[i]; x *= l; y *= l; double b = bias[i]; target.vx -= x * b; target.vy -= y * b; b = 1 - b; source.vx += x * b; source.vy += y * b; } } }
/// <summary> /// 析构函数 /// </summary> /// <param name="filePath">Json文件地址</param> /// <param name="cWidth">绘图宽度</param> /// <param name="cHeight">绘图高度</param> public D3force(string filePath, double cWidth, double cHeight) { this.cWidth = cWidth; this.cHeight = cHeight; StreamReader sr = new StreamReader(filePath); string str = sr.ReadToEnd(); sr.Close(); JObject json = JObject.Parse(str); JArray jnodes = (JArray)json["nodes"]; int i = 0; foreach (var x in jnodes) { ForceNode node = new ForceNode { group = Convert.ToInt32(x["group"]), id = x["id"].ToString(), index = i, }; Nodes.Add(node); i++; } JArray jlinks = (JArray)json["links"]; int j = 0; foreach (var x in jlinks) { ForceLink link = new ForceLink { index = j, value = Convert.ToInt32(x["value"]), }; string source = x["source"].ToString(); ForceNode sn = Nodes.Find(s => s.id == source); if (sn != null) { link.source = sn; } string target = x["target"].ToString(); ForceNode tn = Nodes.Find(s => s.id == target); if (tn != null) { link.target = tn; } Links.Add(link); j++; } //初始化结点 initializeNodes(); initializeForceLink(); initializeManyBody(); }
/// <summary> /// 获取链接的默认距离 /// </summary> /// <param name="link">链接</param> /// <returns>默认距离</returns> public double defaultStrength(ForceLink link) { return(1 / Math.Min(count[link.source.index], count[link.target.index])); }