Merge pull request #1765 from JoePfeiffer/fix-1728a

Improve sampling for SimulationRunDialog
This commit is contained in:
Sibo Van Gool 2022-10-26 16:29:48 +02:00 committed by GitHub
commit f81d6c74ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -49,9 +49,9 @@ import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.gui.widgets.SelectColorButton;
public class SimulationRunDialog extends JDialog {
private static final long serialVersionUID = -1593459321777026455L;
private static final Logger log = LoggerFactory.getLogger(SimulationRunDialog.class);
@ -270,6 +270,7 @@ public class SimulationRunDialog extends JDialog {
private final int index;
private final double burnoutTimeEstimate;
private volatile double burnoutVelocity;
private volatile double apogeeAltitude;
private final CustomExpressionSimulationListener exprListener;
@ -328,10 +329,11 @@ public class SimulationRunDialog extends JDialog {
// in order to calculate things like optimal coast time, we'll keep updating max altitude
// whenever we see that the rocket is going upwards. The last apogee found is the real one.
for (SimulationStatus s : chunks) {
if (s.getConfiguration().isStageActive(0) && (s.getRocketVelocity().z > 0)) {
if (s.getConfiguration().isStageActive(0) &&
((s.getRocketVelocity().z > 0) || (s.getRocketPosition().z > simulationMaxAltitude[index]))) {
log.debug("updating simulationMaxAltitude[" + index + "] to " + s.getRocketPosition().z);
simulationMaxAltitude[index] = s.getRocketPosition().z;
simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().length());
simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().z);
}
}
@ -367,14 +369,14 @@ public class SimulationRunDialog extends JDialog {
// Past apogee, switch to landing
if (simulationStage == -1 && status.getRocketVelocity().z < 0) {
simulationStage++;
log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + simulationMaxAltitude[index]);
apogeeAltitude = MathUtil.max(simulationMaxAltitude[index], 1);
log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + apogeeAltitude);
}
// >= 0 Landing. z-position from apogee to zero
// TODO: MEDIUM: several stages
System.out.flush();
log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + simulationMaxAltitude[index]);
setSimulationProgress(MathUtil.map(status.getRocketPosition().z, simulationMaxAltitude[index], 0, APOGEE_PROGRESS, 1.0));
log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + apogeeAltitude);
setSimulationProgress(MathUtil.map(status.getRocketPosition().z, apogeeAltitude, 0, APOGEE_PROGRESS, 1.0));
updateProgress();
}
@ -449,16 +451,17 @@ public class SimulationRunDialog extends JDialog {
switch (event.getType()) {
case APOGEE:
log.debug("APOGEE");
publish(status);
publish(new SimulationStatus(status));
break;
case LAUNCH:
publish(status);
log.debug("LAUNCH");
publish(new SimulationStatus(status));
break;
case SIMULATION_END:
log.debug("END");
publish(status);
publish(new SimulationStatus(status));
break;
default:
@ -471,7 +474,7 @@ public class SimulationRunDialog extends JDialog {
public void postStep(SimulationStatus status) {
if (System.currentTimeMillis() >= time + UPDATE_MS) {
time = System.currentTimeMillis();
publish(status);
publish(new SimulationStatus(status));
}
}
}