二維區域掃瞄線填充演算法的實現

2021-04-08 16:10:23 字數 2888 閱讀 8220

下面是乙個簡單的填充效果:

#include

#include

#define filling    1

#define reset      2

typedef struct        

line,*pline;

line lines[100];

line line;

static int  j=0;

point draw_refresh[1000];

static int  l=0;

while(getmessage(&msg,null,0,0))    

return msg.wparam;        

} lresult callback wndproc(hwnd hwnd,uint message,wparam wparam,lparam lparam)

;point draw[100];

int b=0;

static int filled=0;

for(int e=0;e<100;e++)

int k=0;

int **allest_y=0;

int lardgest_y=0;

int m=0;

int n=0;

int h=0;

int x=0;

int x1=0;

int x2=0;

int y1=0;

int y2=0;

int a=0;

int c=0;

int flag=0;

switch(message)         

return 0;

case wm_lbuttonup:

line.xend=loword(lparam);

line.yend=hiword(lparam);

for(i=0;j>=1 && i<=j-1;i++)

else if((line.xend>lines[i].xend-30) && (line.xendlines[i].yend-30) && (line.yendselectobject(hdc,getstockobject(white_pen));//clear the last black line if find a adjacent vetex

movetoex(hdc,line.xstart,line.ystart,null);

lineto(hdc,line.xend,line.yend);

line.xend=lines[i].xend;

line.yend=lines[i].yend;

selectobject(hdc,getstockobject(black_pen));

movetoex(hdc,line.xstart,line.ystart,null);

lineto(hdc,line.xend,line.yend);

releasedc(hwnd,hdc);}}

lines[j].xstart=line.xstart;

lines[j].ystart=line.ystart;

lines[j].xend=line.xend;

lines[j].yend=line.yend;

j++;

line.xstart=0;

line.ystart=0;

line.xend=0;

line.yend=0;

//  releasecapture();

return 0;

case wm_command:

switch(loword(wparam))

filled=1;

for(h=0;hlardgest_y)

if(lines[h].yend>lardgest_y)

}for(k=**allest_y;k<=lardgest_y;k++)

else if(klines[m].ystart && lines[n].yend>lines[m].ystart) || (lines[m].yendflag=0;

for(h=0;h}

else if((n!=m) && (lines[m].ystart==lines[n].yend))}}

}else if(lines[m].yend==k)

else if(m!=n && k==lines[n].yend)}}

}else

else if(lines[m].ystartdraw[m].x)}}

hdc=getdc(hwnd);              //real filling

for(h=0;hfor(h=0;hb=0;

}break;

case reset:

filled=0;

j=0;

head=lines;

for(int i=0;i<100;i++)

for(h=0;hinvalidaterect(hwnd,null,false);

break;

}return 0;

case wm_paint:

hdc=beginpaint(hwnd,&ps);

for(head=lines;head->xstart!=0 && head->ystart!=0 && head->xend!=0 && head->yend!=0;head++)

head=lines;

if(filled==1)

return defwindowproc(hwnd,message,wparam,lparam);

}///end/

如果你真要執行下的話,請務必在粘進vc的時候把行隔開,因為我暫時還不知道怎麼能以好的格式把**貼進csdn的blog中。我自己做的測試中尚未發現錯誤,如果你發現了,麻煩好心和你告訴我,謝謝你

寒江雪 區域填充演算法 掃瞄線

區域填充遞迴演算法已經領教過了。記憶體消耗大,時間效率低,經典的深搜思想。為了解決這個問題,於是有人提出了種子填充掃瞄線演算法。其實就是深搜不行,換寬搜 bfs 該演算法假設已知其中乙個畫素點,然後從這個畫素點出發,去尋找周圍可以著色的點。這個已知點,我們稱其為種子點。每一輪著色之後,記錄下著色的區...

區域填充之掃瞄線演算法

區域的填充可以根據區域的填充,採用不同的填充演算法,而其中有掃瞄線類演算法和種子填充演算法。這裡,先介紹掃瞄線類演算法之有序邊表的掃瞄線演算法。其他什麼種子填充 邊界標誌演算法 4連通區域的遞迴演算法 8連通區域的遞迴演算法 掃瞄線種子填充演算法比較簡單。其實有序邊表其實領會了也好理解,關鍵是將思想...

多邊形區域填充演算法 掃瞄線種子填充演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1.3掃瞄線種子填充演算法 1.1和1.2節介紹的兩種種子填充演算法的優點是非常簡單,缺點是使用了遞迴演算法,這不但需要大量棧空間來儲存相鄰的點,而且效率不高。為了減少演算法中的遞迴呼叫,節省棧空間的使用,人們提出了很多改進演算法,其中一種就是掃瞄...