// Updated to be marshalled onto the UI thread public void UpdateMonitoredValues(Body body, double simElapsedTime) { if (UI_UpdatesStopped()) { return; // Stop UI updates while app is suspended or changing scenarios } var ignore = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { SimPoint velocity = body.Velocity * sim.simSpace.VelocityConnversionFactor; velocityTextBlock.Text = "velocity: " + FormatPointToString(velocity) + String.Format(", v = {0:N1} {1}", velocity.Magnitude(), sim.simSpace.VelocityUnitsAbbr); positionTextBlock.Text = "position: " + FormatPointToString(body.Position) + String.Format(", r = {0:N1} {1}", body.Position.Magnitude() - sim.simSpace.DistanceOffset, sim.simSpace.DistanceUnitsAbbr); timeTextBlock.Text = $"time: {TimeDisplay.FormatElapsedTime(simElapsedTime, sim.simSpace.TimeUnits)}"; }); }
// Returns starting position for a body in simulation space coordinates public SimPoint GetStartingPosition(GravitySim.BodyStartPosition startPos) { const double stagePosition = 0.5; // For the "stage" positions - proportion of the way from the center of the stage to the edge // in all directions double simBoxMaxXY = simSpace.SimBoxHeightAndWidth / 2.0; double stageXY = simBoxMaxXY * stagePosition; double screenMaxX = screenSimulationDimensions.X / 2.0; double screenMaxY = screenSimulationDimensions.Y / 2.0; switch (startPos) { case GravitySim.BodyStartPosition.StageLeft: return(new SimPoint(-stageXY, 0.0)); case GravitySim.BodyStartPosition.StageRight: return(new SimPoint(stageXY, 0.0)); case GravitySim.BodyStartPosition.StageTop: return(new SimPoint(0.0, stageXY)); case GravitySim.BodyStartPosition.StageBottom: return(new SimPoint(0.0, -stageXY)); case GravitySim.BodyStartPosition.StageTopLeft: return(new SimPoint(-stageXY, stageXY)); case GravitySim.BodyStartPosition.StageTopRight: return(new SimPoint(stageXY, stageXY)); case GravitySim.BodyStartPosition.StageBottomLeft: return(new SimPoint(-stageXY, -stageXY)); case GravitySim.BodyStartPosition.StageBottomRight: return(new SimPoint(stageXY, -stageXY)); case GravitySim.BodyStartPosition.ScreenLeft: return(new SimPoint(-screenMaxX, 0.0)); case GravitySim.BodyStartPosition.ScreenRight: return(new SimPoint(screenMaxX, 0.0)); case GravitySim.BodyStartPosition.ScreenTop: return(new SimPoint(0.0, screenMaxY)); case GravitySim.BodyStartPosition.ScreenBottom: return(new SimPoint(0.0, -screenMaxY)); case GravitySim.BodyStartPosition.CenterOfTheUniverse: return(new SimPoint(0.0, 0.0)); case GravitySim.BodyStartPosition.RandomStagePosition: return(new SimPoint(rand.Next((int)-simBoxMaxXY, (int)simBoxMaxXY), rand.Next((int)-simBoxMaxXY, (int)simBoxMaxXY))); case GravitySim.BodyStartPosition.RandomScreenPosition: return(new SimPoint(rand.Next((int)-screenMaxX, (int)screenMaxX), rand.Next((int)-screenMaxY, (int)screenMaxY))); // This approach gives us higher density toward the center of the circle case GravitySim.BodyStartPosition.RandomDenseCenterCircularCluster: double length = rand.NextDouble() * simBoxMaxXY * 0.9; double angle = rand.NextDouble() * Math.PI * 2.0; // radians return(new SimPoint(length * Math.Cos(angle), length * Math.Sin(angle))); // This approach gives us uniform density throughout the circle case GravitySim.BodyStartPosition.RandomUniformDensityCircularCluster: SimPoint newBodyPosition; double limitXY = 0.9 * simBoxMaxXY; do { newBodyPosition = new SimPoint(rand.Next((int)-limitXY, (int)limitXY), rand.Next((int)-limitXY, (int)limitXY)); }while (newBodyPosition.Magnitude() > limitXY); return(newBodyPosition); default: return(new SimPoint(0.0, 0.0)); } }