00001 #ifndef QUADTREENODE_H 00002 #define QUADTREENODE_H 00003 00004 #include <set> 00005 #include "Point.h" 00006 #include <QRectF> 00007 #include <QVector2D> 00008 #include <QGraphicsRectItem> 00009 #include <QGraphicsEllipseItem> 00010 00011 namespace Elve { 00012 00013 typedef std::vector<Point*> Masses; 00014 00015 struct QuadTreeParams { 00016 qreal theta; 00017 size_t depth; 00018 size_t maxMasses; 00019 }; 00020 00021 class QuadTreeNode 00022 { 00023 public: 00024 QuadTreeNode(); 00025 void setCenterAndRadius(const QVector2D& pos, float radius); 00026 void setChild(unsigned index, QuadTreeNode* node); 00027 void setParent(QuadTreeNode* parent); 00028 00029 bool addPoint(const Point *obj, const QuadTreeParams& params); 00030 void remPoint(const Point* obj, const QuadTreeParams& params); 00031 00032 QVector2D gravityFor(const Point &m, const QuadTreeParams& params) const; 00033 bool leaf() const; 00034 00035 void reset(); 00036 bool contain(const Point *o) const; 00037 const QVector2D& getCenter() const; 00038 QVector2D CoM() const; 00039 const qreal& getRadius() const; 00040 const qreal& mass() const; 00041 const bool& downOccupied() const; 00042 void debug(QPainter* p) const; 00043 virtual ~QuadTreeNode(); 00044 private: 00045 std::vector<const Point *> &givePoints(); 00046 QVector2D trueGravity(const Point& m) const; 00047 00048 00049 QuadTreeNode* mParent; 00050 QuadTreeNode* mChildren[4]; 00051 std::vector<const Point*> mPoints; 00052 QVector2D mCenter; 00053 qreal mRadius; 00054 qreal mMass; 00055 size_t mCount; 00056 QVector2D mMC; 00057 }; 00058 00059 } 00060 #endif // QUADTREENODE_H