From 5ea0f49bb1dd2bcfe282c45aaa25358bc93771dc Mon Sep 17 00:00:00 2001 From: Lukasz Baldyga Date: Wed, 21 Oct 2020 13:40:15 +0100 Subject: [PATCH] Implemented RegularPolygons --- .../Advanced Software Engineering/Command.cs | 60 +++++++++++++++---- .../Commander.cs | 16 +++-- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/Advanced Software Engineering/Advanced Software Engineering/Command.cs b/Advanced Software Engineering/Advanced Software Engineering/Command.cs index 4a8ddf8..c949295 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Command.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Command.cs @@ -1,6 +1,8 @@ using System; +using System.CodeDom; using System.Collections.Generic; using System.Drawing; +using System.Linq; namespace Advanced_Software_Engineering { class VerbFactory { @@ -9,7 +11,7 @@ namespace Advanced_Software_Engineering { Dictionary commandAndParameters = SettingsAndHelperFunctions.CommandAndParameterParser(fullCommand); string command = commandAndParameters["command"][0]; - string[] parameters = commandAndParameters["parameters"]; + string[] parameters = commandAndParameters.Keys.Contains("parameters") ? commandAndParameters["parameters"] : new string[] { }; switch (command) { case "moveto": @@ -41,14 +43,30 @@ namespace Advanced_Software_Engineering { throw e; } } else throw new Exception("Command has an incorrect number of parameters"); - - case "dot": - case "clear": case "shape": + //Check parameters + if (parameters.Length == 2) { + return new + RegularPolygon(drawer, + SettingsAndHelperFunctions.ConvertToInt(parameters[0]), + SettingsAndHelperFunctions.ConvertToDouble(parameters[1]) + ); + } + if (parameters.Length == 3) { + return new RegularPolygon(drawer, + SettingsAndHelperFunctions.ConvertToInt(parameters[0]), + SettingsAndHelperFunctions.ConvertToDouble(parameters[1]), + SettingsAndHelperFunctions.ConvertToDouble(parameters[2]) + ); + } else throw new Exception("Command has an incorrect number of parameters"); case "square": case "rectangle": case "circle": case "triangle": + + + case "dot": + case "clear": case "pen": case "fill": case "color": @@ -91,7 +109,7 @@ namespace Advanced_Software_Engineering { } - class DrawTo : Verb { + class DrawTo : Verb { protected Drawer drawer; protected Point moveToPoint; @@ -138,23 +156,43 @@ namespace Advanced_Software_Engineering { } /// - /// A class that generates sets + /// A class that generates a RegularPolygon verb. /// - class RegularPolygons : Verb { + class RegularPolygon : Verb { + protected Drawer drawer; + protected int sides; + protected double scale; + protected double offset; + List points; - List verbs; + public RegularPolygon(Drawer drawer, int sides, double scale, double offset = 0) { + points = new List(); - RegularPolygons(Drawer drawer, Point origin, int sides, int scale) { + double constantAngleDelta = 2 * Math.PI / sides; + for (int side = 0; side < sides; side++) { + double angle = (constantAngleDelta * side) + offset; + double dx = scale * Math.Sin(angle); + double dy = scale * Math.Cos(angle); + points.Add(new Point((int)dx, (int)dy)); + } + + this.sides = sides; + this.scale = scale; + this.drawer = drawer; + this.offset = offset; } public void ExecuteVerb() { - + Point currentOrigin = drawer.GetPenPosition(); + List originShiftedPoints = new List(); + foreach (Point point in points) originShiftedPoints.Add(new Point(point.X + currentOrigin.X, point.Y + currentOrigin.Y)); + drawer.DrawLines(originShiftedPoints.ToArray()); } public string GetDescription() { - return null; + return "Draws a " + sides + " sided regular polygon, with rotation of " + offset + " radians, with inner radius of " + scale; } } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Commander.cs b/Advanced Software Engineering/Advanced Software Engineering/Commander.cs index 589c913..1cdc486 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Commander.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Commander.cs @@ -21,12 +21,14 @@ namespace Advanced_Software_Engineering { public Commander(Graphics graphics) { this.graphics = graphics; this.drawer = new Drawer(this.graphics); + drawer.ResetDrawer(); } public Commander(Graphics graphics, string rawCommands) { this.graphics = graphics; this.drawer = new Drawer(this.graphics); this.ProcessCommands(rawCommands); + drawer.ResetDrawer(); } public void AddCommand(Verb command) { @@ -78,6 +80,7 @@ namespace Advanced_Software_Engineering { public void RemoveAllCommands() { commands = new List(); + drawer.ResetDrawer(); } } @@ -97,13 +100,18 @@ namespace Advanced_Software_Engineering { public Drawer(Graphics graphics) { this.graphics = graphics; + ResetDrawer(); + } + + public void ResetDrawer() { + graphics.Clear(Color.White); + penPosition = new Point(0, 0); pen = new Pen(defaultColor, defaultWidth); brush = new SolidBrush(defaultColor); } - public void MovePen(Point point) { - this.penPosition = point; - } + public void MovePen(Point point) => penPosition = point; + public Point GetPenPosition() => new Point(penPosition.X, penPosition.Y); public bool GetFill() => fill; public void EnableFill() => fill = false; @@ -139,7 +147,7 @@ namespace Advanced_Software_Engineering { //Doesn't move pen public void DrawLines(GraphicsPath path) { - path.Widen(pen); + //path.Widen(pen); if (fill) graphics.FillPath(brush, path); graphics.DrawPath(pen, path); }