use struct for coordinates

This commit is contained in:
Dominik Demuth
2024-09-16 19:52:51 +02:00
parent edeff66275
commit 8ef0b81820
18 changed files with 150 additions and 23 deletions

View File

@ -9,7 +9,7 @@
#include "base.h"
#include "coordinates.h"
#include <iostream>
#include <unordered_map>
Motion::Motion(const double delta, const double eta, std::mt19937_64& rng) : m_delta(delta), m_eta(eta), m_rng(rng) {
m_uni_dist = std::uniform_real_distribution(0., 1.);
@ -38,4 +38,4 @@ SphericalPos Motion::draw_position() {
const double phi = 2.0 * M_PI * m_uni_dist(m_rng);
return {cos_theta, phi};
}
}

View File

@ -7,7 +7,7 @@
#include "coordinates.h"
#include <random>
#include <unordered_map>
class Motion {
@ -36,4 +36,5 @@ protected:
std::uniform_real_distribution<> m_uni_dist;
};
#endif //RWSIM_MOTIONBASE_H

25
motions/bimodalangle.cpp Normal file
View File

@ -0,0 +1,25 @@
//
// Created by dominik on 8/23/24.
//
#include "bimodalangle.h"
#include "base.h"
BimodalAngle::BimodalAngle(const double delta, const double eta, const double angle1, const double angle2, const double prob, std::mt19937_64 &rng) :
Motion(delta, eta, rng),
m_angle1(angle1 * M_PI / 180.0),
m_angle2(angle2 * M_PI / 180.0),
m_prob(prob) {};
BimodalAngle::BimodalAngle(std::mt19937_64 &rng) : Motion(rng) {}
void BimodalAngle::initialize() {
m_prev_pos = draw_position();
};
double BimodalAngle::jump() {
const double angle = m_uni_dist(m_rng) < m_prob ? m_angle1 : m_angle2;
const double gamma{2 * M_PI * m_uni_dist(m_rng)};
m_prev_pos = rotate(m_prev_pos, angle, gamma);
return omega_q(m_prev_pos);
}

25
motions/bimodalangle.h Normal file
View File

@ -0,0 +1,25 @@
//
// Created by dominik on 8/23/24.
//
#ifndef BIMODALANGLE_H
#define BIMODALANGLE_H
#include "base.h"
class BimodalAngle : public Motion {
public:
BimodalAngle(double, double, double, double, double, std::mt19937_64& );
explicit BimodalAngle(std::mt19937_64&);
void initialize() override;
double jump() override;
protected:
double m_angle1{0};
double m_angle2{0};
double m_prob{0};
SphericalPos m_prev_pos{0., 0.};
};
#endif //BIMODALANGLE_H

View File

@ -3,12 +3,11 @@
//
#include "isosmallangle.h"
#include "coordinates.h"
#include <algorithm>
SmallAngle::SmallAngle(const double delta, const double eta, const double chi, std::mt19937_64 &rng) : Motion(delta, eta, rng), m_chi(chi) {};
SmallAngle::SmallAngle(std::mt19937_64 &rng) : Motion(rng) {
}
SmallAngle::SmallAngle(const double delta, const double eta, const double chi, std::mt19937_64 &rng) : Motion(delta, eta, rng), m_chi(chi * M_PI / 180.0) {};
SmallAngle::SmallAngle(std::mt19937_64 &rng) : Motion(rng) {}
void SmallAngle::initialize() {
m_prev_pos = draw_position();
@ -16,7 +15,7 @@ void SmallAngle::initialize() {
double SmallAngle::jump() {
const double gamma{2 * M_PI * m_uni_dist(m_rng)};
m_prev_pos = rotate(m_prev_pos, gamma, m_chi);
m_prev_pos = rotate(m_prev_pos, m_chi, gamma);
return omega_q(m_prev_pos);
}

View File

@ -9,12 +9,10 @@ TetrahedralJump::TetrahedralJump(const double delta, const double eta, std::mt19
TetrahedralJump::TetrahedralJump(std::mt19937_64& rng) : Motion(rng) {}
void TetrahedralJump::initialize() {
// const auto pos = SphericalPos{0., 0};
const auto pos = draw_position();
m_corners[0] = omega_q(pos);
const double alpha = 2. * M_PI * m_uni_dist(m_rng);
// const double alpha = 0.;
for (int i = 1; i<4; i++) {
auto corner_pos = rotate(pos, m_beta, alpha + (i-1) * 2*M_PI/3.);