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; }
private Path2F CreatePath() { Path2F path = new Path2F(); path.Add(new PathKey2F() { Parameter = 10, Point = new Vector2F(0, 1), Interpolation = SplineInterpolation.Linear, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.Add(new PathKey2F() { Parameter = 12, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.StepLeft, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.Add(new PathKey2F() { Parameter = 15, Point = new Vector2F(4, 5), Interpolation = SplineInterpolation.StepCentered, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.Add(new PathKey2F() { Parameter = 18, Point = new Vector2F(5, 7), Interpolation = SplineInterpolation.StepRight, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.Add(new PathKey2F() { Parameter = 20, Point = new Vector2F(5, 7), Interpolation = SplineInterpolation.Linear, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); 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 = 31, Point = new Vector2F(8, 10), Interpolation = SplineInterpolation.BSpline, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); 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.Add(new PathKey2F() { Parameter = 40, Point = new Vector2F(10, 14), Interpolation = SplineInterpolation.CatmullRom, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.Add(new PathKey2F() { Parameter = 50, Point = new Vector2F(20, 14), Interpolation = SplineInterpolation.CatmullRom, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); return path; }
public void TwoKeyCurvesTest() { Path2F curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.CatmullRom, }); curve.Add(new PathKey2F() { Parameter = 3, Point = new Vector2F(3, 4), Interpolation = SplineInterpolation.CatmullRom, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(2, 3), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(3, 4), curve.GetPoint(3)); Assert.AreEqual(new Vector2F(3, 4), curve.GetPoint(4)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(1, 1), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(1, 1), curve.GetTangent(2)); Assert.AreEqual(new Vector2F(1, 1), curve.GetTangent(3)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(4)); Assert.IsTrue(Numeric.AreEqual(new Vector2F(2, 2).Length, curve.GetLength(0, 4, 10, 0.01f), 0.01f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; }
public void SerializationXml() { PathKey2F pathKey1 = new PathKey2F { Interpolation = SplineInterpolation.Bezier, Parameter = 56.7f, Point = new Vector2F(1.2f, 3.4f), TangentIn = new Vector2F(0.7f, 2.6f), TangentOut = new Vector2F(1.9f, 3.3f) }; PathKey2F pathKey2 = new PathKey2F { Interpolation = SplineInterpolation.Hermite, Parameter = 66.7f, Point = new Vector2F(2.2f, 1.4f), TangentIn = new Vector2F(1.7f, 3.6f), TangentOut = new Vector2F(2.9f, 2.3f) }; Path2F path = new Path2F { pathKey1, pathKey2 }; path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; path.SmoothEnds = true; const string fileName = "SerializationPath2F.xml"; if (File.Exists(fileName)) File.Delete(fileName); XmlSerializer serializer = new XmlSerializer(typeof(Path2F)); StreamWriter writer = new StreamWriter(fileName); serializer.Serialize(writer, path); writer.Close(); serializer = new XmlSerializer(typeof(Path2F)); FileStream fileStream = new FileStream(fileName, FileMode.Open); path = (Path2F)serializer.Deserialize(fileStream); Assert.AreEqual(2, path.Count); MathAssert.AreEqual(pathKey1, path[0]); MathAssert.AreEqual(pathKey2, path[1]); Assert.AreEqual(CurveLoopType.Cycle, path.PreLoop); Assert.AreEqual(CurveLoopType.CycleOffset, path.PostLoop); Assert.AreEqual(true, path.SmoothEnds); }
public void SerializationBinary() { PathKey2F pathKey1 = new PathKey2F { Interpolation = SplineInterpolation.Bezier, Parameter = 56.7f, Point = new Vector2F(1.2f, 3.4f), TangentIn = new Vector2F(0.7f, 2.6f), TangentOut = new Vector2F(1.9f, 3.3f) }; PathKey2F pathKey2 = new PathKey2F { Interpolation = SplineInterpolation.Hermite, Parameter = 66.7f, Point = new Vector2F(2.2f, 1.4f), TangentIn = new Vector2F(1.7f, 3.6f), TangentOut = new Vector2F(2.9f, 2.3f) }; Path2F path = new Path2F { pathKey1, pathKey2 }; path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.CycleOffset; path.SmoothEnds = true; const string fileName = "SerializationPath2F.bin"; if (File.Exists(fileName)) File.Delete(fileName); FileStream fs = new FileStream(fileName, FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, path); fs.Close(); fs = new FileStream(fileName, FileMode.Open); formatter = new BinaryFormatter(); path = (Path2F)formatter.Deserialize(fs); fs.Close(); Assert.AreEqual(2, path.Count); MathAssert.AreEqual(pathKey1, path[0]); MathAssert.AreEqual(pathKey2, path[1]); Assert.AreEqual(CurveLoopType.Cycle, path.PreLoop); Assert.AreEqual(CurveLoopType.CycleOffset, path.PostLoop); Assert.AreEqual(true, path.SmoothEnds); }
public void ParameterizeByLength() { Path2F empty = new Path2F(); empty.Sort(); empty.ParameterizeByLength(20, 0.001f); // No exception, do nothing. Path2F path = CreatePath(); Path2F lengthPath = CreatePath(); lengthPath.ParameterizeByLength(20, 0.001f); float length = (lengthPath[1].Point - lengthPath[0].Point).Length; Assert.AreEqual(0, lengthPath[0].Parameter); Assert.AreEqual(length, lengthPath[1].Parameter); Assert.AreEqual(length, lengthPath[2].Parameter); Assert.AreEqual(length, lengthPath[3].Parameter); float step = 0.001f; int i = 4; float u = 20; Vector2F oldPoint = path.GetPoint(u); for (; u < 51 && i<10; u += step) { if (Numeric.AreEqual(u, path[i].Parameter)) { Assert.IsTrue(Numeric.AreEqual(length, lengthPath[i].Parameter, 0.01f)); // Set explicit values against numerical problems. length = lengthPath[i].Parameter; u = path[i].Parameter; oldPoint = path.GetPoint(u); i++; } Vector2F newPoint = path.GetPoint(u + step); length += (newPoint - oldPoint).Length; oldPoint = newPoint; } Assert.AreEqual(10, i); // Have we checked all keys? path.PreLoop = CurveLoopType.Constant; path.PostLoop = CurveLoopType.Oscillate; 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 GetTangentShouldReturnZeroIfPathIsEmpty() { Path2F empty = new Path2F(); empty.Sort(); Assert.AreEqual(Vector2F.Zero, empty.GetTangent(-0.5f)); Assert.AreEqual(Vector2F.Zero, empty.GetTangent(0)); Assert.AreEqual(Vector2F.Zero, empty.GetTangent(0.5f)); }
// Add a flower shape. private void CreateFlower() { // Define single flower petal. var petalPath = new Path2F { new PathKey2F { Parameter = 0, Interpolation = SplineInterpolation.Bezier, Point = new Vector2F(0, 0), TangentIn = new Vector2F(0, 0), TangentOut = new Vector2F(-0.2f, 0.2f) }, new PathKey2F { Parameter = 1, Interpolation = SplineInterpolation.Bezier, Point = new Vector2F(0, 1), TangentIn = new Vector2F(-0.3f, 1.1f), TangentOut = new Vector2F(0.3f, 1.1f) }, new PathKey2F { Parameter = 2, Interpolation = SplineInterpolation.Bezier, Point = new Vector2F(0, 0), TangentIn = new Vector2F(0.2f, 0.2f), TangentOut = new Vector2F(0, 0) } }; var petal = new PathFigure2F(); petal.Segments.Add(petalPath); // Duplicate and rotate flower petal several times. const int numberOfPetals = 9; var flower = new CompositeFigure(); flower.Children.Add(petal); for (int i = 1; i < numberOfPetals; i++) { var transformedPetal = new TransformedFigure(petal) { Pose = new Pose(Matrix33F.CreateRotationZ(i * ConstantsF.TwoPi / numberOfPetals)) }; flower.Children.Add(transformedPetal); } var flowerNode = new FigureNode(flower) { Name = "Flower", StrokeThickness = 2, StrokeColor = new Vector3F(1, 0.2f, 0.2f), FillColor = new Vector3F(1, 0.5f, 0.5f), FillAlpha = 1, PoseLocal = new Pose(new Vector3F(3, 1, 0)), ScaleLocal = new Vector3F(0.5f) }; _scene.Children.Add(flowerNode); }
public void GetPointShouldReturnNanIfPathIsEmpty() { Path2F empty = new Path2F(); empty.Sort(); Vector2F p = empty.GetPoint(-0.5f); Assert.IsNaN(p.X); Assert.IsNaN(p.Y); p = empty.GetPoint(0); Assert.IsNaN(p.X); Assert.IsNaN(p.Y); p = empty.GetPoint(0.5f); Assert.IsNaN(p.X); Assert.IsNaN(p.Y); }
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(); }
protected override void LoadContent() { Rectangle bounds = GraphicsDevice.Viewport.Bounds; // Create a 2D path. Path2F path = new Path2F { // Path is cyclic. PreLoop = CurveLoopType.Cycle, PostLoop = CurveLoopType.Cycle, // End of path should smoothly interpolate with start of path. SmoothEnds = true, }; // The spline type. SplineInterpolation splineInterpolation = SplineInterpolation.BSpline; // Add path keys. The parameter of a path key is the time in seconds. path.Add(new PathKey2F { Parameter = 0, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 0.5f, Point = new Vector2F(bounds.Center.X / 2.0f, 2.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 1.0f, Point = new Vector2F(bounds.Center.X, 1.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 1.5f, Point = new Vector2F(3.0f * bounds.Center.X / 2.0f, 2.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 2.0f, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 2.5f, Point = new Vector2F(bounds.Center.X / 2.0f, 4.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 3.0f, Point = new Vector2F(bounds.Center.X, 5.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 3.5f, Point = new Vector2F(3.0f * bounds.Center.X / 2.0f, 4.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 4.0f, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); // Create a path animation using the path. // (Start at parameter value 0 and loop forever.) Path2FAnimation pathAnimation = new Path2FAnimation(path) { StartParameter = 0, EndParameter = float.PositiveInfinity, }; AnimationService.StartAnimation(pathAnimation, _animatablePosition); base.LoadContent(); }
public PathAnimationSample(Microsoft.Xna.Framework.Game game) : base(game) { Rectangle bounds = GraphicsService.GraphicsDevice.Viewport.Bounds; // Create a 2D path. Path2F path = new Path2F { // Path is cyclic. PreLoop = CurveLoopType.Cycle, PostLoop = CurveLoopType.Cycle, // End of path should smoothly interpolate with start of path. SmoothEnds = true, }; // The spline type. const SplineInterpolation splineInterpolation = SplineInterpolation.BSpline; // Add path keys. The parameter of a path key is the time in seconds. path.Add(new PathKey2F { Parameter = 0, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 0.5f, Point = new Vector2F(bounds.Center.X / 2.0f, 2.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 1.0f, Point = new Vector2F(bounds.Center.X, 1.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 1.5f, Point = new Vector2F(3.0f * bounds.Center.X / 2.0f, 2.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 2.0f, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 2.5f, Point = new Vector2F(bounds.Center.X / 2.0f, 4.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 3.0f, Point = new Vector2F(bounds.Center.X, 5.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 3.5f, Point = new Vector2F(3.0f * bounds.Center.X / 2.0f, 4.0f * bounds.Center.Y / 3.0f), Interpolation = splineInterpolation, }); path.Add(new PathKey2F { Parameter = 4.0f, Point = new Vector2F(bounds.Center.X, bounds.Center.Y), Interpolation = splineInterpolation, }); // Create a path animation using the path. // (Start at parameter value 0 and loop forever.) Path2FAnimation pathAnimation = new Path2FAnimation(path) { StartParameter = 0, EndParameter = float.PositiveInfinity, }; AnimationService.StartAnimation(pathAnimation, _animatablePosition).UpdateAndApply(); }
private void CreateGate() { // not gate var trianglePath = new Path2F { new PathKey2F { Parameter = 0, Interpolation = SplineInterpolation.Linear, Point = new Vector2F(1, 0), }, new PathKey2F { Parameter = 1, Interpolation = SplineInterpolation.Linear, Point = new Vector2F(-0.25f, 0.5f), }, new PathKey2F { Parameter = 2, Interpolation = SplineInterpolation.Linear, Point = new Vector2F(-0.25f, -0.5f), }, new PathKey2F { Parameter = 3, Interpolation = SplineInterpolation.Linear, Point = new Vector2F(1, 0), } }; var triangle = new PathFigure2F(); triangle.Segments.Add(trianglePath); var outPinFigure = new PathFigure2F { Segments = { new LineSegment2F() { Point1 = new Vector2F(1, 0), Point2 = new Vector2F(1.2f, 0) } } }; // Add figure to the scene. var notGateNode = new FigureNode(triangle) { Name = "Not Gate", StrokeThickness = 2, StrokeColor = new Vector3F(1, 0.2f, 0.2f), FillColor = new Vector3F(1, 0.5f, 0.5f), FillAlpha = 0.5f, PoseLocal = new Pose(new Vector3F(0, 0, 0)), ScaleLocal = new Vector3F(1), Children = new SceneNodeCollection(3), }; var pinFigure = new PathFigure2F { Segments = { new LineSegment2F { Point1 = new Vector2F(0, 0), Point2 = new Vector2F(0.2f, 0) } } }; var pinsFigure = new CompositeFigure(); var output = new TransformedFigure(pinFigure) { Pose = new Pose(new Vector3F(1.0f, 0, 0)) }; pinsFigure.Children.Add(output); var ina = new TransformedFigure(pinFigure) { Pose = new Pose(new Vector3F(-0.25f - 0.2f, -0.25f, 0)) }; pinsFigure.Children.Add(ina); var inb = new TransformedFigure(pinFigure) { Pose = new Pose(new Vector3F(-0.25f - 0.2f, 0.25f, 0)) }; pinsFigure.Children.Add(inb); notGateNode.Children.Add(new FigureNode(pinsFigure) { Name = "Pins", StrokeThickness = 2, StrokeColor = new Vector3F(0, 0, 0), PoseLocal = new Pose(new Vector3F(0, 0, 0)), ScaleLocal = new Vector3F(1f), }); Scene.Children.Add(notGateNode); }
public void GetParameterByLength() { Path2F empty = new Path2F(); empty.ParameterizeByLength(20, 0.001f); // No exception, do nothing. Assert.IsTrue(float.IsNaN(empty.GetParameterFromLength(10, 20, 0.1f))); Path2F path = CreatePath(); path.ParameterizeByLength(20, 0.001f); Assert.AreEqual(0, path.GetParameterFromLength(0, 20, 0.001f)); Assert.AreEqual(path[2].Parameter, path.GetParameterFromLength(path[2].Parameter, 20, 0.01f)); Assert.AreEqual(path[4].Parameter, path.GetParameterFromLength(path[4].Parameter, 20, 0.01f)); Assert.AreEqual(path[5].Parameter, path.GetParameterFromLength(path[5].Parameter, 20, 0.01f)); Assert.AreEqual(path[6].Parameter, path.GetParameterFromLength(path[6].Parameter, 20, 0.01f)); Assert.AreEqual(path[7].Parameter, path.GetParameterFromLength(path[7].Parameter, 20, 0.01f)); Assert.AreEqual(path[8].Parameter, path.GetParameterFromLength(path[8].Parameter, 20, 0.01f)); Assert.AreEqual(path[9].Parameter, path.GetParameterFromLength(path[9].Parameter, 20, 0.01f)); float pathLength = path[9].Parameter; float desiredLength = 11; float actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.01f), 20, 0.01f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.01f)); desiredLength = 20; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.01f)); desiredLength = 26f; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.01f)); path.PreLoop = CurveLoopType.Linear; path.PostLoop = CurveLoopType.Linear; desiredLength = 60; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -10f; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.01f)); path.PreLoop = CurveLoopType.CycleOffset; path.PostLoop = CurveLoopType.CycleOffset; path.ParameterizeByLength(20, 0.001f); desiredLength = -90; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -50; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -30; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 50; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 100; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 130; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 200; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); path.PreLoop = CurveLoopType.Oscillate; path.PostLoop = CurveLoopType.Cycle; path.ParameterizeByLength(20, 0.001f); desiredLength = -66; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -30; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -20; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 40; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 70; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 100; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 190; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); path.PreLoop = CurveLoopType.Cycle; path.PostLoop = CurveLoopType.Oscillate; path.ParameterizeByLength(20, 0.001f); desiredLength = -90; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -50; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = -30; actualLength = -path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 50; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 110; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 130; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); desiredLength = 210; actualLength = path.GetLength(0, path.GetParameterFromLength(desiredLength, 20, 0.001f), 20, 0.001f); Assert.IsTrue(Numeric.AreEqual(desiredLength, actualLength, 0.1f)); // Test path with zero length. path = new Path2F(); path.Add(new PathKey2F() { Parameter = 10, Point = new Vector2F(0, 1), Interpolation = SplineInterpolation.Linear, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.ParameterizeByLength(20, 0.001f); Assert.AreEqual(0, path.GetParameterFromLength(0, 20, 0.1f)); path.Add(new PathKey2F() { Parameter = 20, Point = new Vector2F(0, 1), Interpolation = SplineInterpolation.Linear, TangentIn = new Vector2F(1, 0), TangentOut = new Vector2F(1, 0), }); path.ParameterizeByLength(20, 0.001f); Assert.AreEqual(0, path.GetParameterFromLength(0, 20, 0.1f)); }
public void OneKeyCurvesTest() { // Test linear curves with 1 point Path2F curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.Linear, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); // Test step curves with 1 point curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.StepLeft, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); // Test B-spline curves with 1 point curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.BSpline, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); // Test Catmull-Rom curves with 1 point curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.CatmullRom, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); // Test Hermite curves with 1 point curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.Hermite, TangentIn = new Vector2F(2, -2), TangentOut = new Vector2F(2, 2), }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 20, 0.01f)); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(3, 4), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(2, 2), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(2, 2), curve.GetTangent(2)); Assert.IsTrue(Numeric.AreEqual(new Vector2F(2, 2).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(-1, 4), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(2, -2), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(2, -2), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.IsTrue(Numeric.AreEqual(new Vector2F(2, 2).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(-1, 4), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(3, 4), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(2, -2), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(2, 2), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(2, 2), curve.GetTangent(2)); Assert.IsTrue(Numeric.AreEqual(new Vector2F(4, 4).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); // Test Bezier curves with 1 point curve = new Path2F(); curve.Add(new PathKey2F() { Parameter = 1, Point = new Vector2F(1, 2), Interpolation = SplineInterpolation.Bezier, TangentIn = new Vector2F(1, 2) - new Vector2F(2, -2) / 3, TangentOut = new Vector2F(1, 2) + new Vector2F(2, 2) / 3, }); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Constant; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(3, 4), curve.GetPoint(2))); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, 2), curve.GetTangent(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, 2), curve.GetTangent(2))); Assert.IsTrue(Numeric.AreEqual(new Vector2F(2, 2).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Constant; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(-1, 4), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, -2), curve.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, -2), curve.GetTangent(1))); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.IsTrue(Numeric.AreEqual(new Vector2F(2, 2).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Linear; curve.PostLoop = CurveLoopType.Linear; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(-1, 4), curve.GetPoint(0)); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(3, 4), curve.GetPoint(2))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, -2), curve.GetTangent(0))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, 2), curve.GetTangent(1))); Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(2, 2), curve.GetTangent(2))); Assert.IsTrue(Numeric.AreEqual(new Vector2F(4, 4).Length, curve.GetLength(0, 2, 10, 0.01f), 0.1f)); curve.PreLoop = CurveLoopType.Cycle; curve.PostLoop = CurveLoopType.Cycle; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.CycleOffset; curve.PostLoop = CurveLoopType.CycleOffset; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); curve.PreLoop = CurveLoopType.Oscillate; curve.PostLoop = CurveLoopType.Oscillate; Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(1)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(0)); Assert.AreEqual(new Vector2F(1, 2), curve.GetPoint(2)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(0)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(1)); Assert.AreEqual(new Vector2F(0, 0), curve.GetTangent(2)); Assert.AreEqual(0, curve.GetLength(0, 2, 10, 0.01f)); }