Example #1
0
 public static SpeedModel[] constructCompetitors(int competitorCount)
 {
     SpeedModel[] competitors = new SpeedModel[competitorCount];
     float competitorCountf = (float) competitorCount;
     float idealPerCompetitor = 5.0f;
                     // 10.0f;
                     // 20.0f;
                     // 100.0f;
     idealPerCompetitor /= competitorCountf;
     float targetPerCompetitor = 5.0f;
                     // 5.0f;
                     // 10.0f;
     targetPerCompetitor /= competitorCountf;
     float firstCompetitorDistance = 5.0f;
                     // 1.0f;
     for (int c = 0; c < competitors.Length; c++) {
         competitors[c] = new SpeedModel();
         SpeedModel competitor = competitors[c];
         float cf = (float) competitors.Length - c - 1;
         competitor.idealSpeed = 5.0f + idealPerCompetitor * cf;
         competitor.targetSpeed = 5.0f + targetPerCompetitor * cf;
         competitor.z = firstCompetitorDistance + cf;
         competitor.calculatePostZ(c + 1.5f);
     }
     return competitors;
 }
        public IActionResult Create([FromBody] SnappedPointRequest[] snappedPointsRequests)
        {
            if (snappedPointsRequests == null)
            {
                return(BadRequest("Track is empty"));
            }

            if (snappedPointsRequests.Any(i => i.Location == null))
            {
                return(BadRequest("Location cannot be null"));
            }
            if (snappedPointsRequests.Any(i => i.Location.latitude.Equals(0) || i.Location.longitude.Equals(0)))
            {
                return(BadRequest("Latitude and Longitude cannot be 0"));
            }

            var speedModel = new SpeedModel(snappedPointsRequests);

            SpeedModel speedModelWithRoadsAndEvaluations;

            try
            {
                SpeedModel speedModelWithRoads = _googleRoadsApi.FillSpeedModel(speedModel, false);
                speedModelWithRoadsAndEvaluations = _googleEvaluationApi.FillSpeedModel(speedModelWithRoads);
            }
            catch (Exception e)
            {
                return(BadRequest("Remote server error, please try again later."));
            }

            return(new ObjectResult(speedModelWithRoadsAndEvaluations));
        }
Example #3
0
    public static SpeedModel[] constructCompetitors(int competitorCount)
    {
        SpeedModel[] competitors        = new SpeedModel[competitorCount];
        float        competitorCountf   = (float)competitorCount;
        float        idealPerCompetitor = 5.0f;

        // 10.0f;
        // 20.0f;
        // 100.0f;
        idealPerCompetitor /= competitorCountf;
        float targetPerCompetitor = 5.0f;

        // 5.0f;
        // 10.0f;
        targetPerCompetitor /= competitorCountf;
        float firstCompetitorDistance = 5.0f;

        // 1.0f;
        for (int c = 0; c < competitors.Length; c++)
        {
            competitors[c] = new SpeedModel();
            SpeedModel competitor = competitors[c];
            float      cf         = (float)competitors.Length - c - 1;
            competitor.idealSpeed  = 5.0f + idealPerCompetitor * cf;
            competitor.targetSpeed = 5.0f + targetPerCompetitor * cf;
            competitor.z           = firstCompetitorDistance + cf;
            competitor.calculatePostZ(c + 1.5f);
        }
        return(competitors);
    }
Example #4
0
    /**
     * @param	speed	If going faster than competitor and in lane and near, stop.
     * @param	rank	Only checks next competitor ahead and behind.  Expects no more than one competitor passed per frame.
     * @param	competitors	Ignore if going faster.
     */
    private bool DetectCollision(SpeedModel speed, float x0, SpeedModel[] competitors, float[] x1s, int rank)
    {
        bool isCollision = false;

        if (null != competitors)
        {
            SpeedModel competitor;
            int        index = rank - 2;
            if (0 <= index)
            {
                competitor  = competitors[index];
                isCollision = IsColliding(x0, speed.z, x1s[index], competitor.z, speed.speed, competitor.speed);
            }
            if (!isCollision)
            {
                index = rank - 1;
                if (index < competitors.Length)
                {
                    competitor  = competitors[index];
                    isCollision = IsColliding(x0, speed.z, x1s[index], competitor.z, speed.speed, competitor.speed);
                }
            }
        }
        return(isCollision);
    }
