Вы можете сделать это в одном цикле for, если вы предполагаете, что ваш многоугольник многообразен. Просто начните с верхнего левого угла и следите за четностью, когда пересекаете край.
Простая 2D версия (с добавленным транспонированным кейсом):
void scan_polygon(int rows, int cols, char** data, char** result)
{
for(int r=0; r<rows; ++r)
for(int s = 0, c=0; c<cols-1; ++c)
{
s ^= s ? ( data[r][c] && !data[r][c+1]) :
(!data[r][c] && data[r][c-1]);
result[r][c] = s;
}
for(int c=0; c<cols; ++c)
for(int s = 0, r=0; r<rows-1; ++r)
{
s ^= s ? ( data[r][c] && !data[r+1][c]) :
(!data[r][c] && data[r-1][c]);
result[r][c] &= s;
}
}
Где это может сломаться, если у вас есть висящий пиксель или край, высовывающийся вдоль линии сканирования, например:
00000000000000000000
00000000*11111111111 <--- Whoops!
000000*111*000000000
00000*11111*00000000
Чтобы исправить это, вы можете просто повторить процесс для транспонированного массива, а затем И все результаты вместе. Подобный подход использовался Sud et al для вокселизации сетки на GPU. Это не безупречно, так как вы можете иметь конфигурации нескольких немногообразных вершин, где пересекаются шумовые конусы от них, но если вы можете гарантировать, что этого не произойдет (или если это случается редко), это одна из самые простые методы, которые я знаю, чтобы получить быстрый результат.
РЕДАКТИРОВАТЬ: модифицированное решение, чтобы показать, как и массивы обратно вместе после выполнения итерации.