САНКТ-Петербурзького державного технічного університету p>
ЗВІТ p>
ПО КУРСУ p>
"Діалогові системи та машинна графіка" p>
ЗАВДАННЯ № 4 p>
Викладач: Курочкін М.А. p>
Студент: Дмітроченко А.А. p>
Група 4086 p>
2001р. p>
1. Постановка завдання: p>
Необхідно реалізувати алгоритм заливки гранично-заданої області з затравкою. P>
2. Модель p>
Здається заливається (перефарбовуються) область, код піксела, яким буде виконуватися заливка і початкова точка в області, починаючи з якої почнеться заливка. P>
За способом завдання області поділяються на два типи: p>
- гранично-певні, що задаються своєї (замкнутої) кордоном такий, що коди пікселів кордону відмінні від кодів внутрішньої, перефарбовуй частині області. На коди пікселі внутрішньої частини області накладаються дві умови - вони повинні бути відмінні від коду пікселів кордону та коду пікселя перефарбовування. Якщо всередині гранично-певній галузі є ще одна межа, намальована пікселями з тим самим кодом, що й зовнішній кордон, то відповідна частина області не повинна перефарбовуватися; p>
- внутрішньо певні, намальовані одним певним кодом пікселя. При заливанні цей код замінюється на новий код зафарбовування. P>
У цьому полягає основна відмінність заливки області з затравкою, від заповнення багатокутника. В останньому випадку ми маємо всю інформацію про граничні розміри частини екрану, зайнятої багатокутників. Тому визначення приналежності пікселя багатокутника базується на швидко працюють алгоритми, що використовують когерентність рядків і ребер. В алгоритмах ж заливки області з затравкою нам спочатку треба прочитати піксель, потім визначити чи належить він краю і якщо належить, то перефарбувати. P>
заливається область або її межа - деякий зв'язне безліч пікселів. За способами доступу до сусідніх пікселям області поділяються на 4 - х та 8-ми зв'язківці. В 4-х зв'язкових областях доступ до сусідніх пікселям здійснюється по чотирьох напрямах - горизонтально ліворуч і праворуч і в вертикально вгору і вниз. У 8-ми зв'язкових областях до цих напрямках додаються ще 4 діагональних. Використовуючи зв'язаність, ми можемо, рухаючись від точки затравки досягти і зафарбувати всі пікселі області. P>
Важливо відзначити, що для 4-х зв'язковий прямокутної області кордон 8-ми складно і, навпаки, у 8-ми зв'язковий області кордон 4-х зв'язкових. p>
Тому заповнення 4-х зв'язковий області 8-ми зв'язковим алгоритмом може призвести до "просочування" через кордон і заливанні пікселів в примикає області. p>
порядковий алгоритм заливки з затравкою: p>
Використовує просторову когерентність: p>
- пікселі в рядку змінюються тільки на кордонах; p>
- при переміщенні до наступному рядку розмір заливається рядка швидше за все або незмінний або змінюється на 1 піксель. p>
Таким чином, на кожен закрашується фрагмент рядка в стеку зберігаються координати тільки одного початкового пікселя, що призводить до суттєвого зменшення розміру стека. p>
Послідовність роботи алгоритму для гранично -певної областінаступна: p>
1. Координата затравки поміщається в стек, потім до вичерпання стека виконуються пункти 2-4. P>
2. Координата черговий затравки витягується з стека і виконується максимально можливе зафарбовування вправо і вліво по рядку з затравкою, тобто поки не попадеться граничний піксель. Нехай це хліви і Хправ, відповідно. P>
3. Аналізується рядок нижче закрашується в межах від хліви до Хправ і в ній знаходяться крайні праві пікселі всіх, не зафарбованих фрагментів. Їх координати заносяться в стек. P>
4. Те ж саме проробляється для рядки вище зафарбовувати. P>
3. Реалізація p>
Даний алгоритм був реалізований у Borland C + + Builder 4. P>
При запуску програми користувачеві пропонується задати гранично-задану область. Алгоритм правильно заповнює будь-якої області, включаючи достатньо складні області, в яких присутні отвори. Далі необхідно вказати початкову точку заливки. P>
У результаті роботи буде отримана зафарбовані область. P>
4. Лістинг p>
//---------------------------------------- ----------------------------- p>
------ p>
# include p>
# pragma hdrstop p>
# include "windows.h" p>
# include "Unit1.h" p>
// -- -------------------------------------------------- ----------------- p>
------ p>
# pragma package (smart_init) p>
# pragma resource "*. dfm" p>
TForm1 * Form1; int x0 = 0, y0 = 0, start = 0, xtmp, ytmp, xmet =- 4, ymet =- 2, metka = 0;// змінні для побудови графіка p>
int tx, ty, xm, xr, xl, j, c, meta;// Змінні самого алгоритму p>
TColor kraska = clRed, bcolor = clBlue , nomy, my; struct pointt (unsigned int x; unsigned int y; p>
); p>
static pointt pont [500] [500];// Матриця реалізацій int raz;
cel () p>
( p>
Form1-> PaintBox1-> Canvas-> Pen-> Color = bcolor; p>
Form1-> PaintBox1-> Canvas-> Brush-> Color = RGB (255,255,255); p>
Form1-> PaintBox1-> Canvas-> Rectangle (10,10,210,110); p>
) p >
//-------------------------------------------- ------------------------- p>
------ p>
__fastcall TForm1:: TForm1 (TComponent * Owner) p>
: TForm (Owner) p>
(kraska = RGB (255,0,0); bcolor = RGB (0,0,255); p> < p> cel (); p>
Edit1-> Text =""; p>
) p>
//------------ -------------------------------------------------- ------- p>
------ p>
Zakras () p>
(xm = tx; while (Form1-> PaintBox1-> Canvas-> Pixels [tx] [ty]! = bcolor) p>
( p>
Form1-> PaintBox1-> Canvas-> Pixels [tx] [ty] = kraska; tx = tx 1; if (tx420) break; p>
) p>
if (Form1-> PaintBox1-> Canvas-> Pixels [tx] [ty] == bcolor) xr = tx -1; p>
tx = xm; while (Form1-> PaintBox1-> Canvas- p>
> Pixels [tx] [ty]! = bcolor) p>
( p>
Form1-> PaintBox1-> Canvas-> Pixels [tx] [ty] = kraska; tx = tx-1; if (tx420) break; p>
) p >
tx = tx 1; if (Form1-> PaintBox1-> Canvas-> Pixels [tx-1] [ty] == bcolor) xl = tx; p>
) p>
Stack () p>
( p>
tx = xl; ty = ty + j; while (txPaintBox1-> Canvas- p>
> Pixels [tx] [ty]! = bcolor )&& p>
(Form1-> PaintBox1-> Canvas- p>
> Pixels [tx] [ty]! = kraska) & & (txPaintBox1-> Canvas - p>
> Pixels [tx] [ty] == bcolor )|| p>
(Form1-> PaintBox1-> Canvas- p>
> Pixels [tx] [ ty] == kraska)) tx -; pont [raz] -> x = tx; pont [raz] -> y = ty; p>
) tx = tx 1; while (((Form1 -> PaintBox1-> Canvas- p>
> Pixels [tx] [ty] == bcolor )|| p>
(Form1-> PaintBox1-> Canvas- p>
> Pixels [tx] [ty] == kraska ))&&( txxl)) p>
(tx = tx 1;) p>
) p>
) p>
Zaliv () p>
(raz = 1; pont [raz] -> x = x0; pont [raz] -> y = y0; while (raz> 0) p>
(tx = pont [raz] -> x; ty = pont [raz] -> y; raz = raz-1; p>
Form1-> PaintBox1-> Canvas-> Pixels [ tx] [ty] = kraska; p>
Zakras (); j = 1; p>
Stack (); j =- 2; p>
Stack (); p>
) p>
Form1-> Edit1-> Text = "Все закінчилося"; p>
) p>
void __fastcall TForm1:: drawing ( TObject * Sender, TMouseButton Button, p>
TShiftState Shift, int X, int Y) p>
(if (start == 5) (x0 = X; y0 = Y; Canvas-> Pixels [X] [Y] = kraska; p>
Zaliv (); p>
) p>
if ((Button == mbLeft) & & (start! = 5 )) p>
( p>
Canvas-> Pen-> Color = bcolor;// вибрати колір контуру p>
// Brush-> Color = clYellow;// вибрати колір заливки if (metka == 1) Canvas-> LineTo (X, Y); metka = 1; p>
// намалювати еліпс xtmp = X; ytmp = Y; p>
Canvas-> MoveTo (X, Y); if (start == 0) (x0 = X, y0 = Y; start = 1;) p>
// randomize (); p>
// Canvas-> Brush-> Color = (Graphics:: TColor) $ (00FF0000); p>
) p>
if (Button == mbRight) p>
( p>
Canvas-> Pen-> Color = bcolor; p>
Canvas-> LineTo (x0, y0); metka = 0; start = 0; p>
) p>
) p>
//------------------------------- -------------------------------------- p>
----- - p>
//---------------------------------------- ----------------------------- p>
------ void __fastcall TForm1:: movexy (TObject * Sender, TShiftState Shift, int p>
X, int Y) p>
( p>
Label2-> Caption = X; p>
Label4 - > Caption = Y; p>
// xtmp = X; ytmp = Y; p>
// Label6-> Caption = Canvas-> Pixels [x0] [y0]; p >
// Zaliv (); p>
) p>
//----------------------- ---------------------------------------------- p>
------ void __fastcall TForm1:: vpered (TObject * Sender, TMouseButton Button, p>
TShiftState Shift, int X, int Y) p>
( p >
Edit1-> Text = "Виберіть точку зафарбовування"; start = 5; p>
) p>
//-------------- -------------------------------------------------- ----- p>
------ p>
void __fastcall TForm1:: reset_key (TObject * Sender, TMouseButton p>
Button, p>
TShiftState Shift, int X, int Y) p>
(start = 0; p>
PaintBox1-> Visible = false; p>
PaintBox1-> Visible = true; p>
start = 0; p>
Edit1-> Text =""; p>
) p>
//----- -------------------------------------------------- -------------- p>
------ p>
5. Висновок p>
У процесі роботи розібрався з методами зафарбовування гранично-заданій області,а також відпрацьовані прийоми програмування на С + +. Сталося більшедетальне знайомство з Borland C + + Builder 4. p>
Використані джерела інформації: p>
- Математичні основи машинної графіки (Д. Роджерс, Дж. Адамс) p>
«видавництво СВІТ » p>
- Алгоритмічні основи машинної графіки (Д. Роджерс)« МИР » p>
- Internet p>