public void GetLength() { CatmullRomSegment3F c = new CatmullRomSegment3F { Point1 = new Vector3F(1, 2, 3), Point2 = new Vector3F(10, 3, 6), Point3 = new Vector3F(7, 8, 19), Point4 = new Vector3F(10, 2, 12), }; HermiteSegment3F h = new HermiteSegment3F { 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() { CatmullRomSegment3F c = new CatmullRomSegment3F { Point1 = new Vector3(1, 2, 3), Point2 = new Vector3(10, 3, 6), Point3 = new Vector3(7, 8, 19), Point4 = new Vector3(10, 2, 12), }; HermiteSegment3F h = new HermiteSegment3F { 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 CatmullRomSegment3F { Point1 = new Vector3F(1, 2, 3), Point2 = new Vector3F(10, 3, 6), Point3 = new Vector3F(7, 8, 19), Point4 = new Vector3F(10, 2, 12), }; var points = new List<Vector3F>(); 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 CatmullRomSegment3F { Point1 = new Vector3(1, 2, 3), Point2 = new Vector3(10, 3, 6), Point3 = new Vector3(7, 8, 19), Point4 = new Vector3(10, 2, 12), }; var points = new List <Vector3>(); 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() { Path3F empty = new Path3F(); empty.Sort(); Assert.AreEqual(0, empty.GetLength(0, 1, 100, 0.0001f)); Path3F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Numeric.AreEqual((new Vector3F(0, 0, 1) - new Vector3F(1, 2, 3)).Length, path.GetLength(-1, 12, 100, 0.0001f), 0.001f)); Assert.IsTrue(Numeric.AreEqual((new Vector3F(0, 0, 1) - new Vector3F(1, 2, 3)).Length, path.GetLength(-1, 20, 100, 0.0001f), 0.001f)); CatmullRomSegment3F catmullOscillate = new CatmullRomSegment3F() { Point1 = new Vector3F(10, 12, 14), Point2 = new Vector3F(10, 14, 8), Point3 = new Vector3F(20, 14, 8), Point4 = new Vector3F(30, 14, 8), }; 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() { CatmullRomSegment3F c = new CatmullRomSegment3F { Point1 = new Vector3(1, 2, 3), Point2 = new Vector3(10, 3, 6), Point3 = new Vector3(7, 8, 19), Point4 = new Vector3(10, 2, 12), }; HermiteSegment3F h = new HermiteSegment3F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector3.AreNumericallyEqual(h.Tangent1, c.GetTangent(0))); Assert.IsTrue(Vector3.AreNumericallyEqual(h.Tangent2, c.GetTangent(1))); Assert.IsTrue(Vector3.AreNumericallyEqual(h.GetTangent(0.7f), c.GetTangent(0.7f))); }
public void GetPoint() { CatmullRomSegment3F c = new CatmullRomSegment3F { Point1 = new Vector3F(1, 2, 3), Point2 = new Vector3F(10, 3, 6), Point3 = new Vector3F(7, 8, 19), Point4 = new Vector3F(10, 2, 12), }; HermiteSegment3F h = new HermiteSegment3F { Point1 = c.Point2, Tangent1 = (c.Point3 - c.Point1) * 0.5f, Tangent2 = (c.Point4 - c.Point2) * 0.5f, Point2 = c.Point3, }; Assert.IsTrue(Vector3F.AreNumericallyEqual(c.Point2, c.GetPoint(0))); Assert.IsTrue(Vector3F.AreNumericallyEqual(c.Point3, c.GetPoint(1))); Assert.IsTrue(Vector3F.AreNumericallyEqual(h.GetPoint(0.33f), c.GetPoint(0.33f))); }
public void GetTangent() { Path3F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), path.GetTangent(-10))); Assert.IsTrue(Vector3F.AreNumericallyEqual((new Vector3F(1, 2, 3) - new Vector3F(0, 0, 1)) / 2, path.GetTangent(10))); Assert.IsTrue(Vector3F.AreNumericallyEqual((new Vector3F(1, 2, 3) - new Vector3F(0, 0, 1)) / 2, path.GetTangent(11.5f))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), path.GetTangent(16))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), path.GetTangent(85))); CatmullRomSegment3F catmullOscillate = new CatmullRomSegment3F() { Point1 = new Vector3F(10, 12, 14), Point2 = new Vector3F(10, 14, 8), Point3 = new Vector3F(20, 14, 8), Point4 = new Vector3F(30, 14, 8), }; Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetTangent(0.3f) / 10.0f, path.GetTangent(43))); Assert.IsTrue(Vector3F.AreNumericallyEqual(-catmullOscillate.GetTangent(0.7f) / 10.0f, path.GetTangent(53))); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Cycle; Assert.IsTrue(Vector3F.AreNumericallyEqual((new Vector3F(1, 2, 3) - new Vector3F(0, 0, 1)) / 2, path.GetTangent(0))); path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetTangent(0.4f) / 10.0f, path.GetTangent(-36))); Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetTangent(0.4f) / 10.0f, path.GetTangent(4))); Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetTangent(0.3f) / 10.0f, path.GetTangent(83))); path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.Linear; Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetTangent(1f) / 10.0f, path.GetTangent(434))); path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Constant; path = new Path3F(); path.Add(new PathKey3F() { Parameter = 25, Point = new Vector3F(6, 7, 14), Interpolation = SplineInterpolation.Bezier, TangentIn = new Vector3F(5, 6, 13), TangentOut = new Vector3F(7, 8, 15), }); path.Add(new PathKey3F() { Parameter = 35, Point = new Vector3F(10, 12, 14), Interpolation = SplineInterpolation.Hermite, TangentIn = new Vector3F(1, 0, 0), TangentOut = new Vector3F(1, 0, 0), }); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Linear; float Δu = path[1].Parameter - path[0].Parameter; Assert.IsTrue(Vector3F.AreNumericallyEqual((new Vector3F(6, 7, 14) - new Vector3F(5, 6, 13)) * 3 / Δu, path.GetTangent(0))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(1, 0, 0) / Δu, path.GetTangent(100))); path[1].Parameter = 25; path[0].Parameter = 35; path.Sort(); Δu = path[1].Parameter - path[0].Parameter; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(1, 0, 0) / Δu, path.GetTangent(0))); Assert.IsTrue(Vector3F.AreNumericallyEqual((new Vector3F(7, 8, 15) - new Vector3F(6, 7, 14)) * 3 / Δu, path.GetTangent(100))); path.Add(new PathKey3F() { Parameter = 15, Point = new Vector3F(0, 0, 0), Interpolation = SplineInterpolation.BSpline, }); path.Sort(); }
public void GetPoint() { Path3F path = CreatePath(); path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 1), path.GetPoint(-10))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(4, 5, 7), path.GetPoint(13))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(4, 5, 7), path.GetPoint(16))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(5, 7, 10), path.GetPoint(17))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(5, 7, 10), path.GetPoint(19))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(5, 7, 13)*0.5f + new Vector3F(6, 7, 14)*0.5f, path.GetPoint(22.5f))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(5, 7, 13) * 0.5f + new Vector3F(6, 7, 14) * 0.5f, path.GetPoint(22.5f))); CatmullRomSegment3F catmullOscillate = new CatmullRomSegment3F() { Point1 = new Vector3F(10, 12, 14), Point2 = new Vector3F(10, 14, 8), Point3 = new Vector3F(20, 14, 8), Point4 = new Vector3F(30, 14, 8), }; Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetPoint(0.3f), path.GetPoint(43))); Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetPoint(0.9f), path.GetPoint(51))); CatmullRomSegment3F catmullCircle = new CatmullRomSegment3F() { Point1 = new Vector3F(10, 12, 14), Point2 = new Vector3F(10, 14, 8), Point3 = new Vector3F(20, 14, 8), Point4 = new Vector3F(30, 14, 8), }; path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Cycle; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 1) - (new Vector3F(1, 2, 3) - new Vector3F(0, 0, 1)) / 2 * 9, path.GetPoint(1))); Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullCircle.GetPoint(0.3f), path.GetPoint(43))); path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(10, 14, 8) + new Vector3F(20, 14, 7), path.GetPoint(80f))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(10, 14, 8) + new Vector3F(20, 14, 7) * 2, path.GetPoint(120f))); path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.Linear; Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(10, 14, 8) - new Vector3F(20, 14, 7), path.GetPoint(0f))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(10, 14, 8) - new Vector3F(20, 14, 7) * 2, path.GetPoint(-40f))); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(20, 14, 8) + catmullOscillate.GetTangent(1) / 10 * 50, path.GetPoint(100f))); path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Constant; }
public void GetPoint() { Curve2F empty = new Curve2F(); Assert.IsTrue(float.IsNaN(empty.GetPoint(1).X)); Assert.IsTrue(float.IsNaN(empty.GetPoint(0).Y)); Curve2F curve = CreateCurve(); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Oscillate; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(-10, 1), curve.GetPoint(-10))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(11, 1 + 2f/5f), curve.GetPoint(11))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(19, 5), curve.GetPoint(19))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(23, 5), curve.GetPoint(23))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(24, 4), curve.GetPoint(24))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(29, 4), curve.GetPoint(29))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(30, 7), curve.GetPoint(30))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(33.9999f, 10), curve.GetPoint(33.9999f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(40, 3), curve.GetPoint(40))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(45, 10), curve.GetPoint(45))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(48, 5), curve.GetPoint(48))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(49, curve.GetPoint(47).Y), curve.GetPoint(49))); // Tested with internal assert in Debug Build. curve.GetPoint(31); curve.GetPoint(33); curve.GetPoint(35); curve.GetPoint(36); curve.GetPoint(39); curve.GetPoint(41); curve.GetPoint(46); curve.GetPoint(47); //CatmullRomSegment3F catmullOscillate = new CatmullRomSegment3F() //{ // Point1 = new Vector3F(10, 12, 14), // Point2 = new Vector3F(10, 14, 8), // Point3 = new Vector3F(20, 14, 8), // Point4 = new Vector3F(20, 14, 8), //}; //Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetPoint(0.3f), curve.GetPoint(43))); //Assert.IsTrue(Vector3F.AreNumericallyEqual(catmullOscillate.GetPoint(0.9f), curve.GetPoint(51))); //CatmullRomSegment3F catmullCircle = new CatmullRomSegment3F() //{ // Point1 = new Vector3F(10, 12, 14), // Point2 = new Vector3F(10, 14, 8), // Point3 = new Vector3F(20, 14, 8), // Point4 = new Vector3F(0, 0, 1), //}; curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Cycle; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(-10, -7), curve.GetPoint(-10))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(49, 1 + 2f/5f), curve.GetPoint(49))); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.CycleOffset; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, curve.GetPoint(42).Y), curve.GetPoint(4))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(50, 5 + 4f/5f), curve.GetPoint(50))); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.Linear; Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, curve.GetPoint(42).Y - 4), curve.GetPoint(4f))); CatmullRomSegment3F catmull = new CatmullRomSegment3F { Point1 = new Vector3F(40, 3, 0), Point2 = new Vector3F(45, 10, 0), Point3 = new Vector3F(48, 5, 0), Point4 = new Vector3F(48, 5, 0), }; Vector3F endTangent = catmull.GetTangent(1); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(55f, 5 + (55-48) * endTangent.Y / endTangent.X), curve.GetPoint(55f))); //Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector3F(20, 14, 8) + catmullOscillate.GetTangent(1) / 10 * 50, curve.GetPoint(100f))); // Test more linear pre- and post-behavior. curve = new Curve2F(); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; curve.Add(new CurveKey2F() { Point = new Vector2F(0, 0), Interpolation = SplineInterpolation.Bezier, TangentIn = new Vector2F(-10, 10), TangentOut = new Vector2F(5, 4), }); curve.Add(new CurveKey2F() { Point = new Vector2F(10, 3), Interpolation = SplineInterpolation.Bezier, TangentIn = new Vector2F(8, 2), TangentOut = new Vector2F(15, 4), }); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(-10, 10), curve.GetPoint(-10f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(15, 4), curve.GetPoint(15f))); curve = new Curve2F(); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; curve.Add(new CurveKey2F() { Point = new Vector2F(0, 0), Interpolation = SplineInterpolation.Hermite, TangentIn = new Vector2F(1, 2), TangentOut = new Vector2F(5, 4), }); curve.Add(new CurveKey2F() { Point = new Vector2F(10, 3), Interpolation = SplineInterpolation.Hermite, TangentIn = new Vector2F(8, 2), TangentOut = new Vector2F(2, -1), }); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(-10, -20), curve.GetPoint(-10f))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(15, 3 - 0.5f * 5), curve.GetPoint(15f))); }