Чтобы ответить на вторую часть вашего вопроса о том, как найти затронутые пиксели:
Я бы высоко рекомендовал бы математическое решение, как указано выше.Однако для опции brute-force
можно просто создать изображение, нарисовать его, а затем перебрать каждый пиксель, чтобы найти затронутые пиксели.Это будет работать, но будет очень медленным по сравнению с настоящим математическим решением.Он будет расти медленнее с увеличением размера изображения.
Это будет , а не , если вы сглаживаете нарисованный круг, тогда как они могут быть затененными и прозрачными.Однако он будет работать для того, что вы перечислили выше.
например
...
List<Point> points = CreateImage(Color.Red,600,600);
...
private List<Point> CreateImage(Color drawColor, int width, int height)
{
// Create new temporary bitmap.
Bitmap background = new Bitmap(width, height);
// Create new graphics object.
Graphics buffer = Graphics.FromImage(background);
// Draw your circle.
buffer.DrawEllipse(new Pen(drawColor,1), 300, 300, 100, 200);
// Set the background of the form to your newly created bitmap, if desired.
this.BackgroundImage = background;
// Create a list to hold points, and loop through each pixel.
List<Point> points = new List<Point>();
for (int y = 0; y < background.Height; y++)
{
for (int x = 0; x < background.Width; x++)
{
// Does the pixel color match the drawing color?
// If so, add it to our list of points.
Color c = background.GetPixel(x,y);
if (c.A == drawColor.A &&
c.R == drawColor.R &&
c.G == drawColor.G &&
c.B == drawColor.B)
{
points.Add(new Point(x,y));
}
}
}
return points;
}