コード例 #1
0
        public void GetLength()
        {
            CatmullRomSegment2F c = new CatmullRomSegment2F
            {
                Point1 = new Vector2F(1, 2),
                Point2 = new Vector2F(10, 3),
                Point3 = new Vector2F(7, 8),
                Point4 = new Vector2F(10, 2),
            };

            HermiteSegment2F h = new HermiteSegment2F
            {
                Point1   = c.Point2,
                Tangent1 = (c.Point3 - c.Point1) * 0.5f,
                Tangent2 = (c.Point4 - c.Point2) * 0.5f,
                Point2   = c.Point3,
            };

            float length1 = c.GetLength(0, 1, 20, Numeric.EpsilonF);
            float length2 = h.GetLength(0, 1, 20, Numeric.EpsilonF);

            Assert.IsTrue(Numeric.AreEqual(length1, length2));

            float       approxLength = 0;
            const float step         = 0.0001f;

            for (float u = 0; u <= 1.0f; u += step)
            {
                approxLength += (c.GetPoint(u) - c.GetPoint(u + step)).Length;
            }

            Assert.IsTrue(Numeric.AreEqual(approxLength, length1, 0.01f));
            Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(0, 0.5f, 100, Numeric.EpsilonF) + c.GetLength(0.5f, 1, 100, Numeric.EpsilonF)));
            Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(1, 0, 100, Numeric.EpsilonF)));
        }
コード例 #2
0
        public void GetLength()
        {
            CatmullRomSegment2F c = new CatmullRomSegment2F
              {
            Point1 = new Vector2F(1, 2),
            Point2 = new Vector2F(10, 3),
            Point3 = new Vector2F(7, 8),
            Point4 = new Vector2F(10, 2),
              };

              HermiteSegment2F h = new HermiteSegment2F
              {
            Point1 = c.Point2,
            Tangent1 = (c.Point3 - c.Point1) * 0.5f,
            Tangent2 = (c.Point4 - c.Point2) * 0.5f,
            Point2 = c.Point3,
              };

              float length1 = c.GetLength(0, 1, 20, Numeric.EpsilonF);
              float length2 = h.GetLength(0, 1, 20, Numeric.EpsilonF);
              Assert.IsTrue(Numeric.AreEqual(length1, length2));

              float approxLength = 0;
              const float step = 0.0001f;
              for (float u = 0; u <= 1.0f; u += step)
            approxLength += (c.GetPoint(u) - c.GetPoint(u + step)).Length;

              Assert.IsTrue(Numeric.AreEqual(approxLength, length1, 0.01f));
              Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(0, 0.5f, 100, Numeric.EpsilonF) + c.GetLength(0.5f, 1, 100, Numeric.EpsilonF)));
              Assert.IsTrue(Numeric.AreEqual(c.GetLength(0, 1, 100, Numeric.EpsilonF), c.GetLength(1, 0, 100, Numeric.EpsilonF)));
        }
コード例 #3
0
 public void Flatten()
 {
     var s = new CatmullRomSegment2F
       {
     Point1 = new Vector2F(1, 2),
     Point2 = new Vector2F(10, 3),
     Point3 = new Vector2F(7, 8),
     Point4 = new Vector2F(10, 2),
       };
       var points = new List<Vector2F>();
       var tolerance = 0.01f;
       s.Flatten(points, 10, tolerance);
       Assert.IsTrue(points.Contains(s.Point2));
       Assert.IsTrue(points.Contains(s.Point3));
       var curveLength = s.GetLength(0, 1, 10, tolerance);
       Assert.IsTrue(CurveHelper.GetLength(points) >= curveLength - tolerance * points.Count / 2);
       Assert.IsTrue(CurveHelper.GetLength(points) <= curveLength);
 }
コード例 #4
0
        public void Flatten()
        {
            var s = new CatmullRomSegment2F
            {
                Point1 = new Vector2F(1, 2),
                Point2 = new Vector2F(10, 3),
                Point3 = new Vector2F(7, 8),
                Point4 = new Vector2F(10, 2),
            };
            var points    = new List <Vector2F>();
            var tolerance = 0.01f;

            s.Flatten(points, 10, tolerance);
            Assert.IsTrue(points.Contains(s.Point2));
            Assert.IsTrue(points.Contains(s.Point3));
            var curveLength = s.GetLength(0, 1, 10, tolerance);

            Assert.IsTrue(CurveHelper.GetLength(points) >= curveLength - tolerance * points.Count / 2);
            Assert.IsTrue(CurveHelper.GetLength(points) <= curveLength);
        }
