'Convert 8 points to a rectangle
I draw 4 lines through 8 points on my picturebox which creates a rectangle.
float xnum = 0.580481F;
float ynum = 0.373782F;
float znum = 0.419519F;
float wnum = 0.219629F;
PointF wnum1 = new PointF(1024, wnum * 1024);
PointF wnum2 = new PointF(0, wnum * 1024);
PointF xnum1 = new PointF(xnum * 1024, 1024);
PointF xnum2 = new PointF(xnum * 1024, 0);
PointF ynum1 = new PointF(1024, ynum * 1024);
PointF ynum2 = new PointF(0, ynum * 1024);
PointF znum1 = new PointF(znum * 1024, 1024);
PointF znum2 = new PointF(znum * 1024, 0);
e.Graphics.DrawLine(pen1, wnum1, wnum2);
e.Graphics.DrawLine(pen1, znum1, znum2);
e.Graphics.DrawLine(pen1, xnum1, xnum2);
e.Graphics.DrawLine(pen1, ynum1, ynum2);
Is there a way to draw the rectangle directly out of my 8 points?
Solution 1:[1]
To draw a rectangle you need four points. What you're asking is to find the intersection of a set of lines described by eight different points, and draw the resulting polygon. When phrased like that, it becomes a matter of working through the math:
private void Form1_Paint(object sender, PaintEventArgs e)
{
using (var pen1 = new Pen(Color.Black))
{
float xnum = 0.580481F;
float ynum = 0.373782F;
float znum = 0.419519F;
float wnum = 0.219629F;
PointF wnum1 = new PointF(1024, wnum * 1024);
PointF wnum2 = new PointF(0, wnum * 1024);
PointF xnum1 = new PointF(xnum * 1024, 1024);
PointF xnum2 = new PointF(xnum * 1024, 0);
PointF ynum1 = new PointF(1024, ynum * 1024);
PointF ynum2 = new PointF(0, ynum * 1024);
PointF znum1 = new PointF(znum * 1024, 1024);
PointF znum2 = new PointF(znum * 1024, 0);
// Given the four lines, find the intersection points that mark the corners of the polygon
PointF[] points = new PointF[]
{
LineLineIntersection(wnum1, wnum2, xnum1, xnum2),
LineLineIntersection(ynum1, ynum2, xnum1, xnum2),
LineLineIntersection(ynum1, ynum2, znum1, znum2),
LineLineIntersection(wnum1, wnum2, znum1, znum2),
};
e.Graphics.DrawPolygon(pen1, points);
}
}
static PointF LineLineIntersection(PointF line1pt1, PointF line1pt2, PointF line2pt1, PointF line2pt2)
{
// Calculate the formula for the first line
float a1 = line1pt2.Y - line1pt1.Y;
float b1 = line1pt1.X - line1pt2.X;
float c1 = a1 * (line1pt1.X) + b1 * (line1pt1.Y);
// Calculate the formula for the second line
float a2 = line2pt2.Y - line2pt1.Y;
float b2 = line2pt1.X - line2pt2.X;
float c2 = a2 * (line2pt1.X) + b2 * (line2pt1.Y);
float determinant = a1 * b2 - a2 * b1;
if (determinant == 0)
{
// The two lines are parallel, there is no intersection (or they're the same line)
throw new Exception("Parallel lines");
}
else
{
// Calculate the point of intersection
float x = (b2 * c1 - b1 * c2) / determinant;
float y = (a1 * c2 - a2 * c1) / determinant;
return new PointF(x, y);
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Anon Coward |