當前位置:首頁 » 操作系統 » 種子填充演算法代碼

種子填充演算法代碼

發布時間: 2022-04-23 09:49:14

1. java實現畫圖工具顏色填充怎麼實現或判斷

可以用掃描線種子演算法

掃描線種子填充演算法的基本過程如下:當給定種子點(x, y)時,首先分別向左和向右兩個方向填充種子點所在掃描線上的位於給定區域的一個區段,同時記下這個區段的范圍[xLeft, xRight],然後確定與這一區段相連通的上、下兩條掃描線上位於給定區域內的區段,並依次保存下來。反復這個過程,直到填充結束。
掃描線種子填充演算法可由下列四個步驟實現:

(1) 初始化一個空的棧用於存放種子點,將種子點(x, y)入棧;

(2) 判斷棧是否為空,如果棧為空則結束演算法,否則取出棧頂元素作為當前掃描線的種子點(x, y),y是當前的掃描線;

(3) 從種子點(x, y)出發,沿當前掃描線向左、右兩個方向填充,直到邊界。分別標記區段的左、右端點坐標為xLeft和xRight;

(4) 分別檢查與當前掃描線相鄰的y - 1和y + 1兩條掃描線在區間[xLeft, xRight]中的像素,從xLeft開始向xRight方向搜索,若存在非邊界且未填充的像素點,則找出這些相鄰的像素點中最右邊的一個,並將其作為種子點壓入棧中,然後返回第(2)步;

2. 求一個C語言實現的種子填充多邊形演算法程序

/*如果是用線填充,程序如下。如果是用點填充需要用到堆棧和系統底層庫函數或者用畫點函數putpixel()。 下面實例是用掃描線填充長方形,開始要輸入長方形的左上頂點坐標和右下頂點坐標以及填充掃描線的間距(>=1),如果間距等於1,就是完全填充(實填充)。 一個完整的c程序如下,程序在win-tc和tc2.0下都調試通過。 */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<graphics.h> void draw(int x1,int y1,int x2,int y2,int delta) {int nx1,ny1,nx2,ny2; nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2; while((ny1>=y1)&&(nx2<=x2)) {line(nx1,ny1,nx2,ny2); ny1-=delta; nx2+=delta; } if(nx2>x2) {ny2-=nx2-x2; nx2=x2; while(ny1>y1) {line(nx1,ny1,nx2,ny2); ny1-=delta; ny2-=delta; } nx1+=y1-ny1; ny1=y1; while(nx1<x2) {line(nx1,ny1,nx2,ny2); nx1+=delta; ny2-=delta; } } else {nx1+=y1-ny1; ny1=y1; while(nx2<x2) {line(nx1,ny1,nx2,ny2); nx2+=delta; nx1+=delta; } ny2-=nx2-x2; nx2=x2; while(ny2>y1) {line(nx1,ny1,nx2,ny2); ny2-=delta; nx1+=delta; } } } int main(void) {int x1,y1,y2,x2,delta; int driver=DETECT,mode; printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n"); scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta); initgraph (&driver,&mode,"C:\\TC"); /*這里*/ rectangle(x1,y1,x2,y2); draw(x1,y1,x2,y2,delta); gotoxy(1,1); printf("Press any key to exit!"); getch(); closegraph(); return 0; } /*說明:將main()函數中的initgraph(&gdriver,&gmode,"");中的""更改為你的TC安裝目錄,一般tc必須安裝在c盤根目錄下,所以就是initgraph(&gdriver,&gmode,"C:\\TC");如你的TC安裝目錄為D盤的Tools目錄下的TC目錄,那麼上述語句改為: initgraph(&gdriver,&gmode,"D:\\Tools\\TC"); 同時保證在D:\\Tools\\TC目錄里有文件EGAVGA.BGI,萬一不行,將本程序復制到你的TC安裝目錄下再運行。 */

3. VC++ 6.0編寫計算機圖形學中的種子填充演算法,想用遞歸的八向連通域,求助!

用八鄰域的話,有重復的,這個你要考慮到,一般都用四鄰域的,八鄰域你可以設置一個標志數組,對於已經處理的點就不管了

4. 填充演算法的種子填充演算法

種子填充演算法又稱為邊界填充演算法。其基本思想是:從多邊形區域的一個內點開始,由內向外用給定的顏色畫點直到邊界為止。如果邊界是以一種顏色指定的,則種子填充演算法可逐個像素地處理直到遇到邊界顏色為止。
種子填充演算法常用四連通域和八連通域技術進行填充操作。
從區域內任意一點出發,通過上、下、左、右四個方向到達區域內的任意像素。用這種方法填充的區域就稱為四連通域;這種填充方法稱為四向連通演算法。
從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下八個方向到達區域內的任意像素。用這種方法填充的區域就稱為八連通域;這種填充方法稱為八向連通演算法。
一般來說,八向連通演算法可以填充四向連通區域,而四向連通演算法有時不能填充八向連通區域。例如,八向連通填充演算法能夠正確填充如圖2.4a所示的區域的內部,而四向連通填充演算法只能完成如圖2.4b的部分填充。
圖2.4 四向連通填充演算法
a) 連通域及其內點 b) 填充四連通域
四向連通填充演算法:
a) 種子像素壓入棧中;
b) 如果棧為空,則轉e);否則轉c);
c) 彈出一個像素,並將該像素置成填充色;並判斷該像素相鄰的四連通像素是否為邊界色或已經置成多邊形的填充色,若不是,則將該像素壓入棧;
d) 轉b);
e) 結束。
四向連通填充方法可以用遞歸函數實現如下:
演算法2.3 四向連通遞歸填充演算法:
void BoundaryFill4(int x, int y, long FilledColor, long BoundaryColor)
{
long CurrentColor;
CurrentColor = GetPixelColor(x,y);
if (CurrentColor != BoundaryColor && CurrentColor != FilledColor)
{
SetColor(FilledColor);
SetPixel (x,y);
BoundaryFill4(x+1, y, FilledColor, BoundaryColor);
BoundaryFill4(x-1, y, FilledColor, BoundaryColor);
BoundaryFill4(x, y+1, FilledColor, BoundaryColor);
BoundaryFill4(x, y-1, FilledColor, BoundaryColor);
}
}
上述演算法的優點是非常簡單,缺點是需要大量棧空間來存儲相鄰的點。一個改進的方法就是:通過沿掃描線填充水平像素段,來處理四連通或八連通相鄰點,這樣就僅僅只需要將每個水平像素段的起始位置壓入棧,而不需要將當前位置周圍尚未處理的相鄰像素都壓入棧,從而可以節省大量的棧空間。

