From 2fc9585797067730f28b03b0727bf05f9deed091 Mon Sep 17 00:00:00 2001
From: chai <215380520@qq.com>
Date: Fri, 12 May 2023 10:32:11 +0800
Subject: + worldline keepers
---
.../Assets/Scripts/Physics/PhysicsQuadtree.cs | 87 ++++++++++++++++++++++
1 file changed, 87 insertions(+)
create mode 100644 WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs
(limited to 'WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs')
diff --git a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs
new file mode 100644
index 0000000..5cd374e
--- /dev/null
+++ b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs
@@ -0,0 +1,87 @@
+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, true);
+ }
+
+ 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);
+ InsertAllObjects();
+ }
+
+ private void InsertAllObjects()
+ {
+ Vector4 bound = m_Quadtree.bound;
+ for (int i = 0; i < m_Objects.Count; i++)
+ {
+ IQuadTreeObject obj = m_Objects[i];
+ // 简单的忽略中心在边界外的object
+ if (PhysicsManager.IsPointInsideBox(bound, obj.bound.xy()))
+ {
+ m_Quadtree.Insert(obj);
+ }
+ }
+ }
+
+ public void Debug()
+ {
+ Color c = Gizmos.color;
+ Gizmos.color = Color.green;
+ 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);
+ }
+
+}
\ No newline at end of file
--
cgit v1.1-26-g67d0