43 lines
3.0 KiB
Markdown
43 lines
3.0 KiB
Markdown
|
---
|
|||
|
title: Boundary Fill
|
|||
|
localeTitle: Граничная заливка
|
|||
|
---
|
|||
|
## Граничная заливка
|
|||
|
|
|||
|
Граничная заливка - это алгоритм, часто используемый в компьютерной графике для заполнения нужного цвета внутри замкнутого многоугольника с той же границей цвет для всех его сторон.
|
|||
|
|
|||
|
Наиболее подходящей реализацией алгоритма является рекурсивная функция на основе стека.
|
|||
|
|
|||
|
### За работой:
|
|||
|
|
|||
|
Проблема довольно проста и обычно следует следующим шагам:
|
|||
|
|
|||
|
1. Возьмите позицию начальной и граничной окраски.
|
|||
|
2. Решите, хотите ли вы идти в 4 направлениях (N, S, W, E) или 8 направлений (N, S, W, E, NW, NE, SW, SE).
|
|||
|
3. Выберите цвет заливки.
|
|||
|
4. Путешествуйте в этих направлениях.
|
|||
|
5. Если пиксель, на который вы попали, не является цветом заливки или граничным цветом, замените его цветом заливки.
|
|||
|
6. Повторяйте 4 и 5, пока не повсюду в пределах границ.
|
|||
|
|
|||
|
### Определенные ограничения:
|
|||
|
|
|||
|
* Граничный цвет должен быть одинаковым для всех краев многоугольника.
|
|||
|
* Отправная точка должна быть в пределах многоугольника.
|
|||
|
|
|||
|
### Фрагмент кода:
|
|||
|
```
|
|||
|
void boundary_fill(int pos_x, int pos_y, int boundary_color, int fill_color)
|
|||
|
{
|
|||
|
current_color= getpixel(pos_x,pos_y); //get the color of the current pixel position
|
|||
|
if( current_color!= boundary_color || currrent_color != fill_color) // if pixel not already filled or part of the boundary then
|
|||
|
{
|
|||
|
putpixel(pos_x,pos_y,fill_color); //change the color for this pixel to the desired fill_color
|
|||
|
boundary_fill(pos_x + 1, pos_y,boundary_color,fill_color); // perform same function for the east pixel
|
|||
|
boundary_fill(pos_x - 1, pos_y,boundary_color,fill_color); // perform same function for the west pixel
|
|||
|
boundary_fill(pos_x, pos_y + 1,boundary_color,fill_color); // perform same function for the north pixel
|
|||
|
boundary_fill(pos_x, pos_y - 1,boundary_color,fill_color); // perform same function for the south pixel
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Из данного кода вы можете видеть, что для любого пикселя, на который вы приземляетесь, вы сначала проверяете, можно ли его изменить на fill\_color, а затем вы это сделаете для его соседей, пока не будут проверены все пиксели в пределах границы.
|