Esempio n. 1
0
    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]);
        }
    }
Esempio n. 2
0
 /// <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;
 }
Esempio n. 3
0
    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();
    }
Esempio n. 4
0
    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();
    }
Esempio n. 5
0
 public void SetTrack(DiscreteTrack track)
 {
     SetTrack(track, null);
 }
Esempio n. 6
0
    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);
        }
    }
Esempio n. 7
0
    public DiscreteTrack Copy(GeneratedTrack copyTrack)
    {
        DiscreteTrack copy = new DiscreteTrack(copyTrack, copyTrack.TerrainModifier);

        return(copy);
    }
Esempio n. 8
0
    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;
            }
        }
    }