Компьютерная графика. Полигональные модели

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


⇐ Предыдущая| |Следующая ⇒