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)); } }
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)); }
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); }
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); }
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; } }
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)); }