Example #5
0
        public async Task <SpeedModel> GetSnappedPointsArrayFromSpeedServer(IEnumerable <SnappedPointRequest> snappedPointsRequestArray)
        {
            //snappedPointsRequestArray = JsonConvert.DeserializeObject<SnappedPointRequest[]>(conTest);

            HttpClient client   = GetClient();
            var        response = await client.PostAsync(Url,
                                                         new StringContent(
                                                             JsonConvert.SerializeObject(snappedPointsRequestArray),
                                                             Encoding.UTF8, "application/json"));

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception(response.Content.ToString());
            }

            var contentString = await response.Content.ReadAsStringAsync();

            SpeedModel value = null;

            try
            {
                value = JsonConvert.DeserializeObject <SpeedModel>(contentString);
            }
            catch (Exception exception)
            {
                throw new Exception("Server return wrong data. Please, try later.");
            }
            return(value);
        }
Example #6
0
 public static void Updates(float deltaTime)
 {
     player.Update(deltaTime);
     for (int c = 0; c < competitors.Length; c++)
     {
         SpeedModel competitor = competitors[c];
         competitor.Update(deltaTime);
     }
 }
        public void total_time_friendly_display_format_millisec_only()
        {
            var model = new SpeedModel()
            {
                TotalTimeInMilliSec = 150
            };
            string expected = "00m 00s 150ms (150ms total)";

            Assert.That(model.TotalTimeDisplayFriendly, Is.EqualTo(expected));
        }
        public void total_time_friendly_display_format_multiple_broken_accurately(
            int totalMs, string expected
            )
        {
            var model = new SpeedModel()
            {
                TotalTimeInMilliSec = totalMs
            };

            Assert.That(model.TotalTimeDisplayFriendly, Is.EqualTo(expected));
        }
Example #9
0
 public void SetCompetitorPosition(SpeedModel[] competitorSpeeds)
 {
     if (null == competitorSpeeds) {
         return;
     }
     for (int c = 0; c < competitorSpeeds.Length; c++) {
         Transform transform = competitors[c].transform;
         SetPosition (transform, transform.position.x,
             competitorSpeeds[c].z);
     }
 }
