111 lines
3.4 KiB
C++
Executable File
111 lines
3.4 KiB
C++
Executable File
#define _USE_MATH_DEFINES
|
|
#include <iostream>
|
|
#include <fstream> // Für Dateioperationen
|
|
#include <cmath>
|
|
#include <vector>
|
|
#include <random>
|
|
#include <string>
|
|
|
|
struct State {
|
|
double t, x, y, z;
|
|
};
|
|
|
|
class BallistikSimulator {
|
|
private:
|
|
const double g = 9.81;
|
|
const double rho = 1.225;
|
|
std::mt19937 gen;
|
|
|
|
|
|
public:
|
|
BallistikSimulator() : gen(std::random_device{}()) {}
|
|
|
|
std::vector<State> simuliereFlug(double v0, double winkelGrad, double masse, double cw, double flaeche, double streuung) {
|
|
std::vector<State> trajektorie;
|
|
double winkelRad = (winkelGrad * M_PI / 180.0);
|
|
|
|
// Zufallseinfluss auf den Startwinkel (Streuung)
|
|
std::normal_distribution<double> d_winkel(0.0, streuung * 0.01);
|
|
double variierterWinkel = winkelRad + d_winkel(gen);
|
|
|
|
double vx = v0 * std::cos(variierterWinkel);
|
|
double vy = v0 * std::sin(variierterWinkel);
|
|
double vz = d_winkel(gen) * v0; // Seitliche Abweichung
|
|
|
|
double x = 0, y = 0, z = 0, t = 0;
|
|
double dt = 0.01;
|
|
|
|
while (y >= 0) {
|
|
trajektorie.push_back({ t, x, y, z });
|
|
|
|
double v = std::sqrt(vx * vx + vy * vy + vz * vz);
|
|
double Fw = 0.5 * rho * v * v * cw * flaeche;
|
|
|
|
vx += (-(Fw * (vx / v)) / masse) * dt;
|
|
vy += (-g - (Fw * (vy / v)) / masse) * dt;
|
|
vz += (-(Fw * (vz / v)) / masse) * dt;
|
|
|
|
x += vx * dt;
|
|
y += vy * dt;
|
|
z += vz * dt;
|
|
t += dt;
|
|
|
|
if (trajektorie.size() > 20000) break;
|
|
}
|
|
return trajektorie;
|
|
}
|
|
|
|
// Neue Funktion zum Speichern der Daten
|
|
void speichereInCSV(const std::vector<State>& pfad, const std::string& dateiname) {
|
|
std::ofstream datei(dateiname);
|
|
|
|
if (datei.is_open()) {
|
|
// Header für die CSV-Datei
|
|
datei << "Zeit(s);X(Distanz);Y(Hoehe);Z(Seite)\n";
|
|
|
|
for (const auto& p : pfad) {
|
|
datei << p.t << ";" << p.x << ";" << p.y << ";" << p.z << "\n";
|
|
}
|
|
datei.close();
|
|
std::cout << "Daten erfolgreich in " << dateiname << " gespeichert.\n";
|
|
}
|
|
else {
|
|
std::cerr << "Fehler: Datei konnte nicht geöffnet werden!\n";
|
|
}
|
|
}
|
|
|
|
void exportiere3DTrajektorien(int anzahl, double v0, double winkel, double masse, double cw, double flaeche, double streuung) {
|
|
std::ofstream datei("3d_flugbahnen.csv");
|
|
datei << "SchussID;X;Y;Z\n";
|
|
|
|
for (int i = 0; i < anzahl; ++i) {
|
|
auto pfad = simuliereFlug(v0, winkel, masse, cw, flaeche, streuung);
|
|
for (const auto& p : pfad) {
|
|
datei << i << ";" << p.x << ";" << p.y << ";" << p.z << "\n";
|
|
}
|
|
}
|
|
datei.close();
|
|
std::cout << "3D-Daten in '3d_flugbahnen.csv' gespeichert.\n";
|
|
}
|
|
};
|
|
|
|
int main() {
|
|
BallistikSimulator sim;
|
|
|
|
// Simulations-Parameter
|
|
double v0 = 400.0; // m/s
|
|
double winkel = 20.0; // Grad
|
|
double masse = 0.015; // 15 Gramm
|
|
double cw = 0.29; // cw-Wert (Projektil)
|
|
double flaeche = 0.00006; // Querschnittsflaeche
|
|
double praezision = 0.2; // Streufaktor
|
|
|
|
// Flug simulieren
|
|
auto pfad = sim.simuliereFlug(v0, winkel, masse, cw, flaeche, praezision);
|
|
|
|
// Als CSV speichern
|
|
sim.speichereInCSV(pfad, "flugbahn.csv");
|
|
sim.exportiere3DTrajektorien(10, v0, winkel, masse, cw, flaeche, praezision);
|
|
|
|
return 0;
|
|
} |