From fc2cfdad0d3cfb3844681855c1c45d9415f5ee8e Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Tue, 9 May 2023 19:28:57 +0800 Subject: *misc --- marching/Assets/Scripts/Physics/PhysicsQuadtree.cs | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 marching/Assets/Scripts/Physics/PhysicsQuadtree.cs (limited to 'marching/Assets/Scripts/Physics/PhysicsQuadtree.cs') diff --git a/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs new file mode 100644 index 0000000..cb17900 --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs @@ -0,0 +1,67 @@ +using mh; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 基于图形的四叉树 +/// +class PhysicsQuadtree +{ + public Vector4 quadtreeRange { set { m_QuadtreeRange = value; } } + private Vector4 m_QuadtreeRange; + private Quadtree m_Quadtree; + private List m_Objects = new List(); + + public PhysicsQuadtree(Vector4 range) + { + m_QuadtreeRange = range; + m_Quadtree = new Quadtree(0, range); + } + + public void AddObject(IQuadTreeObject obj) + { + m_Objects.Add(obj); + } + + public void RemoveObject(IQuadTreeObject obj) + { + m_Objects.Remove(obj); + } + + public void UpdateQuadtree() + { + m_Quadtree.Clear(false); + m_Quadtree.Rebound(m_QuadtreeRange); + for (int i = 0; i < m_Objects.Count; i++) + { + IQuadTreeObject obj = m_Objects[i]; + m_Quadtree.Insert(obj); + } + } + + public void Debug() + { + Color c = Gizmos.color; + Gizmos.color = Color.red; + m_Quadtree?.Iterate((t) => + { + Vector3 pos = new Vector3(t.x, t.y, 0); + Vector3 size = new Vector3(t.w, t.h, 1); + Gizmos.DrawWireCube(pos, size); + }); + Gizmos.color = c; + } + + public bool Retrive(ref List returnObjs, IQuadTreeObject obj) + { + return m_Quadtree.Retrieve(ref returnObjs, obj); + } + + public bool Retrive(ref List returnObjs, Vector4 bound) + { + return m_Quadtree.Retrieve(ref returnObjs, bound); + } + +} + -- cgit v1.1-26-g67d0