Added true lerp functions

This commit is contained in:
2022-06-01 12:28:03 +02:00
parent 6614cab8a7
commit 2a4d2ed9ed

View File

@@ -85,12 +85,12 @@ namespace Paint_2
}
private Point LerpY(Point start, Point end, int x)
{
int newY = start.Y + (x - start.X) * ((end.Y - start.Y) / (end.X - start.X));
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)
{
int newX = start.X + (y - start.Y) * ((end.Y - start.Y) / (end.X - start.X));
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)
@@ -123,36 +123,45 @@ namespace Paint_2
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));
}
}