Это веселый проект. Вот что я бы сделал, предполагая, что многоугольники выпуклые:
have a NY * 2 array of x positions: int x[NY][2]
foreach polygon
clear the array to -1
for each edge line
foreach horizontal raster line iy intersecting the line
generate ix, the x position where the raster intersects the line
if x[iy][0] == -1, set it to ix, else set x[iy][1] to ix
end foreach iy
end foreach edge
foreach iy
fill the pixels between x[iy][0] and x[iy][1] with the polygons label
end foreach iy
end foreach polygon
Это немного сложнее, чем кажется, потому что вам нужна умственная дисциплина, чтобы думать о растровых координатах не как о пикселях, которые нужно пометить, а как о невидимых линиях между ними. В противном случае вы все запутаетесь из-за пограничных проблем.
Хорошим тестом является то, что если у вас есть многоугольник с нулевой площадью, например, он состоит из ребер из точки A в точку B и обратно в A, он не должен светиться без пикселей. Еще один тест - если у вас есть параллелограмм, высота которого составляет 2 единицы, а его верхний и нижний края имеют ширину 2 единицы, он должен светиться ровно на 4 пикселя.
Если многоугольники НЕ выпуклые, это немного по-другому. Везде, где край пересекает растровую линию, переключите все пиксели оттуда к некоторой произвольно выбранной координате X, такой как левый край «экрана». После завершения всех краев только внутренние пиксели будут переключаться нечетное количество раз.