import Earth from './Earth.js';
import FlightRecorder from './FlightRecorder.js';
import Rocket from './Rocket.js';
import $ from './Selector.js';
class Simulation {
constructor() {
}
init() {
const velocity = $('#initial_velocity').val();
const latitude = $('#initial_latitude').val();
const altitude = $('#initial_altitude').val();
const targetAltitude = $('#target_altitude').val() * 1000.0;
const diameter = $('#diameter').val();
const wetMass = $('#wet_mass').val();
const payloadMass = $('#payload_mass').val();
const dragCoefficient = $('#drag_coefficient').val();
const specificImpulse = $('#specific_impulse').val();
this.planet = new Earth(latitude);
this.rocket = new Rocket(wetMass, payloadMass);
$('#orbital_velocity').val(
this.planet.orbitalSpeed(latitude, targetAltitude).toFixed(2)
);
this.rocket.on(this.planet);
this.rocket.fuselage(diameter, dragCoefficient, specificImpulse);
this.rocket.translocate(latitude, altitude);
this.rocket.apogee(targetAltitude);
this.rocket.launch(velocity);
}
run() {
const blackBox = new FlightRecorder();
this.rocket.recorder(blackBox);
let time = 0.0;
const TIME_STEP = 0.01;
while (this.rocket.flying()) {
this.rocket.fly(TIME_STEP);
this.rocket.record(time);
time += TIME_STEP;
}
const altitude = $('#initial_altitude').val();
$('#air_density').val(
this.planet.airDensity(altitude).toFixed(2)
);
$('#initial_orbital_velocity').val(
this.rocket.initialOrbitalVelocity().toFixed(2)
);
$('#initial_vertical_velocity').val(
this.rocket.initialVerticalVelocity().toFixed(2)
);
$('#rocket_velocity').val(
blackBox.maxHorizontalVelocity().toFixed(2)
);
$('#rocket_altitude').val(
(blackBox.maxAltitude() / 1000.0).toFixed(2)
);
$('#dry_mass').val(
this.rocket.emptyMass().toFixed(2)
);
$('#final_mass').val(
blackBox.minMass().toFixed(2)
);
$('#payload_delivered').val(
this.rocket.successfulFlight() ? "😀 Yes" : "😞 No"
);
blackBox.plot();
}
simulate() {
this.init();
this.run();
}
}
const simulation = new Simulation();
document.querySelectorAll('input').forEach(input => {
input.addEventListener('change', function () {
simulation.simulate();
});
});
document.querySelectorAll('.submit').forEach(button => {
button.addEventListener('click', function (event) {
event.preventDefault();
simulation.simulate();
});
});