X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fnet%2Fsf%2Fopenrocket%2Fsimulation%2FBasicEventSimulationEngine.java;h=21ccb2665391a491ca4a9148335526dea3133392;hb=2e015444de25266a10c77397ae33bca92457ab10;hp=2740ca432d72741c7247663d1561f74f72e4eaaa;hpb=8e4a8571c20ba96164ddd8a68226d43ccd549d21;p=debian%2Fopenrocket diff --git a/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index 2740ca43..21ccb266 100644 --- a/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -61,8 +61,12 @@ public class BasicEventSimulationEngine implements SimulationEngine { SimulationListenerHelper.fireStartSimulation(status); + // Get originating position (in case listener has modified launch position) + Coordinate origin = status.getRocketPosition(); + Coordinate originVelocity = status.getRocketVelocity(); try { + double maxAlt = Double.NEGATIVE_INFINITY; // Start the simulation while (handleEvents()) { @@ -91,17 +95,24 @@ public class BasicEventSimulationEngine implements SimulationEngine { status.getConfiguration().getRocket(), new Pair(oldAlt, status.getRocketPosition().z))); + if (status.getRocketPosition().z > maxAlt) { + maxAlt = status.getRocketPosition().z; + } + + // Position relative to start location + Coordinate relativePosition = status.getRocketPosition().sub(origin); + // Add appropriate events if (!status.isLiftoff()) { // Avoid sinking into ground before liftoff - if (status.getRocketPosition().z < 0) { - status.setRocketPosition(Coordinate.NUL); - status.setRocketVelocity(Coordinate.NUL); + if (relativePosition.z < 0) { + status.setRocketPosition(origin); + status.setRocketVelocity(originVelocity); } // Detect lift-off - if (status.getRocketPosition().z > 0.01) { + if (relativePosition.z > 0.02) { addEvent(new FlightEvent(FlightEvent.Type.LIFTOFF, status.getSimulationTime())); } @@ -118,13 +129,13 @@ public class BasicEventSimulationEngine implements SimulationEngine { // Check for launch guide clearance if (!status.isLaunchRodCleared() && - status.getRocketPosition().length() > status.getSimulationConditions().getLaunchRodLength()) { + relativePosition.length() > status.getSimulationConditions().getLaunchRodLength()) { addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, status.getSimulationTime(), null)); } // Check for apogee - if (!status.isApogeeReached() && status.getRocketPosition().z < oldAlt - 0.001) { + if (!status.isApogeeReached() && status.getRocketPosition().z < maxAlt - 0.01) { addEvent(new FlightEvent(FlightEvent.Type.APOGEE, status.getSimulationTime(), status.getConfiguration().getRocket())); }