예제 #1
0
 // 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)}";
     });
 }
예제 #2
0
        // 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));
            }
        }