ELVE  1
ELVE Logic Visualization Explorer
/home/travis/build/stdgregwar/elve/Core/Gravity.cpp
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    //return plainOldGravity(m);
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     /*for(const Point* m : mGalaxy) {
00051         if(m->moved()) {
00052             mQuadTree.movePoint(m);
00053         }
00054     }*/
00055     mQuadTree.reinsertAll();
00056 }
00057 
00058 QVector2D Gravity::quadGravity(const Point& m) const
00059 {
00060     return mK*mQuadTree.gravityFor(m);
00061     //return plainOldGravity(m);
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 }
 All Classes Functions