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)); }
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); }
/** * @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); }
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); }
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)); }
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); } }
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)); } }
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); }
/** * 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; }
public static bool isRestarting() { isRestart = false; if (!SpeedModel.isEnabled) { SpeedModel.isEnabled = true; } else if (SpeedModel.isRestartEnabled()) { isRestart = true; restartCount++; } return(isRestart); }
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)); }
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)); }
/** * @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; }
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); } }
/** * 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)); }
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); }
protected LocationTime[] PullLocationTimeArrayFromSpeedModel(SpeedModel speedModel) { LocationTime[] locationTimeArray = speedModel.snappedPoints.Select(x => new LocationTime(x.Location, x.time)).ToArray(); return(locationTimeArray); }
/** * @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; }
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); //刷新 }