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, а затем вы это сделаете для его соседей, пока не будут проверены все пиксели в пределах границы. |