From 003b56a27a8b58d55b6fc040e844e92a6c429b21 Mon Sep 17 00:00:00 2001
From: Oliver Bock <oliver.bock@aei.mpg.de>
Date: Wed, 4 Feb 2009 16:57:21 +0100
Subject: [PATCH] Fixed pulse profile computation

* Using fixed initializations instead of GUI values (required for consistency)
* Added missing initializations
* Fixed coordinate system and angle transformations (GUI vs. physics)
* Fixed trigonometry blunder (deg vs. rad)
* Also: optimized camera updates
* Also: more comments
* Pending: marker increasingly out of sync (over time)
---
 src/pulsaranimationwidget.cpp | 80 ++++++++++++++++++++++-------------
 src/pulsatingscience.cpp      | 10 -----
 2 files changed, 51 insertions(+), 39 deletions(-)

diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index d6e4e2c..5e4a214 100644
--- a/src/pulsaranimationwidget.cpp
+++ b/src/pulsaranimationwidget.cpp
@@ -43,8 +43,10 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
 		qWarning("Sorry, no multisampling support for animation...");
 	}
 
+	// connect primary rendering timer to local callback
     connect(&m_frameTimer, SIGNAL(timeout()), this, SLOT(updateFrame()));
 
+    // initialize quadric pointers
     m_quadricCompanionOrbitPlane = NULL;
     m_quadricCompanion = NULL;
     m_quadricPulsarOrbitPlane = NULL;
@@ -54,29 +56,46 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
 	m_quadricPulsarSpinAxis = NULL;
 	m_quadricPulsarMagneticAxis = NULL;
 
+	// initialize texture pointers
 	m_pulsarTexture = 0;
 	m_backgroundTexture = 0;
 
+	// initial render timing settings
 	m_framesPerSecond = 25;
-
+	m_pulsarRotationDelta = 0.0f;
+	m_orbitRotationDelta = 0.0f;
 	resetParameters();
 
+	// initial binary system parameters (have to match GUI!)
 	m_pulsarMass = 1.4f;
+	// initial companion is "Neutron Star"
 	m_companionMass = 1.4f;
+	m_pulsarSpinAxisInclination = 0.0f;
+	m_pulsarMagneticAxisInclination = 45.0f;
+	m_pulsarSemiMajorAxis = 5.0f;
+	m_companionSemiMajorAxis = (m_pulsarMass/m_companionMass) * m_pulsarSemiMajorAxis;
+	// initial spin frequency of 0.5 Hz
+	m_pulsarRotationDelta = (360.0f * 0.5f) / m_framesPerSecond;
+	// update orbital period (based on settings above)
+	updateOrbitPeriod();
 
+	// initial view features
 	m_showOrbits = false;
 	m_showRotationAxes = false;
 	m_cameraInteraction = false;
 
-	m_mouseLastX = 0;
-	m_mouseLastY = 0;
+	// initial view settings
 	m_mouseAngleH = 90.0f;
 	m_mouseAngleV = 30.0f;
 	m_cameraZoom = 15.0f;
 	m_cameraZoomLBound = 2.0f;
+	m_mouseLastX = 0;
+	m_mouseLastY = 0;
 
+	// update camera based on settings above
 	updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
 
+	// finally, create initial pulse profile based on settings above
 	updatePulseProfile();
 }
 
@@ -197,9 +216,9 @@ void PulsarAnimationWidget::paintGL()
 
 	// draw companion
 	glPushMatrix();
-		glTranslatef(sin((m_orbitRotationAngle + 180) * deg2rad) * m_companionSemiMajorAxis,
+		glTranslatef(sin((m_orbitRotationAngle + 180.0f) * deg2rad) * m_companionSemiMajorAxis,
 					 0.0f,
-					 cos((m_orbitRotationAngle + 180) * deg2rad) * m_companionSemiMajorAxis);
+					 cos((m_orbitRotationAngle + 180.0f) * deg2rad) * m_companionSemiMajorAxis);
 		gluSphere(m_quadricCompanion, 1.0f, 32, 32);
 	glPopMatrix();
 
