Exemplo n.º 1
0
 /// <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;
         }
     }
 }
Exemplo n.º 2
0
        /// <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();
        }
Exemplo n.º 3
0
 /// <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]));
 }