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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

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

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ технический УНИВЕРСИТЕТ

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

ЗАДАНИЕ № 4

Педагог: Курочкин М.А.

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

Группа 4086

2001г.

Постановка задачки:

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

Модель

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

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

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

внутренне определенные, нарисованные одним определенным кодом пикселя. При заливке этот код заменяется на новейший код закраски.

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

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

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

Употребляет пространственную когерентность:

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

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

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

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

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

Координата очередной затравки извлекается из стека и производится очень вероятное закрашивание на Право и на лево по строке с затравкой, т.е. пока не попадется граничный пиксель. Пусть это Хлев и Хправ, соответственно.

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

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

Реализация

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

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

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

//—————————————————————————

#include <vcl.h>

#pragma hdrstop

#include «windows.h»

#include «Unit1.h»

//—————————————————————————

#pragma package(smart_init)

#pragma resource «*.dfm»

TForm1 *Form1;

int x0=0,y0=0,start=0,xtmp,ytmp,xmet=-4,ymet=-2,metka=0; // переменные для построения графика

int tx,ty,xm,xr,xl,j,c,meta; //Переменные самого метода

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

struct pointt {

unsigned int x;

unsigned int y;

};

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;

if (tx>420) break;

if (ty>420) break;

}

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

tx=xm;

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;

if (tx>420) break;

if (ty>420) break;

}

tx=tx+1;

if(Form1->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)

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

pont[raz]->x=tx;

pont[raz]->y=ty;

tx=tx+1;

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

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

{tx=tx+1;}

}

}

Zaliv()

{

raz=1;

pont[raz]->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))

{

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

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

if(metka==1) Canvas->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)

{

Canvas->Pen->Color = bcolor;

Canvas->LineTo(x0,y0);

metka=0;

start=0;

}

}

//—————————————————————————

//—————————————————————————

void __fastcall TForm1::movexy(TObject *Sender, TShiftState Shift, int X,

int Y)

{

Label2->Caption=X;

Label4->Caption=Y;

// xtmp=X;ytmp=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;

}

//—————————————————————————

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

TShiftState Shift, int X, int Y)

{

start=0;

PaintBox1->Visible=false;

PaintBox1->Visible=true;

start=0;

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

}

//—————————————————————————

Вывод

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

Применяемые источники инфы:

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

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

Internet

]]>