5. 簡述邊界表示的四連通區域的種子填充演算法的基本思想和執行步驟

一、種子填充演算法思想:
首先填充種子所在的尚未填充的一區段,然後確定與這一區段相鄰的上下兩條掃描線上位於該區段內是否存在需要填充的新區段,如果存在,則依次把每個新區段最右端的象素作為種子放入堆棧。反復這個過程,直到堆棧為空。
二、種子填充演算法步驟:
1、初始化堆棧。
2、種子壓入堆棧。
3、While(堆棧非空)從堆棧彈出種子象素。

6. 在線等答案,忘諸位大蝦幫幫忙,問題是關於用種子填充演算法填充多邊形的

  1. 雙擊滑鼠左鍵,生成多邊形

  2. .先在多邊形內部單擊滑鼠右鍵,選擇種子,然後單擊功能菜單實現填充

    不是應該按上面的步驟來嘛,但是第二步,要先在多邊形內部單擊一下左鍵,然後再單擊右鍵,這樣再試試看

7. 我想用易語言填充畫板的指定區域 並計算填充了多少像素 怎麼計算

函數原型:BOOL ExtFloodFill(HDC hdc,int nXStart,int nYStart,COLORREF crColor,UINT fuFillType);
參數:
nXSTart:指定要開始填充處的邏輯X軸坐標。
nYStart:指定要開始填充處的邏輯Y軸坐標。
crColor:指定要填充的邊界或區域的顏色。crColor的具體解釋要根據參數fuFillType的值而定。
fuFillType:指定要進行的填充操作類型。該參數必須是下列值之一,這些值的含義如下:
FLOODFILLBORDER:表示填充區域是由crColor參數指定的顏色包圍起來的部分。這種形式與FloodFill函數執行的填充類型一樣。
FLOODFILLSURFACE:表示填充區域是由crColor指定的顏色來定義。填充操作向四周伸展,直到遇到這種顏色為止。這種操作式樣對於帶有多種顏色邊界的填充區域有用。
返回值:如果函數執行成功,那麼返回值為非零;如果函數執行失敗,那麼返回值為零。若想獲得更多錯誤信息,請調用GetLastError函數。
備註:下列原因可能引起函數執行失敗:
填充無法完成。
指定的像素點有著參數crColor(如果要求
操作樣式)指定的邊界顏色(即顏色相同)。
指定的像素點沒有參數crColor(如果要求FLOODFILLSURFACE操作樣式)指定的顏色。
該點在剪輯區之外――也就是說在設備中不可見。
如果fuFillType參數為FLOODFILLBORDER,那麼系統認為要填充的區域是完全被參數crColor指定的顏色包圍起來的。該函數從參數nXStart和nYStart指定的點開始填充,向四周繼續,直到遇到邊界為止。
如果fuFillType是FLOODRILLSURFACE,那麼系統就認為要填充的區域是單顏色的,函數從nXStart和nYStart兩個參數指定的點開始填充區域,並向四周延伸,對包含參數crColor指定顏色的所有相鄰區域進行填充。
只有支持光柵顯示操作的設備和內存設備環境才支持ExtFloodFill函數。為了確定設備是否支持該技術,可使用函數GetDeviceCaps。
http://ke..com/link?url=5RPNfKX08273wPGa
以上內容復制自網路
常量值
FLOODFILLBORDER =0
FLOODRILLSURFACE =1

