掃描線算法填充五角星

今天來討論一下如何使用掃描線算法來實現多邊形填充。

首先簡述一下什麼是掃描線算法: 該算法的輸入是一組多邊形的頂點座標(x,y),注意,這裏有個順時針還是逆時針問題,請讀者自己試驗;輸出是填充好的多邊形。通過使用沿x軸方向的掃描線來確定多邊形在每條掃描線上的邊界,在xlo和xhi之間進行像素填充。掃描線y=y_i,比如從多邊形的y_min到y_max,從而覆蓋整個多邊形。


請參考博文"區域填充算法和多邊形填充的掃描線算法",作者twinklingstar。本文利用其源代碼來填充一個五角星。


首先,五角星的座標給出如下:

    double d_polygon[10][2] = {{13.0901,7.7548},{11.9097,4.1221},{14.9999,6.3672},{18.09,4.1221},{16.9097,7.7548},\
    {20,10},{16.1802,10},{15,13.6326},{13.8196,10},{10,10}};

由於該程序的輸入須爲整數,所以將x,y都擴大10倍,並且四捨五入。

    int round_polygon[10][2];
    int factor = 10;
    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 2; j++){
            d_polygon[i][j] *= factor;
            round_polygon[i][j] = round(d_polygon[i][j]);
        }
    }

該程序定義了一個Vector結構體,所以將數組值賦給該結構體。

    Vector polygon_five_star[10];
    for(int i = 0; i < 10; i++){
        polygon_five_star[i].x = round_polygon[i][0];
        polygon_five_star[i].y = round_polygon[i][1];
    }

現在,調用掃描線函數scanLineFill()。

scanLineFill(polygon_five_star,10,RGB(0,255,0));

其參數爲:poylon_five_start, 須填充的多邊形結構體;10, 多邊形的頂點數; RGB(0, 255, 0),填充顏色。以下爲輸出結果。

wKioL1cJqDrCnHVYAAATQFV5fq8763.png

這裏有幾點注意:

  1. 多邊形頂點必須是逆時針才行,接下來還要研究一下爲什麼順時針不行;

  2. 頂點座標需要是整數;

  3. 該程序也是調用了glut工具包,請參考之前的博文關於glut的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章