Added true lerp functions
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user