Bạn có thể sử dụng thuật toán đơn giản này, dựa trên ý tưởng của lũ đầy helper bitmap:
// backColor is an INT representation of color at fillPoint in the beginning.
// result in pixels of enclosed shape.
private int GetFillSize(Bitmap b, Point fillPoint)
{
int count = 0;
Point p;
Stack pixels = new Stack();
var backColor = b.GetPixel(fillPoint.X, fillPoint.Y);
pixels.Push(fillPoint);
while (pixels.Count != 0)
{
count++;
p = (Point)pixels.Pop();
b.SetPixel(p.X, p.Y, backColor);
if (b.GetPixel(p.X - 1, p.Y).ToArgb() == backColor)
pixels.Push(new Point(p.X - 1, p.Y));
if (b.GetPixel(p.X, p.Y - 1).ToArgb() == backColor)
pixels.Push(new Point(p.X, p.Y - 1));
if (b.GetPixel(p.X + 1, p.Y).ToArgb() == backColor)
pixels.Push(new Point(p.X + 1, p.Y));
if (b.GetPixel(p.X, p.Y + 1).ToArgb() == backColor)
pixels.Push(new Point(p.X, p.Y + 1));
}
return count;
}
CẬP NHẬT
Đoạn mã trên chỉ hoạt động này vùng kín quadruply liên kết. Đoạn mã sau hoạt động với các vùng kín được liên kết octuply.
// offset points initialization.
Point[] Offsets = new Point[]
{
new Point(-1, -1),
new Point(-0, -1),
new Point(+1, -1),
new Point(+1, -0),
new Point(+1, +1),
new Point(+0, +1),
new Point(-1, +1),
new Point(-1, +0),
};
...
private int Fill(Bitmap b, Point fillPoint)
{
int count = 0;
Point p;
Stack<Point> pixels = new Stack<Point>();
var backColor = b.GetPixel(fillPoint.X, fillPoint.Y).ToArgb();
pixels.Push(fillPoint);
while (pixels.Count != 0)
{
count++;
p = (Point)pixels.Pop();
b.SetPixel(p.X, p.Y, Color.FromArgb(backColor));
foreach (var offset in Offsets)
if (b.GetPixel(p.X + offset.X, p.Y + offset.Y).ToArgb() == backColor)
pixels.Push(new Point(p.X + offset.X, p.Y + offset.Y));
}
return count;
}
Hình ảnh bên dưới minh họa rõ ràng ý tôi. Ngoài ra người ta có thể thêm nhiều điểm xa hơn để bù đắp mảng để có thể lấp đầy các khu vực bằng khoảng trống.
[bắt đầu với công thức cho việc tìm kiếm diện tích của một đa giác] (http://en.wikipedia.org/wiki/Polygon#Area_and_centroid) – Servy
nghĩ của pixel kèm theo khu vực của bạn như của đa giác sau đó xem http://stackoverflow.com/questions/2034540/calculating-area-of-irregular-polygon-in-c-sharp về cách lấy khu vực đa giác – m0s
Xin lỗi, đã bị mất bản dịch ... tôi cần tìm ra số khu vực (5) không phải là khu vực của họ. – user873432