From 07513a3b41d1e7d58bab5e2c9a0c3b623c9f5364 Mon Sep 17 00:00:00 2001
From: Oliver Bock <oliver.bock@aei.mpg.de>
Date: Sat, 29 Nov 2008 15:36:21 +0100
Subject: [PATCH] Sent pulsar on a cricular orbit around a central companion

* Again, not to scale!
* Also: fixed quadrics pointer initialization
---
 src/pulsaranimationwidget.cpp | 49 +++++++++++++++++++++++++++++++----
 src/pulsaranimationwidget.h   |  9 +++++++
 2 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index 9343798..92306db 100644
--- a/src/pulsaranimationwidget.cpp
+++ b/src/pulsaranimationwidget.cpp
@@ -23,18 +23,25 @@
 PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
 	QGLWidget(parent),
 	m_frameTimer(),
-	m_pulsarSpinTimer()
+	m_pulsarSpinTimer(),
+	m_orbitTimer()
 {
     connect(&m_frameTimer, SIGNAL(timeout()), this, SLOT(updateFrame()));
     connect(&m_pulsarSpinTimer, SIGNAL(timeout()), this, SLOT(updatePulsarSpin()));
+    connect(&m_orbitTimer, SIGNAL(timeout()), this, SLOT(updateOrbit()));
 
-	GLUquadricObj *m_quadricPulsar;
-	GLUquadricObj *m_quadricPulsarCone1;
-	GLUquadricObj *m_quadricPulsarCone2;
+	m_quadricPulsar = NULL;
+	m_quadricPulsarCone1 = NULL;
+	m_quadricPulsarCone2 = NULL;
 
 	m_framesPerSecond = 25;
+
 	setPulsarSpinFrequency(0.5f);
-	m_pulsarRotationAngle = 0.0;
+	m_pulsarRotationAngle = 0.0f;
+
+	setOrbitFrequency(0.25f);
+	setOrbitRadius(4.0f);
+	m_orbitRotationAngle = 0.0f;
 }
 
 PulsarAnimationWidget::~PulsarAnimationWidget()
@@ -117,6 +124,13 @@ void PulsarAnimationWidget::paintGL()
 	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
 	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
 
+	glPushMatrix();
+	gluSphere(m_quadricPulsar, 1.0f, 32, 32);
+	glPopMatrix();
+
+	glRotatef(m_orbitRotationAngle, 0.0f, 1.0f, 0.0f);
+	glTranslatef(0.0f, 0.0f, m_orbitRadius);
+
 	glPushMatrix();
 	glRotatef(m_pulsarRotationAngle, 0.0f, 1.0f, 0.0f);
 	gluSphere(m_quadricPulsar, 1.0f, 32, 32);
@@ -139,20 +153,24 @@ void PulsarAnimationWidget::runAnimation()
 {
 	m_frameTimer.start(1000.0 / m_framesPerSecond);
 	m_pulsarSpinTimer.start(m_pulsarSpinFrequency);
+	m_orbitTimer.start(m_orbitFrequency);
 }
 
 void PulsarAnimationWidget::pauseAnimation()
 {
 	m_frameTimer.stop();
 	m_pulsarSpinTimer.stop();
+	m_orbitTimer.stop();
 }
 
 void PulsarAnimationWidget::stopAnimation()
 {
 	m_frameTimer.stop();
 	m_pulsarSpinTimer.stop();
+	m_orbitTimer.stop();
 
 	m_pulsarRotationAngle = 0.0;
+	m_orbitRotationAngle = 0.0;
 	updateGL();
 }
 
@@ -171,6 +189,16 @@ void PulsarAnimationWidget::updatePulsarSpin()
 	}
 }
 
+void PulsarAnimationWidget::updateOrbit()
+{
+	if(m_orbitRotationAngle <= 360.0) {
+		m_orbitRotationAngle++;
+	}
+	else {
+		m_orbitRotationAngle = 0.0;
+	}
+}
+
 void PulsarAnimationWidget::setFramePerSecond(const unsigned int fps)
 {
 	m_framesPerSecond = fps;
@@ -181,3 +209,14 @@ void PulsarAnimationWidget::setPulsarSpinFrequency(const float frequency)
 	m_pulsarSpinFrequency = (unsigned int) (1000 / (frequency * 360.0f));
 	m_pulsarSpinTimer.setInterval(m_pulsarSpinFrequency);
 }
+
+void PulsarAnimationWidget::setOrbitRadius(const float radius)
+{
+	m_orbitRadius = -1.0 * radius;
+}
+
+void PulsarAnimationWidget::setOrbitFrequency(const float frequency)
+{
+	m_orbitFrequency = (unsigned int) (1000 / (frequency * 360.0f));
+	m_orbitTimer.setInterval(m_orbitFrequency);
+}
diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h
index 8106bc9..b16dd99 100644
--- a/src/pulsaranimationwidget.h
+++ b/src/pulsaranimationwidget.h
@@ -34,6 +34,8 @@ public:
 
 	void setFramePerSecond(const unsigned int fps);
 	void setPulsarSpinFrequency(const float frequency);
+	void setOrbitRadius(const float radius);
+	void setOrbitFrequency(const float frequency);
 
 public slots:
 	void runAnimation();
@@ -42,6 +44,7 @@ public slots:
 
 	void updateFrame();
 	void updatePulsarSpin();
+	void updateOrbit();
 
 protected:
 
@@ -54,14 +57,20 @@ protected:
 private:
     QTimer m_frameTimer;
     QTimer m_pulsarSpinTimer;
+    QTimer m_orbitTimer;
 
 	GLUquadricObj *m_quadricPulsar;
 	GLUquadricObj *m_quadricPulsarCone1;
 	GLUquadricObj *m_quadricPulsarCone2;
 
 	int m_framesPerSecond;
+
 	float m_pulsarSpinFrequency;
 	float m_pulsarRotationAngle;
+
+	float m_orbitRadius;
+	float m_orbitFrequency;
+	float m_orbitRotationAngle;
 };
 
 #endif /* PULSARANIMATIONWIDGET_H_ */
-- 
GitLab