diff --git a/Paint_2/BezierPencil.cs b/Paint_2/BezierPencil.cs index b06ce44..b262347 100644 --- a/Paint_2/BezierPencil.cs +++ b/Paint_2/BezierPencil.cs @@ -13,6 +13,7 @@ namespace Paint_2 { private List> _drawings; private List> _drawingsRedo; + private PaintToolUtils Utils; private List _colors; private List _colorsRedo; private List _widths; @@ -41,9 +42,7 @@ namespace Paint_2 WidthsRedo = new List(); Name = name; - //I KNOW I KNOW I LITTERALLY REINVENTED UNIT TEST BUT IF I CREATE SOME I WILL NEED TO DO THEM ALL STOP HARASSING ME - //MessageBox.Show("Lerp Test\nstart = 100;100\nend = 200;200\nt = 0.2\nExpected : 120;120 Actual : "+Lerp(new Point(100,100),new Point(200,200),0.2f)); - //MessageBox.Show("Lerp Test\nstart = 200;200\nend = 100;100\nt = 0.2\nExpected : 180;180 Actual : " + Lerp(new Point(200, 200), new Point(100, 100), 0.2f)); + Utils = new PaintToolUtils(this); } public void Add(Point point) { @@ -55,48 +54,12 @@ namespace Paint_2 public void Clear() { - Drawings = new List>(); - DrawingsRedo = new List>(); - Colors = new List(); - ColorsRedo = new List(); - Widths = new List(); - WidthsRedo = new List(); + Utils.StandartClear(); } public List GetLastColors(int colorNumber) { - List result = new List(); - if (Colors.Count <= colorNumber) - { - //We need to fill with black color - for (int i = Colors.Count; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - for (int i = colorNumber - Colors.Count; i > 0; i--) - { - result.Add(Color.FromArgb(0x00, 0x00, 0x00)); - } - } - else - { - for (int i = colorNumber; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - } - return result; - } - private Point Lerp(Point start, Point end, float t) - { - //float xRatio = Math.Min((float)start.X,end.X) / Math.Max((float)start.X,end.X); - //float yRatio = Math.Min((float)start.Y, end.Y) / Math.Max((float)start.Y, end.Y); - int xDiff = end.X - start.X; - int yDiff = end.Y - start.Y; - int resultX = start.X + (int)(t * xDiff); - int resultY = start.Y + (int)(t * yDiff); - Point result = new Point(resultX, resultY); - return result; + return Utils.SandartGetLastColors(colorNumber); } public void Paint(Bitmap canvas) { @@ -120,16 +83,6 @@ namespace Paint_2 pointSize = new Size(Widths[0], Widths[0]); gr.FillEllipse(new SolidBrush(Colors[i - 1]), new Rectangle(new Point(points[i - 1].X - pointSize.Width / 2, points[i - 1].Y - pointSize.Height / 2), pointSize)); - /* - if (i >= 4) - { - Point p1 = points[i - 4]; - Point p2 = points[i - 3]; - Point p3 = points[i - 2]; - Point p4 = points[i - 1]; - BezierGenerator(gr, p1, p2, p3, p4, i); - } - */ ContinuousBezierGenerator(gr, points, i); } } @@ -150,14 +103,12 @@ namespace Paint_2 { for (int pos = 0; pos < WorkingList.Count - 1; pos++) { - //gr.DrawLine(new Pen(Color.Red), WorkingList[pos], WorkingList[pos + 1]); - //DumpList.Add(Lerp(WorkingList[pos], WorkingList[pos + 1], 0.5f)); - DumpList.Add(Lerp(WorkingList[pos], WorkingList[pos + 1], t)); + DumpList.Add(Utils.Lerp(WorkingList[pos], WorkingList[pos + 1], t)); } } else { - DumpList.Add(Lerp(WorkingList[0], WorkingList[1], precision)); + DumpList.Add(Utils.Lerp(WorkingList[0], WorkingList[1], precision)); } WorkingList = new List(DumpList); DumpList = new List(); @@ -177,23 +128,21 @@ namespace Paint_2 for (float t = 0; t <= 1; t += precision) { - //Quadratic Bezier Curve creator - //Drawing the first step of the curve - Point p1_2 = Lerp(p1, p2, t); - Point p2_2 = Lerp(p2, p3, t); - Point p3_2 = Lerp(p3, p4, t); + Point p1_2 = Utils.Lerp(p1, p2, t); + Point p2_2 = Utils.Lerp(p2, p3, t); + Point p3_2 = Utils.Lerp(p3, p4, t); //gr.DrawLine(new Pen(GetRandomColor(), Widths[0]), p1_2, p2_2); //gr.DrawLine(new Pen(GetRandomColor(), Widths[0]), p2_2, p3_2); //Drawing the second step of the curve - Point p1_3 = Lerp(p1_2, p2_2, t); - Point p2_3 = Lerp(p2_2, p3_2, t); + Point p1_3 = Utils.Lerp(p1_2, p2_2, t); + Point p2_3 = Utils.Lerp(p2_2, p3_2, t); //gr.DrawLine(new Pen(GetRandomColor(), Widths[0]), p1_3, p2_3); //Drawing the Bezier Point - Point p1_4 = Lerp(p1_3, p2_3, t); + Point p1_4 = Utils.Lerp(p1_3, p2_3, t); gr.FillEllipse(new SolidBrush(GetRandomColor()), new Rectangle(p1_4.X - Widths[0] / 2, p1_4.Y - Widths[0] / 2, Widths[0], Widths[0])); } @@ -205,18 +154,12 @@ namespace Paint_2 } public void Start(Color color, int width) { - Color = color; - Width = width; - List points = new List(); - Drawings.Add(points); - Colors.Add(Color); - Widths.Add(Width); + Utils.StandartStart(color,width); } public void Stop() { - //Implement the bezier curve algorythm (if there are enough points) - + //Empty } public override string ToString() @@ -226,38 +169,12 @@ namespace Paint_2 public void Undo() { - int last = Drawings.Count - 1; - if (Drawings.Count > 1) - { - DrawingsRedo.Add(Drawings[last]); - Drawings.RemoveAt(Drawings.Count - 1); - ColorsRedo.Add(Colors[last]); - Colors.RemoveAt(Colors.Count - 1); - WidthsRedo.Add(Widths[last]); - Widths.RemoveAt(Widths.Count - 1); - } - else - { - DrawingsRedo.Add(Drawings[0]); - Drawings.Clear(); - ColorsRedo.Add(Colors[0]); - Colors.Clear(); - WidthsRedo.Add(Widths[0]); - Widths.Clear(); - } + Utils.StandartUndo(); } public void Redo() { - if (DrawingsRedo.Count > 0 && WidthsRedo.Count > 0 && ColorsRedo.Count > 0) - { - Drawings.Add(DrawingsRedo[DrawingsRedo.Count - 1]); - DrawingsRedo.RemoveAt(DrawingsRedo.Count - 1); - Colors.Add(ColorsRedo[ColorsRedo.Count - 1]); - ColorsRedo.RemoveAt(ColorsRedo.Count - 1); - Widths.Add(WidthsRedo[WidthsRedo.Count - 1]); - WidthsRedo.RemoveAt(WidthsRedo.Count - 1); - } + Utils.StandartRedo(); } public Bitmap Stop(Bitmap bmp) diff --git a/Paint_2/DotPencil.cs b/Paint_2/DotPencil.cs index e488fc7..f3e6524 100644 --- a/Paint_2/DotPencil.cs +++ b/Paint_2/DotPencil.cs @@ -18,6 +18,7 @@ namespace Paint_2 private List> _drawings; private List> _drawingsRedo; + private PaintToolUtils Utils; private List _colors; private List _colorsRedo; private List _widths; @@ -45,6 +46,8 @@ namespace Paint_2 Widths = new List(); WidthsRedo = new List(); Name = name; + + Utils = new PaintToolUtils(this); } public void Add(Point point) { @@ -70,21 +73,11 @@ namespace Paint_2 } public void Start(Color color, int width) { - Color = color; - Width = width; - List points = new List(); - Drawings.Add(points); - Colors.Add(Color); - Widths.Add(Width); + Utils.StandartStart(color,width); } public void Clear() { - Drawings = new List>(); - DrawingsRedo = new List>(); - Colors = new List(); - ColorsRedo = new List(); - Widths = new List(); - WidthsRedo = new List(); + Utils.StandartClear(); } public void Stop() { @@ -117,27 +110,7 @@ namespace Paint_2 } public List GetLastColors(int colorNumber) { - List result = new List(); - if (Colors.Count <= colorNumber) - { - //We need to fill with black color - for (int i = Colors.Count; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - for (int i = colorNumber - Colors.Count; i > 0; i--) - { - result.Add(Color.FromArgb(0x00, 0x00, 0x00)); - } - } - else - { - for (int i = colorNumber; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - } - return result; + return Utils.SandartGetLastColors(colorNumber); } public override string ToString() { @@ -146,38 +119,12 @@ namespace Paint_2 public void Undo() { - int last = Drawings.Count - 1; - if (Drawings.Count > 1) - { - DrawingsRedo.Add(Drawings[last]); - Drawings.RemoveAt(Drawings.Count - 1); - ColorsRedo.Add(Colors[last]); - Colors.RemoveAt(Colors.Count - 1); - WidthsRedo.Add(Widths[last]); - Widths.RemoveAt(Widths.Count - 1); - } - else - { - DrawingsRedo.Add(Drawings[0]); - Drawings.Clear(); - ColorsRedo.Add(Colors[0]); - Colors.Clear(); - WidthsRedo.Add(Widths[0]); - Widths.Clear(); - } + Utils.StandartUndo(); } public void Redo() { - if (DrawingsRedo.Count > 0 && WidthsRedo.Count > 0 && ColorsRedo.Count > 0) - { - Drawings.Add(DrawingsRedo[DrawingsRedo.Count - 1]); - DrawingsRedo.RemoveAt(DrawingsRedo.Count - 1); - Colors.Add(ColorsRedo[ColorsRedo.Count - 1]); - ColorsRedo.RemoveAt(ColorsRedo.Count - 1); - Widths.Add(WidthsRedo[WidthsRedo.Count - 1]); - WidthsRedo.RemoveAt(WidthsRedo.Count - 1); - } + Utils.StandartRedo(); } public Bitmap Stop(Bitmap bmp) diff --git a/Paint_2/PaintToolUtils.cs b/Paint_2/PaintToolUtils.cs new file mode 100644 index 0000000..bcf1684 --- /dev/null +++ b/Paint_2/PaintToolUtils.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace Paint_2 +{ + internal class PaintToolUtils + { + private PaintTool Target; + public PaintToolUtils(PaintTool target) + { + Target = target; + } + public void StandartStart(Color color, int width) + { + Target.Color = color; + Target.Width = width; + List points = new List(); + Target.Drawings.Add(points); + Target.Colors.Add(Target.Color); + Target.Widths.Add(Target.Width); + } + public void StandartClear() + { + Target.Drawings = new List>(); + Target.DrawingsRedo = new List>(); + Target.Colors = new List(); + Target.ColorsRedo = new List(); + Target.Widths = new List(); + Target.WidthsRedo = new List(); + } + public void StandartUndo() + { + int last = Target.Drawings.Count - 1; + if (Target.Drawings.Count > 1 && Target.Widths.Count > 1 && Target.Colors.Count > 1) + { + Target.DrawingsRedo.Add(Target.Drawings[last]); + Target.Drawings.RemoveAt(Target.Drawings.Count - 1); + Target.ColorsRedo.Add(Target.Colors[last]); + Target.Colors.RemoveAt(Target.Colors.Count - 1); + Target.WidthsRedo.Add(Target.Widths[last]); + Target.Widths.RemoveAt(Target.Widths.Count - 1); + } + else if (Target.Drawings.Count == 1 && Target.Widths.Count == 1 && Target.Colors.Count == 1) + { + Target.DrawingsRedo.Add(Target.Drawings[0]); + Target.Drawings.Clear(); + Target.ColorsRedo.Add(Target.Colors[0]); + Target.Colors.Clear(); + Target.WidthsRedo.Add(Target.Widths[0]); + Target.Widths.Clear(); + } + } + public void StandartRedo() + { + if (Target.DrawingsRedo.Count > 0 && Target.WidthsRedo.Count > 0 && Target.ColorsRedo.Count > 0) + { + Target.Drawings.Add(Target.DrawingsRedo[Target.DrawingsRedo.Count - 1]); + Target.DrawingsRedo.RemoveAt(Target.DrawingsRedo.Count - 1); + Target.Colors.Add(Target.ColorsRedo[Target.ColorsRedo.Count - 1]); + Target.ColorsRedo.RemoveAt(Target.ColorsRedo.Count - 1); + Target.Widths.Add(Target.WidthsRedo[Target.WidthsRedo.Count - 1]); + Target.WidthsRedo.RemoveAt(Target.WidthsRedo.Count - 1); + } + } + public List SandartGetLastColors(int colorNumber) + { + List result = new List(); + if (Target.Colors.Count <= colorNumber) + { + //We need to fill with black color + for (int i = Target.Colors.Count; i > 0; i--) + { + result.Add(Target.Colors[(Target.Colors.Count) - i]); + } + for (int i = colorNumber - Target.Colors.Count; i > 0; i--) + { + result.Add(Color.FromArgb(0x00, 0x00, 0x00)); + } + } + else + { + for (int i = colorNumber; i > 0; i--) + { + result.Add(Target.Colors[(Target.Colors.Count) - i]); + } + } + return result; + } + public Point Lerp(Point start, Point end, float t) + { + int xDiff = end.X - start.X; + int yDiff = end.Y - start.Y; + int resultX = start.X + (int)(t * xDiff); + int resultY = start.Y + (int)(t * yDiff); + Point result = new Point(resultX, resultY); + return result; + } + + } +} diff --git a/Paint_2/Paint_2.csproj b/Paint_2/Paint_2.csproj index ab0ed0c..b687bf6 100644 --- a/Paint_2/Paint_2.csproj +++ b/Paint_2/Paint_2.csproj @@ -55,6 +55,7 @@ Form1.cs + diff --git a/Paint_2/Pencil.cs b/Paint_2/Pencil.cs index fc925c2..5575239 100644 --- a/Paint_2/Pencil.cs +++ b/Paint_2/Pencil.cs @@ -18,6 +18,7 @@ namespace Paint_2 private List> _drawings; private List> _drawingsRedo; + private PaintToolUtils Utils; private List _colors; private List _colorsRedo; private List _widths; @@ -45,6 +46,9 @@ namespace Paint_2 Widths = new List(); WidthsRedo = new List(); Name = name; + + + Utils = new PaintToolUtils(this); } public void Add(Point point) { @@ -74,21 +78,11 @@ namespace Paint_2 } public void Start(Color color, int width) { - Color = color; - Width = width; - List points = new List(); - Drawings.Add(points); - Colors.Add(Color); - Widths.Add(Width); + Utils.StandartStart(color,width); } public void Clear() { - Drawings = new List>(); - DrawingsRedo = new List>(); - Colors = new List(); - ColorsRedo = new List(); - Widths = new List(); - WidthsRedo = new List(); + Utils.StandartClear(); } public Bitmap Stop(Bitmap bmp) { @@ -99,79 +93,13 @@ namespace Paint_2 } return bmp; } - private Color GetRandomColor() + private Bitmap PostProcessing(List Drawing,Bitmap bmp,int width,Color color) { - Random rnd = new Random(); - return Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)); - } - private void ContinuousBezierGenerator(Graphics gr, List points, int width) - { - if (points.Count >= 4 && points.Count % 2 == 0) - { - float precision = 0.01f; - for (float t = 0; t <= 1; t += precision) - { - List DumpList = new List(); - List WorkingList = new List(points); - - while (WorkingList.Count != 1) - { - if (WorkingList.Count > 2) - { - for (int pos = 0; pos < WorkingList.Count - 1; pos++) - { - DumpList.Add(Lerp(WorkingList[pos], WorkingList[pos + 1], t)); - } - } - else - { - DumpList.Add(Lerp(WorkingList[0], WorkingList[1], precision)); - } - WorkingList = new List(DumpList); - DumpList = new List(); - } - gr.FillEllipse(new SolidBrush(GetRandomColor()), new Rectangle(WorkingList[0].X - width / 2, WorkingList[0].Y - width / 2, width, width)); - } - } - } - private Point Lerp(Point start, Point end, float t) - { - int xDiff = end.X - start.X; - int yDiff = end.Y - start.Y; - int resultX = start.X + (int)(t * xDiff); - int resultY = start.Y + (int)(t * yDiff); - Point result = new Point(resultX, resultY); - return result; - } - private Bitmap PostProcessing(List Drawing,Bitmap bmp,int width) - { - Graphics gr = Graphics.FromImage(bmp); - ContinuousBezierGenerator(gr, Drawing,width); return bmp; } public List GetLastColors(int colorNumber) { - List result = new List(); - if (Colors.Count <= colorNumber) - { - //We need to fill with black color - for (int i = Colors.Count; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - for (int i = colorNumber - Colors.Count; i > 0; i--) - { - result.Add(Color.FromArgb(0x00, 0x00, 0x00)); - } - } - else - { - for (int i = colorNumber; i > 0; i--) - { - result.Add(Colors[(Colors.Count) - i]); - } - } - return result; + return Utils.SandartGetLastColors(colorNumber); } public override string ToString() { @@ -180,38 +108,12 @@ namespace Paint_2 public void Undo() { - int last = Drawings.Count - 1; - if (Drawings.Count > 1) - { - DrawingsRedo.Add(Drawings[last]); - Drawings.RemoveAt(Drawings.Count - 1); - ColorsRedo.Add(Colors[last]); - Colors.RemoveAt(Colors.Count - 1); - WidthsRedo.Add(Widths[last]); - Widths.RemoveAt(Widths.Count - 1); - } - else - { - DrawingsRedo.Add(Drawings[0]); - Drawings.Clear(); - ColorsRedo.Add(Colors[0]); - Colors.Clear(); - WidthsRedo.Add(Widths[0]); - Widths.Clear(); - } + Utils.StandartUndo(); } public void Redo() { - if (DrawingsRedo.Count > 0 && WidthsRedo.Count > 0 && ColorsRedo.Count > 0) - { - Drawings.Add(DrawingsRedo[DrawingsRedo.Count - 1]); - DrawingsRedo.RemoveAt(DrawingsRedo.Count - 1); - Colors.Add(ColorsRedo[ColorsRedo.Count - 1]); - ColorsRedo.RemoveAt(ColorsRedo.Count - 1); - Widths.Add(WidthsRedo[WidthsRedo.Count - 1]); - WidthsRedo.RemoveAt(WidthsRedo.Count - 1); - } + Utils.StandartRedo(); } } }