Example #1
0
        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;
        }
Example #2
0
 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;
 }
Example #3
0
        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;
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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;
        }
Example #7
0
 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));
 }
Example #8
0
        // 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);
        }
Example #9
0
        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);
        }
Example #10
0
        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();
        }
Example #12
0
        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();
        }
Example #13
0
        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);
        }
Example #14
0
        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));
        }
Example #15
0
        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));
        }
Example #16
0
        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);
        }
Example #17
0
    // 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);
    }