Меню
  Список тем
  Поиск
Полезная информация
  Краткие содержания
  Словари и энциклопедии
  Классическая литература
Заказ книг и дисков по обучению
  Учебники, словари (labirint.ru)
  Учебная литература (Читай-город.ru)
  Учебная литература (book24.ru)
  Учебная литература (Буквоед.ru)
  Технические и естественные науки (labirint.ru)
  Технические и естественные науки (Читай-город.ru)
  Общественные и гуманитарные науки (labirint.ru)
  Общественные и гуманитарные науки (Читай-город.ru)
  Медицина (labirint.ru)
  Медицина (Читай-город.ru)
  Иностранные языки (labirint.ru)
  Иностранные языки (Читай-город.ru)
  Иностранные языки (Буквоед.ru)
  Искусство. Культура (labirint.ru)
  Искусство. Культура (Читай-город.ru)
  Экономика. Бизнес. Право (labirint.ru)
  Экономика. Бизнес. Право (Читай-город.ru)
  Экономика. Бизнес. Право (book24.ru)
  Экономика. Бизнес. Право (Буквоед.ru)
  Эзотерика и религия (labirint.ru)
  Эзотерика и религия (Читай-город.ru)
  Наука, увлечения, домоводство (book24.ru)
  Наука, увлечения, домоводство (Буквоед.ru)
  Для дома, увлечения (labirint.ru)
  Для дома, увлечения (Читай-город.ru)
  Для детей (labirint.ru)
  Для детей (Читай-город.ru)
  Для детей (book24.ru)
  Компакт-диски (labirint.ru)
  Художественная литература (labirint.ru)
  Художественная литература (Читай-город.ru)
  Художественная литература (Book24.ru)
  Художественная литература (Буквоед)
Реклама
Разное
  Отправить сообщение администрации сайта
  Соглашение на обработку персональных данных
Другие наши сайты
Приглашаем посетить
  Программирование (prog.find-info.ru)

   

Закраска гранично-заданной области с затравкой, Машинная графика, C Builder 4.0

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

“Диалоговые системы и машинная графика”

ЗАДАНИЕ № 4

Преподаватель: Курочкин М. А.

Студент: Дмитроченко А. А.

2001г.

Необходимо реализовать алгоритм заливки гранично-заданной области с затравкой.

Модель

Задается заливаемая (перекрашиваемая) область, код пиксела, которым будет выполняться заливка и начальная точка в области, начиная с которой начнется заливка.

По способу задания области делятся на два типа:

два условия - они должны быть отличны от кода пикселов границы и кода пикселя перекраски. Если внутри гранично-определенной области имеется еще одна граница, нарисованная пикселями с тем же кодом, что и внешняя граница, то соответствующая часть области не должна перекрашиваться;

В этом состоит основное отличие заливки области с затравкой, от заполнения многоугольника. В последнем случае мы сразу имеем всю информацию о предельных размерах части экрана, занятой многоугольником. Поэтому определение принадлежности пикселя многоугольнику базируется на быстро работающих алгоритмах, использующих когерентность строк и ребер. В алгоритмах же заливки области с затравкой нам вначале надо прочитать пиксель, затем определить принадлежит ли он области и если принадлежит, то перекрасить.

Заливаемая область или ее граница - некоторое связное множество пикселей. По способам доступа к соседним пикселям области делятся на 4-х и 8-ми связные. В 4-х связных областях доступ к соседним пикселям осуществляется по четырем направлениям - горизонтально влево и вправо и в вертикально вверх и вниз. В 8-ми связных областях к этим направлениям добавляются еще 4 диагональных. Используя связность, мы можем, двигаясь от точки затравки достичь и закрасить все пиксели области.

Важно отметить, что для 4-х связной прямоугольной области граница 8-ми связна и, наоборот, у 8-ми связной области граница 4-х связна. Поэтому заполнение 4-х связной области 8-ми связным алгоритмом может привести к "просачиванию" через границу и заливке пикселей в примыкающей области.

Использует пространственную когерентность:

пиксели в строке меняются только на границах;

при перемещении к следующей строке размер заливаемой строки скорее всего или неизменен или меняется на 1 пиксель.

Таким образом, на каждый закрашиваемый фрагмент строки в стеке хранятся координаты только одного начального пикселя, что приводит к существенному уменьшению размера стека.

Последовательность работы алгоритма для гранично-определенной области следующая:

Координата затравки помещается в стек, затем до исчерпания стека выполняются пункты 2-4.

соответственно.

Анализируется строка ниже закрашиваемой в пределах от Хлев до Хправ и в ней находятся крайние правые пиксели всех, не закрашенных фрагментов. Их координаты заносятся в стек.

