凹 凸 分離多邊形的填充繪製

2021-09-10 09:20:20 字數 2113 閱讀 5734

步驟:

1.建立多邊形:按順時針順序逐個提供座標點。

2.繪製。

繪製步驟:

1.計算外接矩形:就是逐個座標點比較,最後得到乙個剛好框住該多邊形的矩形。

2.製作bitmap(位圖或者說柵格圖):根據外接矩形的大小,自行分配記憶體,製作乙個柵格圖。

3.填寫柵格圖–畫線:在柵格圖把各個點座標和連線先畫上(畫直線的方法網上很多),別忘了要把座標偏移一下。

4.填寫柵格圖–遞迴填充:上面的柵格圖在製作時上下左右都多餘1條邊,然後在(0,0)點開始「遞迴填充」。遞迴的函式可以分為5個,呼叫方式如下:

static void _view_infaceu(int x, int y, unsigned char **map, int mapwidth, int mapheight);

static void _view_infaced(int x, int y, unsigned char **map, int mapwidth, int mapheight);

static void _view_infacel(int x, int y, unsigned char **map, int mapwidth, int mapheight);

static void _view_infacer(int x, int y, unsigned char **map, int mapwidth, int mapheight);

static void _view_infaceu(int x, int y, unsigned char **map, int mapwidth, int mapheight)

static void _view_infaced(int x, int y, unsigned char **map, int mapwidth, int mapheight)

static void _view_infacel(int x, int y, unsigned char **map, int mapwidth, int mapheight)

static void _view_infacer(int x, int y, unsigned char **map, int mapwidth, int mapheight)

void _view_infacestart(int x, int y, unsigned char **map, int mapwidth, int mapheight)

簡單概括就是:畫完自己腳下的點,然後向上下左右繼續找點,如果自己是從「下面上來」的,那就不在往下找了,碰到邊界或已經畫過的點,遞迴停止。

5.繪製多邊形:遍歷柵格圖,根據填格情況,在需要的地方繪製多邊形。

缺陷:

1.如果你的多邊形是個類似圓環,中空的圖形,是沒辦法填充完全的

----------續----------

函式遞迴次數是有限的,如何在有限次遞迴下完成超大張的繪製?

分塊遞迴

簡單的描述就是:

1.把影象切塊,然後在切線上投放遞迴點,而每次遞迴的範圍嚴格限制在切塊內;

2.在填充下一切塊時,相鄰的切線會傳遞相鄰畫素點的資訊,告知當前投放點是在影象外還是在影象的邊沿上;

3.反覆輪詢每一條切線,直至線上的每乙個點都不滿足投放遞迴點的條件為止,此時影象填充完成。

下面是做橫向切塊(橫條狀),然後從上往下掃瞄切線,再從下往上掃瞄,如此反覆的乙個填充過程。

canvas繪製多邊形並填充

let canvas document.getelementbyid canvas canvas.width 800 畫布寬度 canvas.height 800 畫布高度 let context canvas.getcontext 2d canvasmonth context,100,100,40...

MFC 用gdi繪製填充多邊形區域

mfc 用gdi繪製填充多邊形區域 這裡的 是實現乙個三角形的繪製,並用刷子填充顏色 在onpaint 函式裡面 運用的是給定的三角形的三個點,很多個點可以繪製多邊形 cpp view plain copy cbrush br rgb 40,130,170 crgn rgn cpoint arrpt...

Opencv繪製多邊形

利用opencv繪製多邊形,主要是因為給的資料是4個點,而繪製矩形的函式cv2.rectangle只傳遞兩個點,即左上和右下。繪製矩形框可以參考這裡 就是利用cv2.fillpoly函式 cv2.fillpoly img,area1,area2,area3 2,255,255 image表示處理的 ...