using System;
using System.Collections.Generic;
using System.Drawing;
namespace Draw
{
public interface IRenderer
{
void MoveTo(PointF position);
void AddLineTo(PointF position);
void AddArc(PointF center, float radius, float startAngle, float endAngle);
}
public interface IDrawable
{
void Draw(IRenderer renderer);
}
public class Polygon : IDrawable
{
private List<PointF> corners = new List<PointF>();
public Polygon(List<PointF> corners)
{
this.corners = corners;
}
public void Draw(IRenderer renderer)
{
renderer.MoveTo(corners[corners.Count - 1]);
corners.ForEach(c => renderer.AddLineTo(c));
}
}
public class Circle : IDrawable
{
private static float twoPI = (float)(Math.PI * 2);
private PointF center;
private float radius;
public Circle(PointF center, float radius)
{
this.center = center;
this.radius = radius;
}
public void Draw(IRenderer renderer)
{
renderer.AddArc(center, radius, 0F, twoPI);
}
}
public class Diagram : IDrawable
{
private List<IDrawable> elements = new List<IDrawable>();
public Diagram(List<IDrawable> elements)
{
this.elements = elements;
}
public void Draw(IRenderer renderer)
{
elements.ForEach(e => e.Draw(renderer));
}
public void add(IDrawable element)
{
this.elements.Add(element);
}
}
/// <summary>
/// Mocking Renderer for output to Console & Testing
/// </summary>
public class TestRenderer : IRenderer
{
public void MoveTo(PointF position)
{
Console.WriteLine("MoveTo: ({0})", position);
}
public void AddLineTo(PointF position)
{
Console.WriteLine("AddLineTo: ({0})", position);
}
public void AddArc(PointF center, float radius, float startAngle, float endAngle)
{
Console.WriteLine("AddArc: (center: {0}, radius: {1}, startAngle: {2}, endAngle: {3})", center, radius, startAngle, endAngle);
}
}
/// <summary>
/// Windows renderer.
/// Adapted for System.Drawing.Drawing2D commands
/// </summary>
public class WindowsRenderer : IRenderer
{
public void MoveTo(PointF position) { }
public void AddLineTo(PointF position) { }
public void AddArc(PointF center, float radius, float startAngle, float endAngle) { }
}
/// <summary>
/// Xamarin Android renderer.
/// Adapted for Android.Graphics.Canvas commands
/// </summary>
public class AndroidRenderer : IRenderer
{
public void MoveTo(PointF position) { }
public void AddLineTo(PointF position) { }
public void AddArc(PointF center, float radius, float startAngle, float endAngle) { }
}
/// <summary>
/// Xamarin IOS renderer.
/// Adapted for CoreGraphics commands
/// </summary>
public class IOSRenderer : IRenderer
{
public void MoveTo(PointF position) { }
public void AddLineTo(PointF position) { }
public void AddArc(PointF center, float radius, float startAngle, float endAngle) { }
}
class MainClass
{
public static void Main(string[] args)
{
Circle circle = new Circle(new PointF(187.5F, 333.5F), 93.75F);
Polygon triangle = new Polygon(new List<PointF>(new PointF[]{
new PointF(187.5F, 427.25F),
new PointF(268.69F, 286.625F),
new PointF(106.31F, 286.625F)}));
Diagram diagram = new Diagram(new List<IDrawable>(new IDrawable[] { circle, triangle }));
// Renders console statement output for testing
diagram.Draw(new TestRenderer());
// Example of OS specific renderers
// Renders Windows Diagram
diagram.Draw(new WindowsRenderer());
// Renders Android Diagram
diagram.Draw(new AndroidRenderer());
// Renders IOS Diagram
diagram.Draw(new IOSRenderer());
}
}
}