@@ -404,12 +423,12 @@ void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event)
 	Qt::MouseButtons buttons = event->buttons();
 	if((buttons & Qt::LeftButton) == Qt::LeftButton) {
 		if(m_mouseLastX != 0) {
-			m_mouseAngleH -= (m_mouseLastX - event->x()) / 2;
+			m_mouseAngleH -= (m_mouseLastX - event->x()) * 0.5f ;
 			m_mouseAngleH = m_mouseAngleH < 360 ? m_mouseAngleH : 0;
 
 		}
 		if(m_mouseLastY != 0) {
-			m_mouseAngleV -= (m_mouseLastY - event->y()) / 2;
+			m_mouseAngleV -= (m_mouseLastY - event->y()) * 0.5f;
 			m_mouseAngleV = m_mouseAngleV < 90 ? m_mouseAngleV : 90;
 			m_mouseAngleV = m_mouseAngleV > -90 ? m_mouseAngleV : -90;
 		}
@@ -419,7 +438,7 @@ void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event)
 	}
 	else if((buttons & Qt::RightButton) == Qt::RightButton) {
 		if(m_mouseLastY != 0) {
-			m_cameraZoom -= (m_mouseLastY - event->y()) / 2;
+			m_cameraZoom -= (m_mouseLastY - event->y()) * 0.5f;
 			m_cameraZoom = m_cameraZoom >= m_cameraZoomLBound ? m_cameraZoom : m_cameraZoomLBound;
 			updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
 		}
@@ -444,7 +463,7 @@ void PulsarAnimationWidget::updateCameraPosition(const int angleH, const int ang
 {
 	m_cameraPosX = sin(angleH * deg2rad) * zoom;
 	m_cameraPosY = sin(angleV * deg2rad) * zoom;
-	m_cameraPosZ = cos(angleH * deg2rad) * cos(fabs(angleV * deg2rad)) * zoom;
+	m_cameraPosZ = cos(angleH * deg2rad) * cos(angleV * deg2rad) * zoom;
 
 	updatePulseProfile();
 
@@ -501,6 +520,7 @@ void PulsarAnimationWidget::setPulsarSpinAxisInclination(const int degrees)
 void PulsarAnimationWidget::setPulsarMagneticAxisInclination(const int degrees)
 {
 	m_pulsarMagneticAxisInclination = degrees;
+	updatePulseProfile();
 
 	updateGL();
 }
@@ -508,8 +528,8 @@ void PulsarAnimationWidget::setPulsarMagneticAxisInclination(const int degrees)
 void PulsarAnimationWidget::updateOrbitPeriod()
 {
 	m_orbitalPeriod = 3.1553e7 * sqrt(
-						(pow(m_pulsarSemiMajorAxis,3) * pow(m_pulsarMass+m_companionMass,2)) /
-						 pow(m_companionMass,3)
+						(pow(m_pulsarSemiMajorAxis, 3.0f) * pow(m_pulsarMass+m_companionMass, 2.0f)) /
+						 pow(m_companionMass, 3.0f)
 					  );
 
 	// visual correction factor (increase orbital momentum)
@@ -521,9 +541,9 @@ void PulsarAnimationWidget::updateOrbitPeriod()
 void PulsarAnimationWidget::updateOrbitRadii()
 {
 	m_pulsarSemiMajorAxis = 1.0015e-5 * pow(
-								(pow(m_orbitalPeriod,2) * pow(m_companionMass,3)) /
-								 pow(m_pulsarMass+m_companionMass,2),
-								 1.0/3.0
+								(pow(m_orbitalPeriod, 2.0f) * pow(m_companionMass, 3.0f)) /
+								 pow(m_pulsarMass+m_companionMass, 2.0f),
+								 1.0f/3.0f
 							);
 
 	m_companionSemiMajorAxis = (m_pulsarMass/m_companionMass) * m_pulsarSemiMajorAxis;
@@ -541,32 +561,34 @@ void PulsarAnimationWidget::resetParameters()
 
 void PulsarAnimationWidget::updatePulseProfile()
 {
-	const double i = m_pulsarSpinAxisInclination;
-	const double y = m_pulsarMagneticAxisInclination;
-	const double deltaPhiOrb = m_orbitRotationDelta;
-	const double deltaPhiRot = m_pulsarRotationDelta;
-	const double rp = m_pulsarSemiMajorAxis;
-	const double xk = m_cameraPosZ;
-	const double yk = -m_cameraPosX;
-	const double zk = -m_cameraPosY;
-	const double cam = pow(xk,2) + pow(yk,2) + pow(zk,2);
-	const double alpha = -m_mouseAngleH;
-	const double delta = m_mouseAngleV;
-	const double gaussProfile = 0.012337;
+	// prepare parameters (e.g. convert to radians where necessary)
+	const double	i				= deg2rad * m_pulsarSpinAxisInclination;
+	const double	y				= deg2rad * m_pulsarMagneticAxisInclination;
+	double			phiOrb			= deg2rad * m_orbitRotationAngle;
+	const double	deltaPhiRot		= deg2rad * 1.0;
+	const double	deltaPhiOrb		= deg2rad * deltaPhiRot * m_orbitRotationDelta / m_pulsarRotationDelta;
+	const double	rp				= m_pulsarSemiMajorAxis;
+	const double	xk				= -m_cameraPosZ;
+	const double	yk				= -m_cameraPosX;
+	const double	zk				= m_cameraPosY;
+	const double	cam				= pow(xk, 2.0f) + pow(yk, 2.0f) + pow(zk, 2.0f);
+	const double	alpha			= deg2rad * (90.0f - m_mouseAngleH);
+	const double	delta			= deg2rad * m_mouseAngleV;
+	const double	gaussProfile	= 0.012337;
 
 	for(int x = 0; x < 360; ++x) {
 		// determine angle between pulsar's magnetic axis and line of sight
-		const double phiOrb = x * deltaPhiOrb;
+		phiOrb += deltaPhiOrb;
 		const double phiRot = x * deltaPhiRot;
 
 		double a = -sin(y) * sin(phiRot) * (xk + rp * cos(phiOrb)) \
 				 + (cos(i) * sin(y) * cos(phiRot) + sin(i) * cos(y)) * (yk + rp * sin(phiOrb)) \
 				 - (sin(i) * sin(y) * cos(phiRot) - cos(i) * cos(y)) * zk;
 
-		double b = sqrt(pow(rp,2) + cam - 2 * sqrt(cam) * rp * cos(delta) * sin(alpha + phiOrb));
+		double b = sqrt(pow(rp,2.0) + cam - (2.0 * sqrt(cam) * rp * cos(delta) * sin(alpha + phiOrb)));
 
 		// determine pulse amplitude
-		double amp = exp(-2 * (1 - fabs(a/b)) / gaussProfile);
+		double amp = exp(-2.0 * (1.0 - fabs(a/b)) / gaussProfile);
 
 		// store amplitude
 		m_pulseProfile[x] = (float) amp;
diff --git a/src/pulsatingscience.cpp b/src/pulsatingscience.cpp
index a4d0ed5..2d8c3e5 100644
--- a/src/pulsatingscience.cpp
+++ b/src/pulsatingscience.cpp
@@ -80,16 +80,6 @@ PulsatingScience::PulsatingScience(QWidget *parent) : QMainWindow(parent)
 
 	connect(ui.pulsarGlWidget, SIGNAL(pulseProfileUpdated(const QVector<float>&)),
 				ui.pulseScopeWidget, SLOT(drawCurve(const QVector<float>&)));
-
-	// initialize animation parameters (using GUI settings)
-	on_sliderPulsarSemiMajorAxis_valueChanged(ui.sliderPulsarSemiMajorAxis->value());
-
-	on_radioCompanionNS_toggled(true);
-	on_sliderPulsarMass_valueChanged(ui.sliderPulsarMass->value());
-
-	on_sliderPulsarSpinFrequency_valueChanged(ui.sliderPulsarSpinFrequency->value());
-	on_sliderPulsarSpinAxisInclination_valueChanged(ui.sliderPulsarSpinAxisInclination->value());
-	on_sliderPulsarMagneticAxisInclination_valueChanged(ui.sliderPulsarMagneticAxisInclination->value());
 }
 
 PulsatingScience::~PulsatingScience()
-- 
GitLab