四邊形填充算,除了比較笨的洪流法外,就是掃瞄線法了
基本演算法是:
(1) 求交,計算掃瞄線與多邊形的交點
(2) 交點排序,對第2步得到的交點按照x值從小到大進行排序;
(3) 顏色填充,對排序後的交點兩兩組成乙個水平線段,以畫線段的方式進行顏色填充;
(4) 是否完成多邊形掃瞄?如果是就結束演算法,如果不是就改變掃瞄線,然後轉第1步繼續處理;
這裡有詳細的介紹:
多邊形區域填充演算法--掃瞄線填充演算法(有序邊表法)
對於四邊形填充,這裡基於掃瞄線演算法,進一步優化,去掉了有序表。
偽**如下:
void fillarea(olm::pointf(&points)[4], uint8_t* map, int width, int height, int col,msimage* binmap);
_line lines[4];
// 找乙個y最小的點,及最小的y和最大的y
float ymin = points[0].y_;
float ymax = points[0].y_;
int mid = 0;
for(int i=0;i<4;i++)
}printf("top point mid: %d\n", mid);
// 以此點為線段起點,順時針為4條邊命名
for (int i = 0; i < 4; i++)
int l0 = (mid+3)%4;
int l1 = mid;
printf("*** l0: %d, l1: %d \n", l0,l1);
float x0 ,x1;
//初始起始點為最頂的點
int y = points[mid].y_;
x0 = x1 = points[mid].x_;
printf("*** y: %d, x: %.3f, %.3f \n",y, x0, x1);
getchar();
for(;y=ymax)
//下一條掃瞄線,如果換到了另一條邊上,更新邊索引(為了更新斜率倒數)
if((y+1)>lines[l0].ymax)
if((y+1)>lines[l1].ymax)
x0 -= 1/lines[l0].k;
x1 -= 1/lines[l1].k;
printf("*** l:%d,%d x: %.3f, %.3f \n",l0,l1,x0, x1);
// msencodefile(binmap, "bin.pgm", 85);
// getchar();
}}
四邊形優化
匆匆忙忙搞了一下四邊形優化,也就是做了幾道入門題而已 四邊形不等式詳解 反正我就記住這句話 判斷w是否為凸即判斷 w i,j 1 w i,j 的值隨著i的增加是否遞減 hdu 2829 include include include using namespace std define maxn 1...
定義四邊形 圓的內接四邊形
1 圓內接多邊形定義 多邊形的所有頂點都在同乙個圓上,這個多邊形叫圓內接多邊形,這個圓叫這個多邊形的外接圓。2 圓內接四邊形定義 四邊形的所有頂點都在同乙個圓上,這個四邊形叫圓內接四邊形,這個圓叫這個四邊形的外接圓。3 判定定理 如果乙個四邊形的對角互補,那麼它的四個頂點在同乙個圓上 簡稱四點共圓 ...
四邊形可以分為幾類 四邊形的分類
課題 四邊形分類 課型學案導學課 學習目標 我要在觀察 比較 操作 交流中探索新知。我要進一步認識平行四邊形 長方形 正方形的特徵。我要把四邊形按一定的標準進行分類。教學重 難點 教學重 難點 能把四邊形按一定的標準進行分類 課時安排 共課時 第 課時 導學過 程教師復備預習 導學 創設情景 師 現...