假设我通过quickhull算法正确计算了凸包点,我想用线条在面板上显示凸包。但是,我当前的嵌套for循环显示了计算每个单点的一条线。有没有办法在外部点之间画线?我的嵌套for循环错误地显示了这样的行:
我想只在外部显示线条(如栅栏)。我该怎么做?
private void panel1_Paint(object sender, PaintEventArgs e)
{
if (pointsClicked.Count() == 0)
{
}
else
{
base.OnPaint(e);
using (Graphics g = e.Graphics)
{
var p = new Pen(Color.Black, 3);
// draw a line for each point created
for (int i = 0; i < convexHullPoints.Count() - 1; i++)
{
for (int j = 0; j < convexHullPoints.Count(); j++)
{
g.DrawLine(p, convexHullPoints[i], convexHullPoints[j]);
}
}
}
}
}
答案 0 :(得分:2)
将两个嵌套的for
循环替换为一个循环,迭代凸包外多边形的所有边:
int n = convexHullPoints.Count();
// Draw the edges [P_{n-1},P_0], [P_0,P_1], ..., [P_{n-2},P_{n-1}]
for (int i = n - 1, j = 0; j < n; i = j++)
{
g.DrawLine(p, convexHullPoints[i], convexHullPoints[j]);
}
注意:我在这里假设convexHullPoints
数组中的点是沿着凸包排序的,可能并非如此。如果它们不存在,则存在对它们重新排序的方法(计算点的重心并按照重心的方向对点进行排序)。