00001 #include "Gravity.h"
00002 #include <QDebug>
00003 #include <QGraphicsScene>
00004
00005
00006 #define QSIZE 32000
00007
00008 namespace Elve {
00009
00010 Gravity::Gravity(qreal k) : mK(k) ,mQuadTree(QRectF(-QSIZE,-QSIZE,QSIZE*2,QSIZE*2))
00011 {
00012
00013 }
00014
00015 QVector2D Gravity::force(const Point &m) const {
00016
00017 return quadGravity(m);
00018 }
00019
00020 void Gravity::addPoint(const Point* m)
00021 {
00022 mGalaxy.insert(m);
00023 mQuadTree.addPoint(m);
00024 }
00025
00026 void Gravity::setK(qreal k) {
00027 mK = k;
00028 }
00029
00030 QVector2D Gravity::plainOldGravity(const Point& m) const
00031 {
00032 QVector2D f{0,0};
00033 for(const Point* const& ms : mGalaxy) {
00034 if(ms != &m) {
00035 QVector2D r = ms->pos() - m.pos();
00036 qreal lr = r.lengthSquared();
00037 if(lr > 1e-2 and lr < 1024*1024) {
00038 f += -r.normalized() * ((mK*ms->mass()*m.mass()) / lr);
00039 }
00040 }
00041 }
00042 return f;
00043 }
00044
00045 void Gravity::setQuadTreeBounds(const QRectF bounds) {
00046 mQuadTree.setBounds(bounds);
00047 }
00048
00049 void Gravity::updateQuadTree() {
00050
00051
00052
00053
00054
00055 mQuadTree.reinsertAll();
00056 }
00057
00058 QVector2D Gravity::quadGravity(const Point& m) const
00059 {
00060 return mK*mQuadTree.gravityFor(m);
00061
00062 }
00063
00064 void Gravity::debug(QPainter* p) const {
00065 mQuadTree.debug(p);
00066 }
00067
00068 void Gravity::clear() {
00069 mGalaxy.clear();
00070 mQuadTree.clear();
00071 }
00072
00073 }