Я хотел бы получить многоугольник, содержащий некоторые из точек - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно получить набор точек Polygon Container, так как я хотел бы получить многоугольник, как это у меня есть все пиксели на зеленой области на этом изображении введите описание изображения здесь я woule как многоугольник с синей линией но когда я использовал Convex Hull, я получил такой результат введите описание изображения здесь может мне помочь или дать подсказку

Я использовал заливку, используя этот метод

  private void FillFlood(Color color)
    {
        int therthold = 60;
        //var image = (Bitmap) pictureBox1.Image;
        //var img = CopyImage(image);
        //fill();
        //pictureBox1.Image = img;
        //return;
        // if (SColor == true && isload == true)
        var pickedPixel = color;
        var preferedColor = this.PreferedColor;
        img.SetPixel(currentPoint.X, currentPoint.Y, preferedColor);
        Queue<Point> q = new Queue<Point>();
        q.Enqueue(currentPoint);

        while (q.Count > 0)
        {
            var p = q.Dequeue();
            for (int i = 1; i <= 8; i++)
            {
                int x2 = p.X;
                int y2 = p.Y;
                switch (i)
                {
                    case 1://left
                        x2--;
                        break;
                    case 2://Right
                        x2++;
                        break;
                    case 3://down
                        y2++;
                        break;
                    case 4://up
                        y2--;
                        break;
                    case 5://left up
                        x2--;
                        y2--;
                        break;
                    case 6://left bottom
                        x2--;
                        y2++;
                        break;
                    case 7://left bottom
                        x2--;
                        y2++;
                        break;
                    case 8://left bottom
                        x2--;
                        y2++;
                        break;
                }
                if (ISPointOnImg(img, x2, y2) && IsSamePixel(img.GetPixel(x2, y2), pickedPixel, therthold))
                {
                    img.SetPixel(x2, y2, preferedColor);
                    Point p2 = new Point(x2, y2);
                    q.Enqueue(p2);
                }

            }
        }

        pictureBox1.Image = img;
    }

тогда я назвал выпуклым. Это реализация, которую я использую

  public static Point[] MakeHullPresorted(List<Point> points)
    {
        if (points.Count <= 1)
            return points.ToArray();

        // Andrew's monotone chain algorithm. Positive y coordinates correspond to "up"
        // as per the mathematical convention, instead of "down" as per the computer
        // graphics convention. This doesn't affect the correctness of the result.

        List<Point> upperHull = new List<Point>();
        foreach (var p in points)
        {
            while (upperHull.Count >= 2)
            {
                var q = upperHull[upperHull.Count - 1];
                var r = upperHull[upperHull.Count - 2];
                if ((q.X - r.X) * (p.Y - r.Y) >= (q.Y - r.Y) * (p.X - r.X))
                    upperHull.RemoveAt(upperHull.Count - 1);
                else
                    break;
            }
            upperHull.Add(p);
        }
        upperHull.RemoveAt(upperHull.Count - 1);

        var lowerHull = new List<Point>();
        for (int i = points.Count - 1; i >= 0; i--)
        {
            var p = points[i];
            while (lowerHull.Count >= 2)
            {
                var q = lowerHull[lowerHull.Count - 1];
                var r = lowerHull[lowerHull.Count - 2];
                if ((q.X - r.X) * (p.Y - r.Y) >= (q.Y - r.Y) * (p.X - r.X))
                    lowerHull.RemoveAt(lowerHull.Count - 1);
                else
                    break;
            }
            lowerHull.Add(p);
        }
        lowerHull.RemoveAt(lowerHull.Count - 1);

        if (!(upperHull.Count == 1 && Enumerable.SequenceEqual(upperHull, lowerHull)))
            upperHull.AddRange(lowerHull);
        return upperHull.ToArray();
    }
...