Компьютерная графика. Полигональные модели
OL
Простейший алгоритм
//File füll .срр void pixelFill (int x, int у, int borderColor, int color)
{
int с = getpixel ( x, у );
if (( с != borderColor) && ( с 1= color)) {
putpixel ( x, у, color); pixelFill ( x -1, y, borderColor, color), pixelFill ( x + 1, y, borderColor, color); pixelFill ( x, у -1, borderColor, color); pixelFill ( x, у + 1, borderColor, color);
}
}
хотя и абсолютно корректно заполняющий даже самые сложные области, является слишком неэффективным, так как для всякого уже отрисованного пиксела функция вызывается еще 3 раза и, кроме того, этот алгоритм требует слишком большого стека из-за большой глубины рекурсии. Поэтому для решения задачи закраски области предпочтительнее алгоритмы, способные обрабатывать сразу целые группы пикселов, т. е. использовать их "связность" - если данный пиксел принадлежит области, то скорее всего его ближайшие соседи также принадлежат данной области.
Ясно, что по заданной точке (х, у) отрезок [xh хг] максимальной длины, проходящий через эту точку и целиком содержащийся в области, построить несложно. После заполнения этого отрезка необходимо проверить точки, лежащие непосредственно над и под ним. Если при этом мы найдем незаполненные пикселы, принадлежащие данной области, то для их обработки рекурсивно вызывается функция.
Этот алгоритм намного эффективнее предыдущего и способен работать с областями самой сложной формы (рис. 6.8).
о
// File fjlß.cpp #include <conio.h> #include <graphics.h> #include <process.h> #include <stdio.h> #include <stdlib.h> int borderColor = WHITE; int color = GREEN;
int lineFill (int x, int y, int dir, int prevXI, int prevXr) {
int xl = x; int xr = x; int c;
// find line segment do c = getpixel (--xl, y ); while (( c != borderColor) && ( c != color)); do c = getpixel ( ++xr, y ); while (( c != borderColor) && ( c != color)); xl++; xr-;
6. Растровые алгоритмы
line ( xl, у, хг, у ); // fill segment