Exemplo n.º 1
0
        private void UpTree(SimplifyTreeNode now)
        {
            if (now.Has == false)
            {
                return;
            }
            for (var i = 0; i < 4; i++)
            {
                if (now.C[i] != null && now.C[i].Flag == false)
                {
                    return;
                }
            }

            now.Flag = true;
            for (var i = 0; i < 4; i++)
            {
                if (now.C[i] == null)
                {
                    continue;
                }
                _pool.Collect(now.C[i]);
                now.C[i] = null;
            }
        }
Exemplo n.º 2
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="rect"></param>
 public void Init(Rect rect)
 {
     _head = _pool.Get(
         new int2((int)(rect.x * Resolution - rect.width / 2f * Resolution),
                  (int)(rect.y * Resolution - rect.height / 2f * Resolution)),
         new int2((int)math.ceil(rect.x * Resolution + rect.width / 2f * Resolution),
                  (int)math.ceil(rect.y * Resolution + rect.height / 2f * Resolution)));
 }
Exemplo n.º 3
0
 private void CreateChildren(SimplifyTreeNode now)
 {
     for (var i = 0; i < 4; i++)
     {
         if (now.C[i] != null)
         {
             continue;
         }
         if (i == 0 || (i == 1 && now.Max.x != now.Min.x) ||
             (i == 2 && now.Max.y != now.Min.y) ||
             (i == 3 && now.Max.x != now.Min.x && now.Max.y != now.Min.y))
         {
             CreateChildren(now, i);
         }
     }
 }
Exemplo n.º 4
0
        internal SimplifyTreeNode Get(int2 min, int2 max)
        {
            SimplifyTreeNode ret;

            if (_queue.Count > 0)
            {
                ret = _queue.Dequeue();
            }
            else
            {
                ret = new SimplifyTreeNode(Count++);
            }

            ret.Min       = min;
            ret.Max       = max;
            ret.Bounds[0] = ret.Bounds[1] = ret.Bounds[2] = ret.Bounds[3] = new int2(int.MaxValue, int.MaxValue);
            ret.C[0]      = ret.C[1] = ret.C[2] = ret.C[3] = null;
            ret.Has       = ret.Flag = false;
            return(ret);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 懒操作向下维护
        /// </summary>
        /// <param name="now"></param>
        private static void DownTree(SimplifyTreeNode now)
        {
            if (now.Flag == false)
            {
                return;
            }
            for (var i = 0; i < 4; i++)
            {
                if (now.C[i] == null)
                {
                    continue;
                }
                now.C[i].Bounds[0] = now.C[i].Min;
                now.C[i].Bounds[1] = new int2(now.C[i].Max.x, now.C[i].Min.y);
                now.C[i].Bounds[2] = new int2(now.C[i].Min.x, now.C[i].Max.y);
                now.C[i].Bounds[3] = now.C[i].Max;
                now.C[i].Flag      = true;
            }

            now.Flag = false;
        }
Exemplo n.º 6
0
        /// <summary>
        /// 创建子节点
        /// </summary>
        /// <param name="now"></param>
        /// <param name="index"></param>
        private void CreateChildren(SimplifyTreeNode now, int index)
        {
            switch (index)
            {
            case 0:
                now.C[0] = _pool.Get(now.Min, now.Min + (now.Max - now.Min) / 2);
                break;

            case 1:
                now.C[1] = _pool.Get(new int2(now.Min.x + (now.Max.x - now.Min.x) / 2 + 1, now.Min.y),
                                     new int2(now.Max.x, now.Min.y + (now.Max.y - now.Min.y) / 2));
                break;

            case 2:
                now.C[2] = _pool.Get(new int2(now.Min.x, now.Min.y + (now.Max.y - now.Min.y) / 2 + 1),
                                     new int2(now.Min.x + (now.Max.x - now.Min.x) / 2, now.Max.y));
                break;

            case 3:
                now.C[3] = _pool.Get(now.Min + (now.Max - now.Min) / 2 + new int2(1, 1), now.Max);
                break;
            }
        }
Exemplo n.º 7
0
 internal void Collect(SimplifyTreeNode node)
 {
     _queue.Enqueue(node);
 }
Exemplo n.º 8
0
 /// <summary>
 /// 区域更新操作
 /// </summary>
 /// <param name="now"></param>
 /// <param name="min"></param>
 /// <param name="max"></param>
 private void UpdateRect(SimplifyTreeNode now, in int2 min, in int2 max)