Jarvis算法(礼品包装)或graham-scan-C#

时间:2018-11-12 16:47:12

标签: c# algorithm graphics grahams-scan

我有一个Shapes列表,我必须在它们周围制作一个凸包。我试图做一个礼物包装算法(贾维斯)。到目前为止,我已经发现了很多伪代码,并且我理解逻辑,但是我无法对其进行编程。只能执行第一步-找到最低和“最左”的形状。

        List<Point> Ob = new List<Point>();
        Point p = new Point();
        for (int i = 0; i < L.Count - 1; i++)
        {
            if (L[i].CoordinateX < L[i + 1].CoordinateX) p.X = (int)L[i].CoordinateX;
            if (L[i].CoordinateY < L[i + 1].CoordinateY) p.Y = (int)L[i].CoordinateY;
        }
        Ob.Add(p);

因此,我试图找到最小的角度。我的逻辑是,角度越小,该角度的余弦越小

        double angle = 0, angle1 = 0;
        int num = 0;
        for (int k = 0; k < L.Count - 1; k++)
        {
            angle = Math.Cos((Math.Sqrt(Math.Pow((L[k].CoordinateX - p.X), 2) + Math.Pow((p.Y - L[k].CoordinateY), 2))) / (Math.Sqrt(Math.Pow((L[k].CoordinateX - p.X), 2) + Math.Pow((L[k].CoordinateY - p.Y), 2))));
            angle1 = Math.Cos((Math.Sqrt(Math.Pow((L[k + 1].CoordinateX - p.X), 2) + Math.Pow((p.Y - L[k + 1].CoordinateY), 2))) / (Math.Sqrt(Math.Pow((L[k + 1].CoordinateX - p.X), 2) + Math.Pow((L[k + 1].CoordinateY - p.Y), 2))));
            if (angle < angle1) num = k;
        }
        Point p1 = new Point((int)L[num].CoordinateX, (int)L[num].CoordinateY);
        e.Graphics.DrawLine(new Pen(Color.Black), p, p1);

但是此代码以added 3 circles first,然后依次为added 1 moreso on结尾。显然,这没有任何意义。 还有this

您知道要了解Graham或Jarvis的任何实现吗?

0 个答案:

没有答案