void GeneratePoints() { foreach (var p in m_points) { Destroy(p); } m_points.Clear(); List <KDTree.Data> datas = new List <KDTree.Data>(); for (int i = 0; i < m_count; i++) { var go = GameObject.CreatePrimitive(PrimitiveType.Sphere); var x = Random.Range(m_rangeXMin, m_rangeXMax); var y = Random.Range(m_rangeYMin, m_rangeYMax); go.transform.position = new Vector3(x, 0, y); m_points.Add(go); datas.Add(new KDTree.Data() { x = x, y = y }); } Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); m_kdTree = KDTree.BuildTree(datas); var consume = stopwatch.ElapsedMilliseconds; UnityEngine.Debug.Log(string.Format("frame:{0} BuildKDTree consume {1}ms", Time.frameCount, consume)); }
void DrawKDTree(KDTree.TNode tree, float xMin, float xMax, float yMin, float yMax, int level) { float xSplit = 0; float ySplit = 0; if (level > LevelMax) { level = LevelMax; } Gizmos.color = m_levelColor[level - 1]; if (tree.m_split == 0) { var x = tree.m_data.x; var start = new Vector3(x, 0, yMin); var end = new Vector3(x, 0, yMax); Gizmos.DrawLine(start, end); xSplit = x; } else if (tree.m_split == 1) { var y = tree.m_data.y; var start = new Vector3(xMin, 0, y); var end = new Vector3(xMax, 0, y); Gizmos.DrawLine(start, end); ySplit = y; } if (tree.m_left != null) { if (tree.m_split == 0) { DrawKDTree(tree.m_left, xMin, xSplit, yMin, yMax, level + 1); } else if (tree.m_split == 1) { DrawKDTree(tree.m_left, xMin, xMax, yMin, ySplit, level + 1); } } if (tree.m_right != null) { if (tree.m_split == 0) { DrawKDTree(tree.m_right, xSplit, xMax, yMin, yMax, level + 1); } else if (tree.m_split == 1) { DrawKDTree(tree.m_right, xMin, xMax, ySplit, yMax, level + 1); } } }