種子填充演算法
編輯
種子填充演算法又稱為邊界填充演算法。其基本思想是:從多邊形區域的一個內點開始,由內向外用給定的顏色畫點直到邊界為止。如果邊界是以一種顏色指定的,則種子填充演算法可逐個像素地處理直到遇到邊界顏色為止。
種子填充演算法常用四連通域和八連通域技術進行填充操作。
從區域內任意一點出發,通過上、下、左、右四個方向到達區域內的任意像素。用這種方法填充的區域就稱為四連通域;這種填充方法稱為四向連通演算法。
從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下八個方向到達區域內的任意像素。用這種方法填充的區域就稱為八連通域;這種填充方法稱為八向連通演算法。
一般來說,八向連通演算法可以填充四向連通區域,而四向連通演算法有時不能填充八向連通區域。例如,八向連通填充演算法能夠正確填充如圖2.4a所示的區域的內部,而四向連通填充演算法只能完成如圖2.4b的部分填充。
圖2.4 四向連通填充演算法
a) 連通域及其內點 b) 填充四連通域
四向連通填充演算法:
a) 種子像素壓入棧中;
b) 如果棧為空,則轉e);否則轉c);
c) 彈出一個像素,並將該像素置成填充色;並判斷該像素相鄰的四連通像素是否為邊界色或已經置成多邊形的填充色,若不是,則將該像素壓入棧;
d) 轉b);
e) 結束。
http://ke..com/link?url=jAM4UlhNMYk8__THzHZ2vN__KtQHm7CErVWq

要善用搜索

8. 用隊列實現種子填充演算法的非遞歸

一、種子填充演算法(Seed Filling)
如果要填充的區域是以圖像元數據方式給出的,通常使用種子填充演算法(Seed Filling)進行區域填充。種子填充演算法需要給出圖像數據的區域,以及區域內的一個點,這種演算法比較適合人機交互方式進行的圖像填充操作,不適合計算機自動處理和判斷填色。根據對圖像區域邊界定義方式以及對點的顏色修改方式,種子填充又可細分為幾類,比如注入填充演算法(Flood Fill Algorithm)、邊界填充演算法(Boundary Fill Algorithm)以及為減少遞歸和壓棧次數而改進的掃描線種子填充演算法等等。
所有種子填充演算法的核心其實就是一個遞歸演算法,都是從指定的種子點開始,向各個方向上搜索,逐個像素進行處理,直到遇到邊界,各種種子填充演算法只是在處理顏色和邊界的方式上有所不同。在開始介紹種子填充演算法之前,首先也介紹兩個概念,就是「4-聯通演算法」和「8-聯通演算法」。既然是搜索就涉及到搜索的方向問題,從區域內任意一點出發,如果只是通過上、下、左、右四個方向搜索到達區域內的任意像素,則用這種方法填充的區域就稱為四連通域,這種填充方法就稱為「4-聯通演算法」。如果從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下全部八個方向到達區域內的任意像素,則這種方法填充的區域就稱為八連通域,這種填充方法就稱為「8-聯通演算法」。如圖1(a)所示,假設中心的藍色點是當前處理的點,如果是「4-聯通演算法」,則只搜索處理周圍藍色標識的四個點,如果是「8-聯通演算法」則除了處理上、下、左、右四個藍色標識的點,還搜索處理四個紅色標識的點。兩種搜索演算法的填充效果分別如如圖1(b)和圖1(c)所示,假如都是從黃色點開始填充,則「4-聯通演算法」如圖1(b)所示只搜索填充左下角的區域,而「8-聯通演算法」則如圖1(c)所示,將左下角和右上角的區域都填充了。

