/// <summary> /// Adds a data point. /// </summary> /// <param name="p">Data point to add.</param> /// <returns>True if the spline was modified.</returns> public bool Add(VECTOR p) { CurveBuilder.AddPointResult res = _builder.AddPoint(p); if (!res.WasChanged) { return(false); } // update spline ReadOnlyCollection <CubicBezier> curves = _builder.Curves; if (res.WasAdded && curves.Count == 1) { // first curve Debug.Assert(_spline.Curves.Count == 0); _spline.Add(curves[0]); } else if (res.WasAdded) { // split _spline.Update(_spline.Curves.Count - 1, curves[res.FirstChangedIndex]); for (int i = res.FirstChangedIndex + 1; i < curves.Count; i++) { _spline.Add(curves[i]); } } else { // last curve updated Debug.Assert(res.FirstChangedIndex == curves.Count - 1); _spline.Update(_spline.Curves.Count - 1, curves[curves.Count - 1]); } return(true); }
// Start is called before the first frame update void Start() { Points = new List <Vector2>(PointCount); //Seed = (uint)Mathf.Max(1, System.DateTime.Now.Millisecond); var random = new Unity.Mathematics.Random(Seed); for (int i = 0; i < PointCount; i++) { Points.Add(random.NextFloat2()); } //for (int i = 0; i < PointCount; i++) //{ // Points.Add(new Vector2(i / 100.0f, Mathf.Sin(i / 10.0f))); //} { var s = new BMCurves.CurveBuilder(DistanceBetweenPoints, CurveSplitError); for (int i = 0; i < Points.Count; i++) { s.AddPoint(Points[i]); } var curves = s.Curves; BurningMimeCurves.positionCount = curves.Count * 4; for (int i = 0; i < curves.Count; i++) { BurningMimeCurves.SetPosition(i * 4 + 0, curves[i].p0 * 25.0f); BurningMimeCurves.SetPosition(i * 4 + 1, curves[i].p1 * 25.0f); BurningMimeCurves.SetPosition(i * 4 + 2, curves[i].p2 * 25.0f); BurningMimeCurves.SetPosition(i * 4 + 3, curves[i].p3 * 25.0f); } } { var s = new OPCurves.CurveBuilder(DistanceBetweenPoints, CurveSplitError); for (int i = 0; i < Points.Count; i++) { s.AddPoint(Points[i]); } var curves = s.Curves; OptimizedCurves.positionCount = curves.Count * 4; for (int i = 0; i < curves.Count; i++) { OptimizedCurves.SetPosition(i * 4 + 0, curves[i].p0 * 25.0f); OptimizedCurves.SetPosition(i * 4 + 1, curves[i].p1 * 25.0f); OptimizedCurves.SetPosition(i * 4 + 2, curves[i].p2 * 25.0f); OptimizedCurves.SetPosition(i * 4 + 3, curves[i].p3 * 25.0f); } } }
[Explicit("Test for specific fail case which I don't want to deal with atm, so keeping it around here, but will have fix for it at some point?")] // TODO: Make this pass public void FailingAddTrianglePoints() { //var randomSeed = (uint)Mathf.Max(1, System.DateTime.Now.Millisecond); var randomSeed = (uint)886; try { using var d = new Unity.Profiling.ProfilerMarker("AddTrianglePoints").Auto(); var points = new List <Vector2>(); var randomPoints = new Unity.Mathematics.Random(randomSeed); for (int i = 0; i < 500; i++) { points.Add(randomPoints.NextFloat2()); } var desiredSpline = new BMCurves.CurveBuilder(DistanceBetweenPoints, CurveSplitError); var optimizedSpline = new OPCurves.CurveBuilder(DistanceBetweenPoints, CurveSplitError); for (int i = 0; i < points.Count; i++) { var desiredRes = desiredSpline.AddPoint(points[i]); var optimizedRes = optimizedSpline.AddPoint(points[i]); Assert.IsTrue(desiredRes.FirstChangedIndex == optimizedRes.FirstChangedIndex); } for (int i = 0; i < desiredSpline.Curves.Count; i++) { try { Assert.IsTrue(Equals(desiredSpline.Curves[i], optimizedSpline.Curves[i])); } catch (Exception e) { throw e; } } } catch (Exception e) { Debug.LogError($"Seed: {randomSeed}"); throw e; } }