public void Analyze() { discreteTrack = new DiscreteTrack(this, terrainModifier); speedProfile = new HistoProfile(17); speedProfile.SetBorders(10f, 90f); for (int i = 0; i < discreteTrack.speedAnalyzer.Vs.Length; i++) { speedProfile.AddValue(discreteTrack.speedAnalyzer.Vs[i]); } curvatureProfile = new HistoProfile(17); curvatureProfile.SetBorders(-0.1f, 0.1f); for (int i = 0; i < discreteTrack.curvatureAnalyzerTrack.Curvature.Length; i++) { curvatureProfile.AddValue(discreteTrack.curvatureAnalyzerTrack.Curvature[i]); } curvatureIdeallineProfile = new HistoProfile(17); curvatureIdeallineProfile.SetBorders(-0.07f, 0.07f); for (int i = 0; i < discreteTrack.curvatureIdealLineAnalyzer.Curvature.Length; i++) { curvatureIdeallineProfile.AddValue(discreteTrack.curvatureIdealLineAnalyzer.Curvature[i]); } }
/// <summary> /// Create a DiscreteTrackBar /// </summary> /// <param name="track"> DiscreteTrack to edit</param> public DiscreteTrackBar(DiscreteTrack <V> track) : base(track) { _DiscreteTrack = track; _Events = new List <DiscreteKeyView>(); CreateEvents(); this.ContextMenu = DiscreteTrackBarContextMenu.Instance; }
public void SetTrack(DiscreteTrack track, TerrainModifier terrainModifier) { if (job != null) { job.Abort(); job = null; } pathC = 0; job = new JobCarvisualize(); job.deltaT = deltaT; job.DiscreteTrack = track; job.TerrainModifier = terrainModifier; job.Start(); }
protected override void ThreadFunction() { track = DiscreteTrack; pathC = 0; List <Vector3> posList = new List <Vector3>(); List <Vector3> forcList = new List <Vector3>(); float exactment = 0.1f; int resolution = track.speedAnalyzer.Vs.Length; Vector3 oldPos = track.idealLineSpline.SplineAt(0f); float oldV = track.speedAnalyzer.Vs[0]; Vector3 oldForce = track.speedAnalyzer.Forces[0]; float s = 0f; float steps = (1f / resolution); int debugWhileCounter2 = 0; while (s < 1f) { debugWhileCounter2++; if (debugWhileCounter2 > 10000) { Debug.LogError("While counter2 > 10000"); break; } s += steps; Vector3 pos = track.idealLineSpline.SplineAt(s); float traveledDistance = oldV * deltaT; float adjustStep = steps * 0.5f; int debugWhileCounter = 0; while (Mathf.Abs(Vector3.Distance(pos, oldPos) - traveledDistance) > exactment) { debugWhileCounter++; if (debugWhileCounter > 1000) { //Debug.LogError("While counter > 1000"); break; } if (TerrainModifier != null) { pos = track.idealLineSpline.SplineAt(s);// + new Vector3(0f, terrainModifier.GetTensorHeight(track.idealLineSpline.SplineAt(s).x, track.idealLineSpline.SplineAt(s).z), 0f); } else { pos = track.idealLineSpline.SplineAt(s); } if (Vector3.Distance(pos, oldPos) > traveledDistance) { s -= (adjustStep); } else { s += (adjustStep); } adjustStep *= 0.5f; } forcList.Add(oldForce); posList.Add(pos); int rounded = (int)(s * resolution); oldV = track.speedAnalyzer.Vs[rounded % track.speedAnalyzer.Vs.Length]; oldForce = track.speedAnalyzer.Forces[rounded % track.speedAnalyzer.Vs.Length]; oldPos = pos; } path = posList.ToArray(); forces = forcList.ToArray(); }
public void SetTrack(DiscreteTrack track) { SetTrack(track, null); }
public override void TrackUpdated() { base.TrackUpdated(); Statics.Log("New Discrete Track"); discreteTrack = new DiscreteTrack(Track, Track.TerrainModifier); Statics.Log("Discrete Track created"); x = discreteTrack.shortestPathTrajectory; xC = discreteTrack.minimumCurvatureTrajectory; gizCPoints = discreteTrack.GetCurvativePointsRight(); Statics.Log("GetCurvativePointsRight"); if (instIdealLine != null) { Destroy(instIdealLine); instIdealLine = null; } instIdealLine = Instantiate(idealLine); instIdealLine.transform.position = new Vector3(0f, 0.15f, 0f); instIdealLine.GetComponent <ClosedSplineRenderer>().Width = 0.7f; instIdealLine.GetComponent <ClosedSplineRenderer>().ClosedSpline = discreteTrack.idealLineSpline; vs = discreteTrack.speedAnalyzer.Vs; Statics.Log("vs = discreteTrack.speedAnalyzer.Vs"); for (int i = 0; i < instSpeedTraps.Count; i++) { Destroy(instSpeedTraps[i]); } instSpeedTraps.Clear(); for (int i = 0; i < discreteTrack.idealLineSpline.ControlPointsAmount; i++) { float s = ((float)i) / discreteTrack.idealLineSpline.ControlPointsAmount; instSpeedTraps.Add(Instantiate(speedTrap)); instSpeedTraps[instSpeedTraps.Count - 1].transform.position = discreteTrack.idealLineSpline.SplineAt(s); //instSpeedTraps[instSpeedTraps.Count - 1].GetComponentInChildren<TextMesh>().text = (1f / discreteTrack.curvatureAnalyzer.Curvature[i]).ToString(); } if (carVisual != null) { Statics.Log("SetTrack(discreteTrack)"); carVisual.SetTrack(discreteTrack); Statics.Log("SetTrack(discreteTrack) -> Done"); } if (histoSpeed != null) { HistoProfile histoProfileSpeed = new HistoProfile(17); histoProfileSpeed.SetBorders(0f, 100f); for (int i = 0; i < discreteTrack.speedAnalyzer.Vs.Length; i++) { histoProfileSpeed.AddValue(discreteTrack.speedAnalyzer.Vs[i]); } histoSpeed.RenderProfile(histoProfileSpeed); } if (histoCurvature != null) { HistoProfile histoProfileCurvature = new HistoProfile(17); histoProfileCurvature.SetBorders(-0.05f, 0.05f); for (int i = 0; i < discreteTrack.curvatureAnalyzerTrack.Curvature.Length; i++) { histoProfileCurvature.AddValue(discreteTrack.curvatureAnalyzerTrack.Curvature[i]); } histoCurvature.RenderProfile(histoProfileCurvature); } }
public DiscreteTrack Copy(GeneratedTrack copyTrack) { DiscreteTrack copy = new DiscreteTrack(copyTrack, copyTrack.TerrainModifier); return(copy); }
public void CalculateCurbs(DiscreteTrack track) { bool[] leftCurbs = new bool[track.idealLineMesh.Length]; bool[] rightCurbs = new bool[track.idealLineMesh.Length]; for (int i = 0; i < leftCurbs.Length; i++) { leftCurbs[i] = false; rightCurbs[i] = false; } float threshhold = 0.23f; int addbefaft = 8; bool inv = false; int startIndex = -1; int endIndex = -1; for (int i = 0; i < track.idealLineMesh.Length; i++) { if (track.idealLineMesh[i] < threshhold && startIndex == -1) { inv = false; startIndex = i; } else if (track.idealLineMesh[i] >= threshhold && startIndex != -1) { endIndex = i; } if (track.idealLineMesh[i] > (1f - threshhold) && startIndex == -1) { inv = true; startIndex = i; } else if (track.idealLineMesh[i] <= (1f - threshhold) && startIndex != -1) { endIndex = i; } if (startIndex != -1 && endIndex != -1) { for (int j = (startIndex - addbefaft); j < endIndex + addbefaft; j++) { int jR = j < 0 ? j + track.idealLineMesh.Length : (j % track.idealLineMesh.Length); if (inv) { leftCurbs[jR] = true; } else { rightCurbs[jR] = true; } } startIndex = -1; endIndex = -1; } } startIndex = -1; for (int i = 0; i < leftCurbs.Length; i++) { if (leftCurbs[i] && startIndex == -1) { startIndex = i; } else if (leftCurbs[i] == false && startIndex != -1) { Vector3[] curbVertices = new Vector3[i - startIndex]; Vector3[] curbDirections = new Vector3[i - startIndex]; for (int j = 0; j < curbVertices.Length; j++) { curbVertices[j] = new Vector3(leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)].x, 0f, leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)].y); curbDirections[j] = new Vector3((leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] - rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)]).x, 0f, (leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] - rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)]).y); leftWidths[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] = 3f; } int prevIndex = startIndex - 1 - offset < 0 ? startIndex - 1 - offset + track.idealLineMesh.Length : startIndex - 1 - offset; int afteIndex = i - offset < 0 ? i - offset + track.idealLineMesh.Length : i - offset; GeneratedCurb curb = new GeneratedCurb(curbVertices, curbDirections, 3f, 0f, 0f, new Vector3(leftV[prevIndex].x, 0f, leftV[prevIndex].y), new Vector3(leftV[afteIndex].x, 0f, leftV[afteIndex].y)); genCurbs.Add(curb); startIndex = -1; } } startIndex = -1; for (int i = 0; i < rightCurbs.Length; i++) { if (rightCurbs[i] && startIndex == -1) { startIndex = i; } else if (rightCurbs[i] == false && startIndex != -1) { Vector3[] curbVertices = new Vector3[i - startIndex]; Vector3[] curbDirections = new Vector3[i - startIndex]; for (int j = 0; j < curbVertices.Length; j++) { curbVertices[j] = new Vector3(rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)].x, 0f, rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)].y); curbDirections[j] = new Vector3((rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] - leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)]).x, 0f, (rightV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] - leftV[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)]).y); rightWidths[(startIndex + j - offset) < 0 ? (startIndex + j - offset + leftV.Length) : (startIndex + j - offset)] = 3f; } int prevIndex = startIndex - 1 - offset < 0 ? startIndex - 1 - offset + track.idealLineMesh.Length : startIndex - 1 - offset; int afteIndex = i - offset < 0 ? i - offset + track.idealLineMesh.Length : i - offset; GeneratedCurb curb = new GeneratedCurb(curbVertices, curbDirections, 3f, 0f, 0f, new Vector3(rightV[prevIndex].x, 0f, rightV[prevIndex].y), new Vector3(rightV[afteIndex].x, 0f, rightV[afteIndex].y)); genCurbs.Add(curb); startIndex = -1; } } }