圖(1) 「4-聯通」和「8-聯通」填充效果

並不能僅僅因為圖1的填充效果就認為「8-聯通演算法」一定比「4-聯通演算法」好,應該根據應用環境和實際的需求選擇聯通搜索方式,在很多情況下,只有「4-聯通演算法」才能得到正確的結果。
1.1 注入填充演算法(Flood Fill Algorithm)
注入填充演算法不特別強調區域的邊界,它只是從指定位置開始,將所有聯通區域內某種指定顏色的點都替換成另一種顏色,從而實現填充效果。注入填充演算法能夠實現顏色替換之類的功能,這在圖像處理軟體中都得到了廣泛的應用。注入填充演算法的實現非常簡單,核心就是遞歸和搜索,以下就是注入填充演算法的一個實現:

164 void FloodSeedFill(int x, int y, int old_color, int new_color)
165 {
166 if(GetPixelColor(x, y) == old_color)
167 {
168 SetPixelColor(x, y, new_color);
169 for(int i = 0; i < COUNT_OF(direction_8); i++)
170 {
171 FloodSeedFill(x + direction_8[i].x_offset,
172 y + direction_8[i].y_offset, old_color, new_color);
173 }
174 }
175 }

for循環實現了向8個聯通方向的遞歸搜索,秘密就在direction_8的定義:

15 typedef struct tagDIRECTION
16 {
17 int x_offset;
18 int y_offset;
19 }DIRECTION;

79 DIRECTION direction_8[] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1},{0, -1}, {-1, -1} };

這個是搜索類演算法中常用的技巧,無需做太多說明,其實只要將其替換成如下direction_4的定義,就可以將演算法改成4個聯通方向填充演算法:

80 DIRECTION direction_4[] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };

圖2就是應用本演算法實現的「4-聯通」和「8-聯通」填充效果:

9. 計算機圖形學的實驗,vb編程,一下午沒搞定,關於區域填充,求大神搭救

已經修改完成,請採納:
Option Base 1
Dim a(10) As Integer
Private Sub command1_click()
Dim n As Integer
List1.Clear
Randomize
Do
t = Int(90 * Rnd) + 10
For i = 1 To n
If t = a(i) Then Exit For
Next i
If i = n + 1 Then
n = n + 1
a(n) = t
List1.AddItem t
End If
Loop Until n >= 10
List1.AddItem "n=" & n
End Sub
Private Sub command2_click()
Dim b(10) As Integer
List2.Clear
For i = 1 To 10
b(i) = 1
Next i
For i = 1 To 10
For j = 1 To 10
If a(j) > a(i) Then
b(i) = b(i) + 1
End If
Next j
Next i

For i = 1 To 10
List2.AddItem b(i)
Next i
End Sub

10. 百度百科裡面一個 種子填充演算法解釋

首先,floodfill不一定要用到堆棧.floodfill本質上是一種遍歷,利用基本的兩種遍歷方式:廣度優先遍歷和深度優先遍歷都可行.其中廣度優先遍歷使用隊列,深度優先遍歷使用棧.
一般來說,floodfill使用廣度優先遍歷可能更好實現.至少對我來說更好寫.

這個代碼用的是深度優先遍歷,自然用到棧,其實對棧的理解不能只停留在用戶定義的棧,而應該知道系統的遞歸也是使用棧實現的.
這段代碼正是使用了遞歸來實現了棧,說白了相當於棧的代碼編譯器幫你寫了.如果不想用遞歸,可以編寫人工棧,我覺得沒有隊列好寫.

熱點內容
win10怎麼清理緩存 發布:2024-10-02 14:09:35 瀏覽:234
linux命令和shell 發布:2024-10-02 14:06:07 瀏覽:900
區域網ip和伺服器有什麼區別 發布:2024-10-02 13:36:07 瀏覽:241
安卓手機怎麼當中繼器 發布:2024-10-02 13:31:24 瀏覽:4
神經貓演算法 發布:2024-10-02 13:21:56 瀏覽:798
懷舊服最高效果需要什麼配置 發布:2024-10-02 13:10:03 瀏覽:839
varcharsql 發布:2024-10-02 13:00:12 瀏覽:948
我的世界全世界最老伺服器 發布:2024-10-02 13:00:12 瀏覽:210
安卓95是什麼意思 發布:2024-10-02 12:42:00 瀏覽:231
mac訪問windows共享 發布:2024-10-01 23:31:58 瀏覽:644