#include #include #include #include #include #include #include // vector headers #include using namespace std; class Ball { private: Ball(); QPoint ballpos; double angle, dangle; int ballradius, dist; const Ball *refball; public: Ball(int x, int y, int rad); Ball(const Ball *bref, int dist, int rad, double dang); Ball(const QPoint &); virtual void travel(double time); void paint(QPainter &painter) const; }; Ball::Ball(int x, int y, int rad) : refball(0) { ballpos.setX(x); ballpos.setY(y); ballradius = rad; dist = 0; angle = 0.; dangle = 0.; } Ball::Ball(const Ball *bref, int d, int rad, double dang) : refball( bref) { ballpos.setX(refball->ballpos.x()); ballpos.setY(refball->ballpos.y()+d); dist = d; ballradius = rad; angle = 0.; dangle = dang; } void Ball::paint(QPainter &painter) const { painter.drawEllipse( ballpos.x()-ballradius/2, ballpos.y()-ballradius/2, ballradius, ballradius ); } void Ball::travel(double time) { if ( dangle != 0. ) { angle += time*dangle; // change angle if ( angle > 360. ) angle -= 360.; // angle %= 360; // modulo 360 int x = refball->ballpos.x() // - refball->ballradius + (int) (cos( angle*M_PI/180.) * dist); int y = refball->ballpos.y() // - refball->ballradius + (int) (sin( angle*M_PI/180.) * dist); ballpos.setX(x); ballpos.setY(y); } } class PlanetAnim : public QWidget { Q_OBJECT public: PlanetAnim(); protected: virtual void paintEvent(QPaintEvent*); private slots: virtual void timeout( ); private: int xpos, ypos, radius; // sun parameters int xpose, ypose, radiuse; // earth parameters vector vb; int distsunearth, deltaAngle, currentAngle; QColor mycol; }; PlanetAnim::PlanetAnim() { Ball *sun = new Ball( 250, 250, 60 ); Ball *earth = new Ball( sun, 200, 15, 1. ); Ball *moon = new Ball( earth, 25, 6, 10. ); vb.push_back( sun ); vb.push_back( earth ); vb.push_back( moon ); mycol = Qt::yellow; setBackgroundRole(QPalette::Base); setAutoFillBackground(true); // setup timer QTimer *internalTimer = new QTimer( this ); // create internal timer connect( internalTimer, SIGNAL(timeout()), this, SLOT(timeout()) ); internalTimer->start(50 ); // emit signal every 100 ms } void PlanetAnim::timeout() { for ( int i= 0; itravel( 2. ); } update(); } void PlanetAnim::paintEvent(QPaintEvent *) { QPainter paint; paint.begin( this); paint.setPen( Qt::red ); paint.setBrush( Qt::red ); for ( int i= 0; ipaint( paint ); } paint.end(); } #include "PlanetAnim.moc" int main(int argc, char **argv) { QApplication app(argc,argv); PlanetAnim *wid = new PlanetAnim(); wid->resize(500,500); wid->show(); return app.exec(); }