Мне нужно получить набор точек 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();
}