From 2a4d2ed9edbce8af79caafa549b487a7a4cfb3fe Mon Sep 17 00:00:00 2001 From: maxluli Date: Wed, 1 Jun 2022 12:28:03 +0200 Subject: [PATCH] Added true lerp functions --- Paint_2/BezierPencil.cs | 57 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/Paint_2/BezierPencil.cs b/Paint_2/BezierPencil.cs index 2cb74b9..2879d17 100644 --- a/Paint_2/BezierPencil.cs +++ b/Paint_2/BezierPencil.cs @@ -83,15 +83,15 @@ namespace Paint_2 } return result; } - private Point LerpY(Point start,Point end,int x) + private Point LerpY(Point start, Point end, int x) { - int newY = start.Y + (x - start.X) * ((end.Y - start.Y) / (end.X - start.X)); - return new Point(x,newY); + int newY = start.Y + (int)((float)(x - start.X) * (float)(((float)end.Y - (float)start.Y) / ((float)end.X - (float)start.X))); + return new Point(x, newY); } - private Point LerpX(Point start,Point end,int y) + private Point LerpX(Point start, Point end, int y) { - int newX = start.X + (y - start.Y) * ((end.Y - start.Y) / (end.X - start.X)); - return new Point(newX,y); + int newX = start.X + (int)((float)(y - start.Y) * (((float)end.Y - (float)start.Y) / ((float)end.X - (float)start.X))); + return new Point(newX, y); } public void Paint(Bitmap canvas) { @@ -116,43 +116,52 @@ namespace Paint_2 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 == 0) - { + { //Drawing the first level of curve Point p1 = points[i - 4]; Point p2 = points[i - 3]; Point p3 = points[i - 2]; Point p4 = points[i - 1]; - /* - // Calculate the lowest x change - int range = Math.Min(Math.Abs(p4.X - p3.X), Math.Min(Math.Abs(p2.X -p1.X), Math.Abs(p3.X - p2.X))); - float firstOffset = Math.Abs(p2.X - p1.X) / range; - float SecondOffset = Math.Abs(p3.X - p2.X) / range; - float thirdOffset = Math.Abs(p4.X - p3.X) / range; - */ - - //[DEBUG] MessageBox.Show("X Diff \n1: " + Math.Abs(p2.X - p1.X) + " \n2: " + Math.Abs(p3.X - p2.X) + " \n3: " + Math.Abs(p4.X - p3.X) + " \nLowest: " + range); - gr.DrawLine(new Pen(Colors[i - 4], Widths[i - 4]), p1, p2); gr.DrawLine(new Pen(Colors[i - 3], Widths[i - 3]), p2, p3); gr.DrawLine(new Pen(Colors[i - 2], Widths[i - 2]), p3, p4); //Drawing the second level of curve - Point p1_2 = new Point((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2); - Point p2_2 = new Point((p2.X + p3.X) / 2, (p2.Y + p3.Y) / 2); - Point p3_2 = new Point((p3.X + p4.X) / 2, (p3.Y + p4.Y) / 2); + + // Calculate the lowest x change + int range = Math.Min(Math.Abs(p4.X - p3.X), Math.Min(Math.Abs(p2.X - p1.X), Math.Abs(p3.X - p2.X))); + float firstOffset = Math.Abs(p2.X - p1.X) / range; + float secondOffset = Math.Abs(p3.X - p2.X) / range; + float thirdOffset = Math.Abs(p4.X - p3.X) / range; + + for (int i = 0;i < range;i++) + { + + } + + Point p1_2 = LerpY(p1, p2, p1.X +(int)(range / 2.0 * firstOffset)); + Point p2_2 = LerpY(p2, p3, p2.X +(int)(range / 2.0 * secondOffset)); + Point p3_2 = LerpY(p3, p4, p3.X +(int)(range / 2.0 * thirdOffset)); gr.DrawLine(new Pen(Colors[i - 1], Widths[i - 1]), p1_2, p2_2); gr.DrawLine(new Pen(Colors[i - 1], Widths[i - 1]), p2_2, p3_2); //Drawing the thirs level of curve - Point p1_3 = new Point((p1_2.X + p2_2.X) / 2, (p1_2.Y + p2_2.Y) / 2); - Point p2_3 = new Point((p2_2.X + p3_2.X) / 2, (p2_2.Y + p3_2.Y) / 2); + range = Math.Min(Math.Abs(p2_2.X - p1_2.X), Math.Abs(p3_2.X - p2_2.X)); + firstOffset = Math.Abs(p2_2.X - p1_2.X) / range; + secondOffset = Math.Abs(p3_2.X - p2_2.X) / range; + + Point p1_3 = LerpY(p1_2, p2_2, p1_2.X + (int)(range / 2.0 * firstOffset)); + Point p2_3 = LerpY(p2_2, p3_2, p2_2.X + (int)(range / 2.0 * secondOffset)); gr.DrawLine(new Pen(Color.Pink, 5), p1_3, p2_3); - //Drawing the Bezier point - Point p1_4 = new Point((p1_3.X + p2_3.X) / 2, (p1_3.Y + p2_3.Y) / 2); + //Drawing the bezier point + range = Math.Abs(p2_3.X - p1_3.X); + firstOffset = Math.Abs(p2_3.X - p1_3.X) / range; + + Point p1_4 = LerpY(p1_3, p2_3, p1_3.X + (int)(range / 2.0 * firstOffset)); gr.FillEllipse(new SolidBrush(Color.AliceBlue), new Rectangle(new Point(p1_4.X - pointSize.Width / 2, p1_4.Y - pointSize.Height / 2), pointSize)); } }