То же самое проделывается для строки выше закрашиваемой.

Реализация

Данный алгоритм был реализован в Borland C++ Builder 4.

При запуске программы пользователю предлагается задать гранично-заданную область. Алгоритм правильно заполняет любую область, включая достаточно сложные области, в которых присутствуют отверстия. Далее необходимо указать начальную точку заливки.

В результате работы будет получена закрашенная область.

//---------------------------------------------------------------------------

<vcl. h>

#pragma hdrstop

#include "windows. h"

#include "Unit1. h"

//---------------------------------------------------------------------------

#pragma resource "*. dfm"

TColor kraska=clRed,bcolor=clBlue,nomy,my;

struct pointt {

unsigned int x;

};

static pointt pont[500][500]; //Матрица реализаций

int raz;

cel()

{

Form1->PaintBox1->Canvas->Pen->Color = bcolor;

Form1->PaintBox1->Canvas->Brush->Color=RGB(255,255,255);

Form1->PaintBox1->Canvas->Rectangle(10,10,210,110);

}

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

kraska=RGB(255,0,0);bcolor=RGB(0,0,255);

cel();

Edit1->Text="<-- Нарисуйте гранично-заданную область -->";

}

//---------------------------------------------------------------------------

Zakras()

{

xm=tx;

while(Form1->PaintBox1->Canvas->Pixels[tx][ty]!=bcolor)

{

Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;

tx=tx+1;

if (tx<=0) break;

if (ty<=0) break;

>420) break;

if (ty>420) break;

}

if(Form1->PaintBox1->Canvas->Pixels[tx][ty]==bcolor) xr=tx-1;

tx=xm;

>PaintBox1->Canvas->Pixels[tx][ty]!=bcolor)

{

Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;

tx=tx-1;

if (tx<=0) break;

<=0) break;

>420) break;

>420) break;

}

tx=tx+1;

>PaintBox1->Canvas->Pixels[tx-1][ty]==bcolor) xl=tx;

}

Stack()

{

tx=xl;

ty=ty+j;

while(tx<=xr)

{

c=0;

while((Form1->PaintBox1->Canvas->Pixels[tx][ty]!=bcolor)&&

(Form1->PaintBox1->Canvas->Pixels[tx][ty]!=kraska)&&(tx<xr))

{tx++;c=1;}

if(c==1){

raz=raz+1;

while((Form1->PaintBox1->Canvas->Pixels[tx][ty]==bcolor)

(Form1->PaintBox1->Canvas->Pixels[tx][ty]==kraska)) tx--;

>x=tx;

pont[raz]->y=ty;

}

tx=tx+1;

while(((Form1->PaintBox1->Canvas->Pixels[tx][ty]==bcolor)

>PaintBox1->Canvas->Pixels[tx][ty]==kraska))&&(tx<xr)&&(tx>xl))

{tx=tx+1;}

}

}

Zaliv()

{

raz=1;

>x=x0;

pont[raz]->y=y0;

while(raz>0)

{

tx=pont[raz]->x;

ty=pont[raz]->y;

raz=raz-1;

Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;

Zakras();

j=1;

Stack();

j=-2;

Stack();

}

Form1->Edit1->Text="Все закончилось";

}

void __fastcall TForm1::drawing(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

if(start==5) {x0=X;y0=Y;Canvas->Pixels[X][Y]=kraska;

Zaliv();

}

if((Button==mbLeft)&&(start!=5))

{

>Pen->Color = bcolor; // выбрать цвет контура

// Brush->Color = clYellow; // выбрать цвет заливки

>LineTo(X,Y);

metka=1;

xtmp=X;

ytmp=Y;

Canvas->MoveTo(X,Y);

if(start==0) {x0=X,y0=Y;start=1;}

// randomize();

//Canvas->Brush->Color = (Graphics::TColor) $(00FF0000);

}

if (Button==mbRight)

{

>Pen->Color = bcolor;

Canvas->LineTo(x0,y0);

metka=0;

start=0;

}

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

int Y)

{

Label2->Caption=X;

Label4->Caption=Y;

//Label6->Caption=Canvas->Pixels[x0][y0];

//Zaliv();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::vpered(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

Edit1->Text=" Выберите точку закраски";

start=5;

}

{

PaintBox1->Visible=false;

PaintBox1->Visible=true;

start=0;

Edit1->Text="<-- Нарисуйте гранично-заданную область -->";

}

//---------------------------------------------------------------------------

Вывод

В процессе работы разобрался с методами закраски гранично-заданной области, а также отработаны приемы программирования на С++. Произошло более детальное знакомство с Borland C++ Builder 4.

Используемые источники информации:

Алгоритмические основы машинной графики (Д. Роджерс) «МИР»

Internet