多邊形填充演算法實現

2021-05-22 03:17:57 字數 1841 閱讀 7260

//

// 功能:  填充多邊形

//// 引數:  lppoints: 指向頂點座標陣列的指標,陣列型別為point,多邊形由它們順次封閉連線得到

//    ncount:  頂點的個數

//    ncolor:  填充的顏色 預設為黑色

//    pdc:  裝置控制代碼指標

//// 返回:  無返回值

//// 說明:  可以是邊相交的多邊形

////

void fillpolygon(lppoint lppoints,int ncount, cdc *pdc, int ncolor/*=0*/)

edge, * lpedge;

int i=0,j=0,k=0;

int y0=0,y1=0;  // 掃瞄線的最大和最小y座標

lpedge paet=null; // 活化邊表頭指標

lpedge * pet=null;  // 邊表頭指標

paet=new edge; // 初始化表頭指標,第乙個元素不用

paet->pnext=null;

// 獲取y方向掃瞄線邊界

y0=y1=lppoints[0].y;

for(i=1;iy1)

y1=lppoints[i].y;

}if(y0>=y1) return;

// 初始化邊表,第乙個元素不用

pet=new lpedge[y1-y0+1];

for(i=0;i<=y1-y0;i++)

for(i=0;i// 構造邊

peg =new edge;

k=(lppoints[i].y>lppoints[j].y)?i:j;

peg->ymax=lppoints[k].y; // 該邊最大y座標

k=(k==j)?i:j; 

peg->x=(float)lppoints[k].x; // 該邊與掃瞄線焦點x座標

if(lppoints[i].y != lppoints[j].y)

peg->dx=(float)(lppoints[i].x-lppoints[j].x)/(lppoints[i].y-lppoints[j].y);// 該邊斜率的倒數

peg->pnext=null;

// 插入邊

ppeg=pet[lppoints[k].y-y0];

while(ppeg->pnext)

ppeg=ppeg->pnext;

ppeg->pnext=peg;

}// end if

}// end for i

// 掃瞄

for(i=y0;i<=y1;i++)

// 按照x遞增排序paet

peg0=paet;

while(peg0->pnext)

pegi=pegmax->pnext;

pegmax->pnext=pegi->pnext;

pegi->pnext=paet->pnext;

paet->pnext=pegi;

if(peg0 == paet)

peg0=pegi;

}// 遍歷活邊表,畫線

peg0=paet;

while(peg0->pnext)

else

break;

}// 把ymax=i的節點從活邊表刪除並把每個節點的x值遞增dx

peg0=paet;

while(peg0->pnext)

peg0->pnext->x+=peg0->pnext->dx; //把每個節點的x值遞增dx

peg0=peg0->pnext;}}

// 刪除邊表

for(i=0;i

多邊形填充演算法實現

功能 填充多邊形 引數 lppoints 指向頂點座標陣列的指標,陣列型別為point,多邊形由它們順次封閉連線得到 ncount 頂點的個數 ncolor 填充的顏色 預設為黑色 pdc 裝置控制代碼指標 返回 無返回值 說明 可以是邊相交的多邊形 建立 修改 2003 10 13 16 31 曹...

掃瞄多邊形填充演算法

掃瞄多邊形填充演算法 在做手機地圖的過程中,由於j2me沒提供多邊形填充的api,只能自己實現了,以下是實現的思路,請批評指正 多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素...

掃瞄多邊形填充演算法

多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用 掃瞄線多邊形填充演...