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; } }
/// <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))); }
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); } } }
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); }
/// <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; }
/// <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; } }
internal void Collect(SimplifyTreeNode node) { _queue.Enqueue(node); }
/// <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)