Отчет по лабораторной работе №8
Министерство образования и науки РФ
Северо-Кавказский Горно-металлургический
институт
(Государственный Технологический Университет)
Факультет: Информационных технологий
Кафедра: Автоматизированной обработки информации
Отчет по лабораторной работе №8
Выполнила:: Студентка группы ИВб 11-2
Глотова А. В.
Проверила: Кокоева Диана Шалваевна
Владикавказ 2014 г.
СОДЕРЖАНИЕ
Процесс работы программы.. 4
Приложение. 6
Задание: Изучить и программно реализовать алгоритм заливки изображения с затравкой.
Процесс работы программы
Программа написана на языке ObjectPascal.
Построчный алгоритм заполнения с затравкой:
1. Затравочный пиксел на интервале извлекается из стека, содержащего затравочные пикселы.
2. Интервал с затравочным пикселом заполняется влево и вправо от затравки вдоль сканирующей строки до тех пор, пока не будет найдена граница.
3. В переменных Хлев и Хправ запоминаются крайний левый и крайний правый пикселы интервала.
4. В диапазоне Хлев <= x <= Xправ проверяются строки, расположенные непосредственно над и под текущей строкой. Определяется, есть ли на них еще не заполненные пикселы. Если такие пикселы есть (т. е. не все пикселы граничные, или уже заполненные), то в указанном диапазоне крайний правый пиксел в каждом интервале отмечается как затравочный и помещается в стек.
5. При инициализации алгоритма в стек помещается единственный затравочный пиксел, работа завершается при опустошении стека.
При открытии формы на ней расположена только кнопка заливки, созданная с помощью Button и нарисованный заранее программным способом по заданным координатам прямоугольник( рис.1):
Рис.1. Начальная форма
По нажатию на кнопку реализуется описанный выше алгоритм заполнения прямоугольника с затравкой (рис.2):
Рис.2. Заполнение с затравкой
При реализации данного алгоритма следует помнить, что цвет формы не должен быть близок к цвету границ или закрашивающему цвету, иначе заполнение выйдет неверным из-за ошибки с определением граничных точек.
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
StackPix = record
x: integer;
y: integer;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
arrStack: array of StackPix;
implementation
uses Math;
{$R *.dfm}
procedure pushStack(pxl: StackPix);
begin
SetLength(arrStack, Length(arrStack)+1);
arrStack[High(arrStack)]:=pxl;
end;
function popStack():StackPix;
begin
if High(arrStack)>=0 then
begin
popStack:=arrStack[High(arrStack)];
SetLength(arrStack, High(arrStack));
end
end;
procedure www(npxl:StackPix; Xmax:integer);
var
fl: boolean;
pc: TColor;
i: integer;
begin
while npxl.x <= Xmax do
begin
fl:=false;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
while ((pc <> clBlack) and (pc <> clred) and (npxl.x < Xmax)) do
begin
if fl=false then fl:=true;
npxl.x:=npxl.x+1;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
end;
if fl=true then
begin
if (npxl.x=Xmax) and (pc <> clBlack) and (pc <> clGreen) then
pushStack(npxl)
else
begin
npxl.x:=npxl.x-1;
pushStack(npxl);
end;
end;
i:=npxl.x;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
while (((pc=clBlack) or (pc=clGreen)) and (npxl.x<Xmax)) do
begin
npxl.x:=npxl.x+1;
pc:=Form1.canvas.Pixels[npxl.x,npxl.y];
end;
if npxl.x=i then npxl.x:=npxl.x+1;
end;
end;
procedure nearby(pxl: StackPix);
var
pc: TColor;
begin
pc:=Form1.canvas.Pixels[pxl.x,pxl.y];
if (pc <> clBlack) and (pc <> clRed) then pushStack(pxl);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.Pen.Color:=clBlack;
canvas.MoveTo(100,115);
canvas.LineTo(180,115);
canvas.LineTo(280,115);
canvas.LineTo(280,270);
canvas.LineTo(230,270);
canvas.LineTo(70,270);
canvas.LineTo(20,270);
canvas.LineTo(20,115);
canvas.LineTo(200,115);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pxl: StackPix;
npxl: StackPix;
i:integer;
color: TColor;
begin
Button1.Enabled:=false;
pxl.x:=270;
pxl.y:=118;
pushStack(pxl);
while High(arrStack)>-1 do
begin
case i of
0: color:=clblue;
1: color:=clred;
2: color:=clyellow;
3: color:=clgreen;
4: color:=clwhite;
5: color:=clblack;
end;
pxl:=popStack;
i:=RandomRange(0,5);
canvas.Pixels[pxl.x,pxl.y]:=color;
npxl.x:=pxl.x-1;
npxl.y:=pxl.y;
nearby(npxl);
npxl.x:=pxl.x+1;
npxl.y:=pxl.y;
nearby(npxl);
npxl.x:=pxl.x;
npxl.y:=pxl.y-1;
nearby(npxl);
npxl.x:=pxl.x;
npxl.y:=pxl.y+1;
nearby(npxl);
end;
Button1.Enabled:=true;
end;
end.