public void GetLength() { CatmullRomSegment2F c = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; float length1 = c.GetLength(0, 1, 20, Numeric.EpsilonF); float length2 = h.GetLength(0, 1, 20, Numeric.EpsilonF); Assert.IsTrue(Numeric.AreEqual(length1, length2)); float approxLength = 0; const float step = 0.0001f; for (float u = 0; u <= 1.0f; u += step) { approxLength += (c.GetPoint(u) - c.GetPoint(u + step)).Length; } Assert.IsTrue(Numeric.AreEqual(approxLength, length1, 0.01f)); Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(0, 0.5f, 100, Numeric.EpsilonF) + c.GetLength(0.5f, 1, 100, Numeric.EpsilonF))); Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(1, 0, 100, Numeric.EpsilonF))); }
public void GetLength() { CatmullRomSegment2F c = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; float length1 = c.GetLength(0, 1, 20, Numeric.EpsilonF); float length2 = h.GetLength(0, 1, 20, Numeric.EpsilonF); Assert.IsTrue(Numeric.AreEqual(length1, length2)); float approxLength = 0; const float step = 0.0001f; for (float u = 0; u <= 1.0f; u += step) approxLength += (c.GetPoint(u) - c.GetPoint(u + step)).Length; Assert.IsTrue(Numeric.AreEqual(approxLength, length1, 0.01f)); Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(0, 0.5f, 100, Numeric.EpsilonF) + c.GetLength(0.5f, 1, 100, Numeric.EpsilonF))); Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(1, 0, 100, Numeric.EpsilonF))); }
public void Flatten() { var s = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; var points = new List<Vector2F>(); var tolerance = 0.01f; s.Flatten(points, 10, tolerance); Assert.IsTrue(points.Contains(s.Point2)); Assert.IsTrue(points.Contains(s.Point3)); var curveLength = s.GetLength(0, 1, 10, tolerance); Assert.IsTrue(CurveHelper.GetLength(points) >= curveLength - tolerance * points.Count / 2); Assert.IsTrue(CurveHelper.GetLength(points) <= curveLength); }
public void Flatten() { var s = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; var points = new List <Vector2F>(); var tolerance = 0.01f; s.Flatten(points, 10, tolerance); Assert.IsTrue(points.Contains(s.Point2)); Assert.IsTrue(points.Contains(s.Point3)); var curveLength = s.GetLength(0, 1, 10, tolerance); Assert.IsTrue(CurveHelper.GetLength(points) >= curveLength - tolerance * points.Count / 2); Assert.IsTrue(CurveHelper.GetLength(points) <= curveLength); }
public void GetLength() { Path2F empty = new Path2F(); empty.Sort(); Assert.AreEqual(0, empty.GetLength(0, 1, 100, 0.0001f)); Path2F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Numeric.AreEqual((new Vector2F(0, 1) - new Vector2F(1, 2)).Length, path.GetLength(-1, 12, 100, 0.0001f), 0.001f)); Assert.IsTrue(Numeric.AreEqual((new Vector2F(0, 1) - new Vector2F(1, 2)).Length, path.GetLength(-1, 20, 100, 0.0001f), 0.001f)); CatmullRomSegment2F catmullOscillate = new CatmullRomSegment2F() { Point1 = new Vector2F(10, 12), Point2 = new Vector2F(10, 14), Point3 = new Vector2F(20, 14), Point4 = new Vector2F(30, 14), }; float desiredLength = catmullOscillate.GetLength(0, 1, 20, 0.0001f); float actualLength = path.GetLength(40, 50, 20, 0.0001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.001f)); desiredLength = catmullOscillate.GetLength(1, 0.8f, 20, 0.0001f); actualLength = path.GetLength(52, 50, 20, 0.0001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.001f)); desiredLength = catmullOscillate.GetLength(1, 0.8f, 20, 0.0001f) * 2; actualLength = path.GetLength(52, 48, 20, 0.0001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.001f)); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Cycle; path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.Linear; path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Constant; }
public void GetTangent() { CatmullRomSegment2F c = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent1, c.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent2, c.GetTangent(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetTangent(0.7f), c.GetTangent(0.7f))); }
public void GetPoint() { CatmullRomSegment2F c = new CatmullRomSegment2F { Point1 = new Vector2F(1, 2), Point2 = new Vector2F(10, 3), Point3 = new Vector2F(7, 8), Point4 = new Vector2F(10, 2), }; HermiteSegment2F h = new HermiteSegment2F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point2, c.GetPoint(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point3, c.GetPoint(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetPoint(0.33f), c.GetPoint(0.33f))); }
public void GetTangent() { Path2F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 0), path.GetTangent(-10))); Assert.IsTrue(Vector2F.AreNumericallyEqual((new Vector2F(1, 2) - new Vector2F(0, 1)) / 2, path.GetTangent(10))); Assert.IsTrue(Vector2F.AreNumericallyEqual((new Vector2F(1, 2) - new Vector2F(0, 1)) / 2, path.GetTangent(11.5f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 0), path.GetTangent(16))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 0), path.GetTangent(85))); CatmullRomSegment2F catmullOscillate = new CatmullRomSegment2F() { Point1 = new Vector2F(10, 12), Point2 = new Vector2F(10, 14), Point3 = new Vector2F(20, 14), Point4 = new Vector2F(30, 14), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetTangent(0.3f) / 10.0f, path.GetTangent(43))); Assert.IsTrue(Vector2F.AreNumericallyEqual(-catmullOscillate.GetTangent(0.7f) / 10.0f, path.GetTangent(53))); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Cycle; Assert.IsTrue(Vector2F.AreNumericallyEqual((new Vector2F(1, 2) - new Vector2F(0, 1)) / 2, path.GetTangent(0))); path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetTangent(0.4f) / 10.0f, path.GetTangent(-36))); Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetTangent(0.4f) / 10.0f, path.GetTangent(4))); Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetTangent(0.3f) / 10.0f, path.GetTangent(83))); path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.Linear; Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetTangent(1f) / 10.0f, path.GetTangent(434))); path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Constant; path = new Path2F(); path.Add(new PathKey2F() { Parameter = 25, Point = new Vector2F(6, 7), Interpolation = SplineInterpolation.Bezier, TangentIn = new Vector2F(5, 6), TangentOut = new Vector2F(7, 8), }); path.Add(new PathKey2F() { Parameter = 35, Point = new Vector2F(10, 12), Interpolation = SplineInterpolation.Hermite, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Linear; float Δu = path[1].Parameter - path[0].Parameter; Assert.IsTrue(Vector2F.AreNumericallyEqual((new Vector2F(6, 7) - new Vector2F(5, 6)) * 3 / Δu, path.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(1, 0) / Δu, path.GetTangent(100))); path[1].Parameter = 25; path[0].Parameter = 35; path.Sort(); Δu = path[1].Parameter - path[0].Parameter; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(1, 0) / Δu, path.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual((new Vector2F(7, 8) - new Vector2F(6, 7)) * 3 / Δu, path.GetTangent(100))); path.Add(new PathKey2F() { Parameter = 15, Point = new Vector2F(0, 0), Interpolation = SplineInterpolation.BSpline, }); path.Sort(); }
public void GetPoint() { Path2F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 1), path.GetPoint(-10))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, 5), path.GetPoint(13))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, 5), path.GetPoint(16))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7), path.GetPoint(17))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7), path.GetPoint(19))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7) * 0.5f + new Vector2F(6, 7)*0.5f, path.GetPoint(22.5f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7) * 0.5f + new Vector2F(6, 7) * 0.5f, path.GetPoint(22.5f))); CatmullRomSegment2F catmullOscillate = new CatmullRomSegment2F() { Point1 = new Vector2F(10, 12), Point2 = new Vector2F(10, 14), Point3 = new Vector2F(20, 14), Point4 = new Vector2F(30, 14), }; Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetPoint(0.3f), path.GetPoint(43))); Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetPoint(0.9f), path.GetPoint(51))); CatmullRomSegment2F catmullCircle = new CatmullRomSegment2F() { Point1 = new Vector2F(10, 12), Point2 = new Vector2F(10, 14), Point3 = new Vector2F(20, 14), Point4 = new Vector2F(30, 14), }; path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Cycle; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 1) - (new Vector2F(1, 2) - new Vector2F(0, 1)) / 2 * 9, path.GetPoint(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullCircle.GetPoint(0.3f), path.GetPoint(43))); path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; var cycleOffset = new Vector2F(20, 14) - new Vector2F(0, 1); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) + cycleOffset, path.GetPoint(80f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) + cycleOffset * 2, path.GetPoint(120f))); path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.Linear; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) - cycleOffset, path.GetPoint(0f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) - cycleOffset * 2, path.GetPoint(-40f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(20, 14) + catmullOscillate.GetTangent(1) / 10 * 50, path.GetPoint(100f))); path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Constant; }