diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp index 5d325dd68e69e94b2424a4f258c1c6c657f0024e..83ade7b6e175daf3e4b7d4c206437ee727ffca53 100644 --- a/src/pulsaranimationwidget.cpp +++ b/src/pulsaranimationwidget.cpp @@ -24,7 +24,8 @@ const float PulsarAnimationWidget::deg2rad = PI/180.0f; PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : QGLWidget(QGLFormat(QGL::AlphaChannel | QGL::SampleBuffers), parent), - m_frameTimer() + m_frameTimer(), + m_pulseProfile(360, 0.0f) { if(!format().directRendering()) { qWarning("Sorry, no direct rendering support for animation..."); @@ -68,11 +69,13 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : m_mouseLastX = 0; m_mouseLastY = 0; m_mouseAngleH = 90.0f; - m_mouseAngleV = 30.f; + m_mouseAngleV = 30.0f; m_cameraZoom = 15.0f; m_cameraZoomLBound = 2.0f; updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); + + updatePulseProfile(); } PulsarAnimationWidget::~PulsarAnimationWidget() @@ -359,6 +362,7 @@ void PulsarAnimationWidget::updateFrame() m_pulsarRotationAngle += m_pulsarRotationDelta; if(m_pulsarRotationAngle > 360) { m_pulsarRotationAngle = 0.0f; + updatePulseProfile(); } m_orbitRotationAngle += m_orbitRotationDelta; if(m_orbitRotationAngle > 360) { @@ -432,6 +436,8 @@ void PulsarAnimationWidget::updateCameraPosition(const int angleH, const int ang m_cameraPosY = sin(angleV * deg2rad) * zoom; m_cameraPosZ = cos(angleH * deg2rad) * cos(fabs(angleV * deg2rad)) * zoom; + updatePulseProfile(); + updateGL(); } @@ -445,6 +451,7 @@ void PulsarAnimationWidget::setPulsarSemiMajorAxis(const float length) m_pulsarSemiMajorAxis = length; m_companionSemiMajorAxis = (m_pulsarMass/m_companionMass) * m_pulsarSemiMajorAxis; updateOrbitPeriod(); + updatePulseProfile(); updateGL(); } @@ -453,6 +460,7 @@ void PulsarAnimationWidget::setCompanionMass(const float mass) { m_companionMass = mass; updateOrbitRadii(); + updatePulseProfile(); updateGL(); } @@ -461,6 +469,7 @@ void PulsarAnimationWidget::setPulsarMass(const float mass) { m_pulsarMass = mass; updateOrbitRadii(); + updatePulseProfile(); updateGL(); } @@ -468,11 +477,13 @@ void PulsarAnimationWidget::setPulsarMass(const float mass) void PulsarAnimationWidget::setPulsarSpinFrequency(const float frequency) { m_pulsarRotationDelta = (360.0f * frequency) / m_framesPerSecond; + updatePulseProfile(); } void PulsarAnimationWidget::setPulsarSpinAxisInclination(const int degrees) { m_pulsarSpinAxisInclination = degrees; + updatePulseProfile(); updateGL(); } @@ -517,3 +528,40 @@ void PulsarAnimationWidget::resetParameters() emit pulsarAnimationReset(); } + +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; + + for(int x = 0; x < 360; ++x) { + // determine angle between pulsar's magnetic axis and line of sight + const double phiOrb = x * 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)); + + // determine pulse amplitude + double amp = exp(-2 * (1 - fabs(a/b)) / gaussProfile); + + // store amplitude + m_pulseProfile[x] = (float) amp; + } + + // propagate new profile + emit pulseProfileUpdated(m_pulseProfile); +} diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h index 246e7bb71dee01c4f5950a72bea33add084c233a..88c95abcdeadf143eda8aa3f16617184f9fcb2d6 100644 --- a/src/pulsaranimationwidget.h +++ b/src/pulsaranimationwidget.h @@ -29,6 +29,7 @@ #define PI 3.14159265 + class PulsarAnimationWidget : public QGLWidget { Q_OBJECT @@ -56,11 +57,11 @@ public slots: signals: void pulsarSemiMajorAxisUpdated(double value); - void pulsarViewDataUpdated(const QVector<float>& data); + void pulseProfileUpdated(const QVector<float>& data); void pulsarAnimationStep(float stepSize); void pulsarAnimationReset(); -protected: +private: void initializeGL(); void resizeGL(int w, int h); void paintGL(); @@ -73,6 +74,7 @@ protected: void updateOrbitRadii(); void updateCameraPosition(const int angleH, const int angleV, const float zoom); void resetParameters(); + void updatePulseProfile(); QTimer m_frameTimer; @@ -117,6 +119,8 @@ protected: float m_cameraPosY; float m_cameraPosZ; + QVector<float> m_pulseProfile; + static const float deg2rad; }; diff --git a/src/pulsatingscience.cpp b/src/pulsatingscience.cpp index 70290d5c10951528b7a1db81f90f717f512ca023..e85bca55a29699bf6ebfcd0666d012c7b9e3aad6 100644 --- a/src/pulsatingscience.cpp +++ b/src/pulsatingscience.cpp @@ -50,7 +50,7 @@ PulsatingScience::PulsatingScience(QWidget *parent) : QMainWindow(parent) connect(ui.pulsarGlWidget, SIGNAL(pulsarAnimationReset()), ui.pulseScopeWidget, SLOT(markerReset())); - connect(ui.pulsarGlWidget, SIGNAL(pulsarViewDataUpdated(const QVector<float>&)), + connect(ui.pulsarGlWidget, SIGNAL(pulseProfileUpdated(const QVector<float>&)), ui.pulseScopeWidget, SLOT(drawCurve(const QVector<float>&))); on_sliderPulsarSemiMajorAxis_valueChanged(ui.sliderPulsarSemiMajorAxis->value()); diff --git a/src/pulsatingscience.ui b/src/pulsatingscience.ui index 72b12bcd697c7bd17074709551744d006ede54a6..13eaeb8b3dafeefaef31368a30314c1ac200c39d 100644 --- a/src/pulsatingscience.ui +++ b/src/pulsatingscience.ui @@ -23,8 +23,7 @@ <property name="orientation" > <enum>Qt::Vertical</enum> </property> - <widget class="PulsarAnimationWidget" native="1" name="pulsarGlWidget" > - </widget> + <widget class="PulsarAnimationWidget" native="1" name="pulsarGlWidget" /> <widget class="PulseScopeWidget" name="pulseScopeWidget" > <property name="frameShape" > <enum>QFrame::NoFrame</enum>