Отчет по лабораторной работе №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.