Ejemplo n.º 1
0
        public void CompareTangentToQuadratic()
        {
            QuadraticBezier2f quadratic = new QuadraticBezier2f();

            quadratic.C0 = new Vector2f(0.027f, 0.065f);
            quadratic.C1 = new Vector2f(1.234f, 0.012f);
            quadratic.C2 = new Vector2f(0.816f, 1.298f);

            Bezier2f bezier = new Bezier2f(2);

            bezier.Control[0] = quadratic.C0;
            bezier.Control[1] = quadratic.C1;
            bezier.Control[2] = quadratic.C2;

            int count = 8;

            for (int i = 0; i < count; i++)
            {
                float t = i / (count - 1.0f);

                Vector2f t0 = quadratic.Tangent(t);
                Vector2f t1 = bezier.Tangent(t);

                Assert.AreEqual(Math.Round(t0.x, PRECISION), Math.Round(t1.x, PRECISION));
                Assert.AreEqual(Math.Round(t0.y, PRECISION), Math.Round(t1.y, PRECISION));
            }
        }
Ejemplo n.º 2
0
        public void Split()
        {
            Bezier2f bezier = new Bezier2f(3);

            bezier.Control[0] = new Vector2f(0.0f, 0.0f);
            bezier.Control[1] = new Vector2f(0.0f, 2.5f);
            bezier.Control[2] = new Vector2f(2.5f, 5.0f);
            bezier.Control[3] = new Vector2f(5, 5);

            float split = 0.5f;

            Bezier2f b0, b1;

            bezier.Split(split, out b0, out b1);

            Assert.AreEqual(bezier.Degree, b0.Degree);
            Assert.AreEqual(bezier.Degree, b1.Degree);

            Assert.AreEqual(bezier.Control[0], b0.Control[0]);
            Assert.AreEqual(bezier.Control[3], b1.Control[3]);

            Vector2f p = bezier.Position(split);

            Assert.AreEqual(p, b0.Control[3]);
            Assert.AreEqual(p, b1.Control[0]);

            Assert.AreEqual(Math.Round(bezier.Length(100), 4), Math.Round(b0.Length(50) + b1.Length(50), 4));
        }
Ejemplo n.º 3
0
        Bezier2f[] GenerateBeziers(Vector2f[] list)
        {
            Bezier2f[] res = new Bezier2f[(list.Length - 1) / 2];

            for (int i = 2; i < list.Length; i += 2)
            {
                res[(i - 2) / 2] = new Bezier2f(list[i - 2], list[i - 1], list[i]);
            }

            return(res);
        }
Ejemplo n.º 4
0
        Bezier2f[] GenerateBeziersRefl(Vector2f[] list)
        {
            Bezier2f[] res = new Bezier2f[list.Length - 2];

            for (int i = 2; i < list.Length; i++)
            {
                Vector2f reflected = list[i - 2] + 2.0f * (list[i - 1] - list[i - 2]);
                res[i - 2] = new Bezier2f(list[i - 1], reflected, list[i]);
            }

            return(res);
        }
Ejemplo n.º 5
0
        public void PenVG(GraphicsDevice device)
        {
            ICanvas canvas = new GraphicsCanvas(device, device.SwapChain, new Vector2f(1.0f, 1.0f));

            // We first create all needed fills.
            SolidFill solidFill = new SolidFill(Colour.Red);
            Pen       pen       = new Pen(solidFill, 0.003f, 0.0f, OutlineEnd.Square);
            Bezier2f  line      = new Bezier2f(new Vector2f(0.1f, 0.5f), new Vector2f(0.3f, 1.0f),
                                               new Vector2f(0.9f, 0.5f));

            Bezier2f line2 = new Bezier2f(new Vector2f(0.1f, 0.5f), new Vector2f(0.3f, 0.0f),
                                          new Vector2f(0.9f, 0.5f));

            LineSegment2f seg = new LineSegment2f(new Vector2f(0, 0.5f), new Vector2f(0.7f, 0.6f));

            bool exit = false;

            device.SwapChain.Window.Closed += delegate(Window w) { exit = true; };

            float a = 0;

            while (!exit)
            {
                device.SwapChain.Window.DoEvents();

                using (DeviceLock l = device.Lock())
                {
                    device.Clear(device.SwapChain, Colour.Green);

                    device.SetViewports(new Region2i(0, 0, (int)device.SwapChain.Width, (int)device.SwapChain.Height));

                    line.A  = 0.5f * new Vector2f(1, 1) + new Vector2f(1, 1) * 0.5f * MathHelper.Cos(a);
                    line2.B = 0.5f * new Vector2f(1, 1) + new Vector2f(1, 1) * 0.5f * MathHelper.Sin(a);

                    // We render.
                    canvas.Begin(CanvasRenderFlags.None);

                    canvas.DrawShape(pen, line, null);
                    canvas.DrawShape(pen, seg, null);
                    canvas.DrawShape(pen, line2, null);

                    canvas.End();
                }

                device.SwapChain.Present();

                a += 0.01f;
            }
        }
Ejemplo n.º 6
0
        public void CompareLengthToQuadratic()
        {
            QuadraticBezier2f quadratic = new QuadraticBezier2f();

            quadratic.C0 = new Vector2f(0.027f, 0.065f);
            quadratic.C1 = new Vector2f(1.234f, 0.012f);
            quadratic.C2 = new Vector2f(0.816f, 1.298f);

            Bezier2f bezier = new Bezier2f(2);

            bezier.Control[0] = quadratic.C0;
            bezier.Control[1] = quadratic.C1;
            bezier.Control[2] = quadratic.C2;

            float len0 = quadratic.Length;
            float len1 = bezier.Length(100);

            Assert.AreEqual(Math.Round(len0, 4), Math.Round(len1, 4));
        }