Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cQuadtree.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cQuadtree_H
7 #define _INC_cQuadtree_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cPoint2.h"
13 #include "cRectT.h"
16 
17 namespace GrayLib
18 {
20 
21  struct cQuadCommon // static
22  {
25 
26  typedef double DVALUE_t;
29  };
30 
31  interface IQuadObject : public cQuadCommon
32  {
35 
36  virtual const RECTQ_t& get_QuadRect() const = 0;
37  // virtual HASHCODE_t get_HashCodeX() const; // ???
38  };
39 
40  interface IQuadVisit : public cQuadCommon
41  {
44  virtual bool ObjectIntersect(IQuadObject* pObj, const RECTQ_t& rect) = 0;
45  };
46 
48  : public cArrayPtr< IQuadObject >
49  , public IQuadVisit
50  {
53  public:
54  virtual bool ObjectIntersect(IQuadObject* pObj, const RECTQ_t& rect) override
55  {
58  ITERATE_t i = this->AddTail(pObj);
59  return(i >= 0);
60  }
61  };
62 
64  {
69 
70  public:
71  typedef cArrayPtr<IQuadObject> ARRAYOBJ_t; // HASHCODE_t?
72 
73  private:
74  static const size_t k_CAPACITY = 4;
75  RECTQ_t m_rcBoundary;
76  ARRAYOBJ_t m_aObjects;
77  cQuadtree* m_qc[4];
78 
79  protected:
80  RECTQ_t GetRect(size_t i, const POINTQ_t& ptCenter) const;
81  bool CollapseCheck(size_t i);
82 
83  public:
84  cQuadtree(RECTQ_t boundary);
85  ~cQuadtree();
86 
87  bool isEmptyQuad() const;
88  void RemoveAll();
89 
90  const RECTQ_t& get_Boundary() const
91  {
92  return m_rcBoundary;
93  }
94  bool SetBoundary(const RECTQ_t& rect, OUT ARRAYOBJ_t& aBumped);
95 
96  bool AddObject(const RECTQ_t& rect, IQuadObject* pObj);
97  bool AddObject(IQuadObject* pObj)
98  {
101  if (pObj == nullptr)
102  return false;
103  return AddObject(pObj->get_QuadRect(), pObj);
104  }
105 
106  void AddObjectGrow(IQuadObject* pObj);
107 
108  bool RemoveObject(const RECTQ_t& rect, IQuadObject* pObj);
109  bool RemoveObject(IQuadObject* pObj)
110  {
111  if (pObj == nullptr)
112  return true;
113  return RemoveObject(pObj->get_QuadRect(), pObj);
114  }
115 
116  bool VisitObjectsOverlap(const RECTQ_t& rect, IQuadVisit* pVisit) const;
117 
119  };
120 }
121 
122 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define UNREFERENCED_REFERENCE(x)
Definition: SysTypes.h:318
Definition: cQuadtree.h:50
virtual bool ObjectIntersect(IQuadObject *pObj, const RECTQ_t &rect) override
Definition: cQuadtree.h:54
Definition: cQuadtree.h:64
bool RemoveObject(IQuadObject *pObj)
Definition: cQuadtree.h:109
bool AddObject(IQuadObject *pObj)
Definition: cQuadtree.h:97
UNITTEST_FRIEND(cQuadtree)
cArrayPtr< IQuadObject > ARRAYOBJ_t
Definition: cQuadtree.h:71
const RECTQ_t & get_Boundary() const
Definition: cQuadtree.h:90
Definition: cRectT.h:552
Definition: cVecT.h:473
Definition: cArray.h:864
ITERATE_t AddTail(TYPE * newElement)
Definition: cArray.h:666
Definition: cMesh.h:22
UNITTEST2_PREDEF(cQuadtree)
interface const RECTQ_t & rect
Definition: cQuadtree.h:44
int ITERATE_t
like size_t but signed
Definition: Index.h:28
Definition: cQuadtree.h:22
double DVALUE_t
Definition: cQuadtree.h:26
cVecT2< DVALUE_t > POINTQ_t
Definition: cQuadtree.h:27
cRectFT< DVALUE_t > RECTQ_t
Definition: cQuadtree.h:28