コード例 #5
0
ファイル: Path2FTest.cs プロジェクト: Zolniu/DigitalRune
        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;
        }
コード例 #6
0
        public void GetTangent()
        {
            CatmullRomSegment2F c = new CatmullRomSegment2F
            {
                Point1 = new Vector2F(1, 2),
                Point2 = new Vector2F(10, 3),
                Point3 = new Vector2F(7, 8),
                Point4 = new Vector2F(10, 2),
            };

            HermiteSegment2F h = new HermiteSegment2F
            {
                Point1   = c.Point2,
                Tangent1 = (c.Point3 - c.Point1) * 0.5f,
                Tangent2 = (c.Point4 - c.Point2) * 0.5f,
                Point2   = c.Point3,
            };

            Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent1, c.GetTangent(0)));
            Assert.IsTrue(Vector2F.AreNumericallyEqual(h.Tangent2, c.GetTangent(1)));
            Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetTangent(0.7f), c.GetTangent(0.7f)));
        }
コード例 #7
0
        public void GetPoint()
        {
            CatmullRomSegment2F c = new CatmullRomSegment2F
              {
            Point1 = new Vector2F(1, 2),
            Point2 = new Vector2F(10, 3),
            Point3 = new Vector2F(7, 8),
            Point4 = new Vector2F(10, 2),
              };

              HermiteSegment2F h = new HermiteSegment2F
              {
            Point1 = c.Point2,
            Tangent1 = (c.Point3 - c.Point1) * 0.5f,
            Tangent2 = (c.Point4 - c.Point2) * 0.5f,
            Point2 = c.Point3,
              };

              Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point2, c.GetPoint(0)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(c.Point3, c.GetPoint(1)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(h.GetPoint(0.33f), c.GetPoint(0.33f)));
        }
コード例 #8
0
ファイル: Path2FTest.cs プロジェクト: Zolniu/DigitalRune
        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();
        }
コード例 #9
0
ファイル: Path2FTest.cs プロジェクト: Zolniu/DigitalRune
        public void GetPoint()
        {
            Path2F path = CreatePath();
              path.PreLoop = CurveLoopType.Constant;
              path.PostLoop = CurveLoopType.Oscillate;
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 1), path.GetPoint(-10)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, 5), path.GetPoint(13)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(4, 5), path.GetPoint(16)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7), path.GetPoint(17)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7), path.GetPoint(19)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7) * 0.5f + new Vector2F(6, 7)*0.5f, path.GetPoint(22.5f)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(5, 7) * 0.5f + new Vector2F(6, 7) * 0.5f, path.GetPoint(22.5f)));
              CatmullRomSegment2F catmullOscillate = new CatmullRomSegment2F()
              {
            Point1 = new Vector2F(10, 12),
            Point2 = new Vector2F(10, 14),
            Point3 = new Vector2F(20, 14),
            Point4 = new Vector2F(30, 14),
              };
              Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetPoint(0.3f), path.GetPoint(43)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullOscillate.GetPoint(0.9f), path.GetPoint(51)));

              CatmullRomSegment2F catmullCircle = new CatmullRomSegment2F()
              {
            Point1 = new Vector2F(10, 12),
            Point2 = new Vector2F(10, 14),
            Point3 = new Vector2F(20, 14),
            Point4 = new Vector2F(30, 14),
              };
              path.PreLoop = CurveLoopType.Linear;
              path.PostLoop = CurveLoopType.Cycle;
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(0, 1) - (new Vector2F(1, 2) - new Vector2F(0, 1)) / 2 * 9, path.GetPoint(1)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(catmullCircle.GetPoint(0.3f), path.GetPoint(43)));

              path.PreLoop = CurveLoopType.Cycle;
              path.PostLoop = CurveLoopType.CycleOffset;
              var cycleOffset = new Vector2F(20, 14) - new Vector2F(0, 1);
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) + cycleOffset, path.GetPoint(80f)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) + cycleOffset * 2, path.GetPoint(120f)));

              path.PreLoop = CurveLoopType.CycleOffset;
              path.PostLoop = CurveLoopType.Linear;
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) - cycleOffset, path.GetPoint(0f)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(10, 14) - cycleOffset * 2, path.GetPoint(-40f)));
              Assert.IsTrue(Vector2F.AreNumericallyEqual(new Vector2F(20, 14) + catmullOscillate.GetTangent(1) / 10 * 50, path.GetPoint(100f)));

              path.PreLoop = CurveLoopType.Oscillate;
              path.PostLoop = CurveLoopType.Constant;
        }