Example #10
0
        public static SpeedModel FromSnappedPointRoadArray(SnappedPointRoad[] snappedPointsRoad)
        {
            var speedModel            = new SpeedModel();
            var snappedPointsRoadList = new List <SnappedPointResponse>();

            foreach (var snappedPointRoad in snappedPointsRoad)
            {
                snappedPointsRoadList.Add(snappedPointRoad.ToSnappedPointResponse());
            }

            speedModel.snappedPoints = snappedPointsRoadList.ToArray();
            return(speedModel);
        }
        public IActionResult FromMile(double valueKilometers)
        {
            try
            {
                Results = _speedConvertingOperations.FromMile(valueKilometers);

                return(Ok(Results));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
Example #12
0
        public SpeedModel FillSpeedModel(SpeedModel speedModel, bool interpolate)
        {
            //var locationTime = speedModel.snappedPoints.Select(x => new { x.Location, x.time }).ToArray();

            LocationTime[] locationTimeArray = PullLocationTimeArrayFromSpeedModel(speedModel);

            var groupedLocationTimeByRequest = GroupLocationTimeArrayByQuery(locationTimeArray);

            List <SpeedModel> speedModelList = ExecuteAllRequest(groupedLocationTimeByRequest, interpolate);

            var compliteSpeedModel = new SpeedModel(speedModelList);

            return(compliteSpeedModel);
        }
Example #13
0
 /**
  * Sort competitors from slowest to fastest.
  */
 public void Start()
 {
     SpeedModel.Start();
     lanes = new float[SpeedModel.competitorCount];
     for (int c = 0; c < SpeedModel.competitors.Length; c++)
     {
         lanes[c] = Mathf.Floor(Random.value * 3.0f) - 1.0f;
     }
     playerRank           = SpeedModel.competitorCount + 1;
     playerRankText       = formatPlayerRankText(playerRank);
     time                 = 0;
     passInterval         = 0;
     SpeedModel.isEnabled = false;
 }
Example #14
0
 public static bool isRestarting()
 {
     isRestart = false;
     if (!SpeedModel.isEnabled)
     {
         SpeedModel.isEnabled = true;
     }
     else if (SpeedModel.isRestartEnabled())
     {
         isRestart = true;
         restartCount++;
     }
     return(isRestart);
 }
Example #15
0
 public void Start()
 {
     player       = GameObject.Find("Player");
     playerCamera = GameObject.Find("Camera");
     SpeedModel.player.setup(player.transform.position.z, playerCamera.transform.position.z);
     SpeedModel.setIsShort(isShort);
     model.Start();
     road       = GameObject.Find("Road").GetComponent <RoadController>();
     road.model = model;
     ConstructCompetitors(model, competitorPrefab);
     finish = GameObject.Find("Finish");
     finish.transform.position = Vector3.forward * SpeedModel.finishZ;
     finishText = (TextMesh)GameObject.Find("FinishText").GetComponent <TextMesh>();
     restart    = GameObject.Find("RestartText");
     restart.SetActive(SpeedModel.isRestartEnabled());
 }
        public void create_sets_all_properties_accurately()
        {
            var model = new SpeedModel().Create(new AnalysisSpeed()
            {
                CharsPerSec         = 1,
                TotalTimeInMilliSec = 2,
                WordPerMin          = 3,
                KeySequenceAnalysis = new KeySequenceAnalysis()
                {
                    Created = DateTime.Now
                }
            });

            Assert.That(model.CharsPerSec, Is.EqualTo(1M));
            Assert.That(model.TotalTimeInMilliSec, Is.EqualTo(2M));
            Assert.That(model.WordPerMin, Is.EqualTo(3M));
        }
Example #17
0
        public SpeedModel FillSpeedModel(SpeedModel speedModel)
        {
            //var locationTime = speedModel.snappedPoints.Select(x => new { x.Location, x.time }).ToArray();

            LocationTime[] locationTimeArray = PullLocationTimeArrayFromSpeedModel(speedModel);
            locationTimeArray.ForEach(i => i.RoundCoordinats(5));

            var groupedLocationTimeByRequest = GroupLocationTimeArrayByQuery(locationTimeArray);

            List <SpeedModel> speedModelList = ExecuteAllRequest(groupedLocationTimeByRequest);

            //var compliteSpeedModel = new SpeedModel(speedModelList);
            var elevationSpeedModel = new SpeedModel(speedModelList);
            var compliteSpeedModel  = new SpeedModel(speedModel, elevationSpeedModel);

            return(compliteSpeedModel);
        }
        public void precision_applied_to_all_properties_manual_assignment()
        {
            decimal repeatingDec = (decimal)1 / (decimal)3;
            var     model        = new SpeedModel()
            {
                CharsPerSec         = repeatingDec,
                TotalTimeInMilliSec = repeatingDec,
                WordPerMin          = repeatingDec,
            };

            int expectedPrecision = Constants.PRECISION_FOR_DECIMALS;

            //add 2 to account for decimal and leading 0 in ones place
            expectedPrecision += 2;

            Assert.That(model.CharsPerSec.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
            Assert.That(model.TotalTimeInMilliSec.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
            Assert.That(model.WordPerMin.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
        }
Example #19
0
 /**
  * @param	speed	If going faster than competitor and in lane and near, stop.
  * @param	rank	Only checks next competitor ahead and behind.  Expects no more than one competitor passed per frame.
  * @param	competitors	Ignore if going faster.
  */
 private bool DetectCollision(SpeedModel speed, float x0, SpeedModel[] competitors, float[] x1s, int rank)
 {
     bool isCollision = false;
     if (null != competitors) {
         SpeedModel competitor;
         int index = rank - 2;
         if (0 <= index) {
             competitor = competitors[index];
             isCollision = IsColliding(x0, speed.z, x1s[index], competitor.z, speed.speed, competitor.speed);
         }
         if (!isCollision) {
             index = rank - 1;
             if (index < competitors.Length) {
                 competitor = competitors[index];
                 isCollision = IsColliding(x0, speed.z, x1s[index], competitor.z, speed.speed, competitor.speed);
             }
         }
     }
     return isCollision;
 }
Example #20
0
    public void Update(float deltaTime)
    {
        time += deltaTime;
        steering.Update(deltaTime);
        if (steering.isInputRight || steering.isInputLeft)
        {
            if (SpeedModel.isRestarting())
            {
                SpeedModel.setNextLevel(playerRank);
            }
        }
        SpeedModel.Updates(deltaTime);
        bool isColliding = DetectCollision(SpeedModel.player, steering.x, SpeedModel.competitors, lanes, playerRank);

        SpeedModel.player.UpdateCollision(isColliding);
        if (SpeedModel.player.IsActive())
        {
            playerRank = UpdatePlayerRank(playerRank, SpeedModel.player.z, SpeedModel.competitors);
        }
    }
Example #21
0
 /**
  * Controller explicitly orders updates:  All models then all views.
  * Was updating on each prefab's component script.  Also tried fixed update.
  * It turns out the order of updates is arbitrary so one view can update before the model and another afterward.
  * http://answers.unity3d.com/questions/46107/in-what-order-are-all-the-update-functions-called.html
  * Test case:  2015-11-01 Expect camera smoothly follows player and each keyboard input is processed exactly once.  Got player position jitters or keyboard input not processed every time or processed twice.
  */
 public void Update()
 {
     UpdateInput(model.steering);
     model.Update(Time.deltaTime);
     playerRank  = model.playerRank;
     playerSpeed = SpeedModel.player.speed;
     SetCompetitorPosition(SpeedModel.competitors);
     SetRankText(finishText);
     SetPosition(player.transform, model.steering.x, SpeedModel.player.z);
     SetPosition(playerCamera.transform, model.steering.cameraX, SpeedModel.player.cameraZ);
     restart.SetActive(SpeedModel.isRestartEnabled());
     if (SpeedModel.isRestart)
     {
         SpeedModel.isRestart = false;
         if (isVerbose)
         {
             Debug.Log("RaceModel.Update: Restart");
         }
         Application.LoadLevel(Application.loadedLevel);
     }
 }
        public void precision_applied_to_all_properties_with_create()
        {
            decimal repeatingDec = (decimal)1 / (decimal)3;
            var     model        = new SpeedModel().Create(new AnalysisSpeed()
            {
                CharsPerSec         = repeatingDec,
                TotalTimeInMilliSec = repeatingDec,
                WordPerMin          = repeatingDec,
                KeySequenceAnalysis = new KeySequenceAnalysis()
                {
                    Created = DateTime.Now
                }
            });

            int expectedPrecision = Constants.PRECISION_FOR_DECIMALS;

            //add 2 to account for decimal and leading 0 in ones place
            expectedPrecision += 2;

            Assert.That(model.CharsPerSec.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
            Assert.That(model.TotalTimeInMilliSec.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
            Assert.That(model.WordPerMin.ToString().Length, Is.LessThanOrEqualTo(expectedPrecision));
        }
Example #23
0
 public static void Start()
 {
     if (SpeedModel.isShort)
     {
         competitorCount     = 9;
         player.convergeRate = 2.5f;
     }
     else
     {
         competitorCount     = competitorCounts[level];
         player.convergeRate = SpeedModel.convergeRateStart;
     }
     player.idealConvergeRate = SpeedModel.idealConvergeRateStart;
     player.idealSpeed        = idealSpeeds[level];
     player.targetSpeed       = player.targetSpeedStart;
     player.speed             = 0.0f;
     Debug.Log("SpeedModel.Start: " + competitorCount
               + " competitors. Ideal player speed: "
               + player.idealSpeed
               + ", targetSpeed " + player.targetSpeed
               + ", speed " + player.speed
               );
     SpeedModel.competitors = SpeedModel.constructCompetitors(competitorCount);
 }
Example #24
0
 protected LocationTime[] PullLocationTimeArrayFromSpeedModel(SpeedModel speedModel)
 {
     LocationTime[] locationTimeArray = speedModel.snappedPoints.Select(x => new LocationTime(x.Location, x.time)).ToArray();
     return(locationTimeArray);
 }
Example #25
0
 /**
  * @return	Promoted or demoted rank.
  * @param	competitors	Expects sorted by z.
  */
 private int UpdatePlayerRank(int playerRank, float playerZ, SpeedModel[] competitors)
 {
     SpeedModel competitor;
     int rank = playerRank;
     if (2 <= rank && null != competitors) {
         competitor = competitors[rank - 2];
         while (2 <= rank && competitor.z < playerZ) {
             passInterval = time - passInterval;
             if (isVerbose) Debug.Log("RaceModel.UpdatePlayerRank: " + rank + " interval " + passInterval + " playerZ " + playerZ + " competitor.z " + competitor.z);
             passInterval = time;
             rank--;
             if (2 <= rank)
                 competitor = competitors[rank - 2];
         }
     }
     if (null != competitors && rank <= competitors.Length) {
         competitor = competitors[rank - 1];
         while (playerZ < competitor.z && rank <= competitors.Length) {
             rank++;
             if (rank <= competitors.Length)
                 competitor = competitors[rank - 1];
         }
     }
     if (rank != playerRank) {
         playerRankText = formatPlayerRankText(rank);
         SpeedModel.player.calculatePostZ((float) rank);
     }
     return rank;
 }
Example #26
0
        private void HandleStation(byte[] data)
        {
            if (++counter >= times.Count)
            {
                counter = 0;
                distPoints.Clear();
                speedPoints.Clear();
                azimuthPoints.Clear();
                pitchPoints.Clear();
            }

            Dist = dists[counter];
            distPoints.Add(new DataPoint(DateTimeAxis.ToDouble(times[counter]), Dist));
            LineSeries distSerial = new LineSeries()
            {
                Title = "测距"
            };

            distSerial.Points.AddRange(distPoints);

            DistModel.Series.Clear();
            DistModel.Series.Add(distSerial);
            DistModel.InvalidatePlot(true);  //刷新

            Speed = speeds[counter];
            speedPoints.Add(new DataPoint(DateTimeAxis.ToDouble(times[counter]), Speed));
            LineSeries speedSerial = new LineSeries()
            {
                Title = "测速"
            };

            speedSerial.Points.AddRange(speedPoints);

            SpeedModel.Series.Clear();
            SpeedModel.Series.Add(speedSerial);
            SpeedModel.InvalidatePlot(true);  //刷新

            Azimuth = azimuths[counter];
            azimuthPoints.Add(new DataPoint(DateTimeAxis.ToDouble(times[counter]), Azimuth));
            LineSeries azimuthSerial = new LineSeries()
            {
                Title = "方位角"
            };

            azimuthSerial.Points.AddRange(azimuthPoints);

            AzimuthModel.Series.Clear();
            AzimuthModel.Series.Add(azimuthSerial);
            AzimuthModel.InvalidatePlot(true);  //刷新

            Pitch = pitchs[counter];
            pitchPoints.Add(new DataPoint(DateTimeAxis.ToDouble(times[counter]), Pitch));
            LineSeries pitchSerial = new LineSeries()
            {
                Title = "俯仰角"
            };

            pitchSerial.Points.AddRange(pitchPoints);

            PitchModel.Series.Clear();
            PitchModel.Series.Add(pitchSerial);
            PitchModel.InvalidatePlot(true);  //刷新
        }