如何在凸壳点之间绘制线条

时间:2014-02-17 02:10:28

标签: c#

假设我通过quickhull算法正确计算了凸包点,我想用线条在面板上显示凸包。但是,我当前的嵌套for循环显示了计算每个单点的一条线。有没有办法在外部点之间画线?我的嵌套for循环错误地显示了这样的行:

enter image description here

我想只在外部显示线条(如栅栏)。我该怎么做?

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]);
                }
            }
        }
    }
}

1 个答案:

答案 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数组中的点是沿着凸包排序的,可能并非如此。如果它们不存在,则存在对它们重新排序的方法(计算点的重心并按照重心的方向对点进行排序)。