最近看了最小凸包繪製,官方**沒看,常見的有graham's scan演算法
其實原理比較簡單,先將點集排序,之後根據左轉進行棧掃瞄。
1.點集排序:一般取x座標最小的,並且盡量y大的,靠左下角的點作為起始點。然後連線起始點p0與其他點,計算連線與豎直向下方向的夾角,按照大小順序排列。
s(p1,p2,p3)=|y1 y2 y3|= (x1-x3)*(y2-y3)-(y1-y3)*(x2-x3) 第一點為p1,向量方向為p1p2,判斷p3點,若s為正,p3在向量p1p2的左側。
1.點集排序:
void sort(vector& pss)
}point temp = pss[0]; //將起始點放到首位置
pss[0] = pss[first_point];
pss[first_point]= temp;
//計算連線與豎直方向夾角
for(int i=0;i2.棧掃瞄
void scan(vector& pss,vector& bound)
else//右轉
} while (pss[0] != *bound.rbegin() );//回到起始點
}
測試:
void test(vectorpoint)
{ vectorbound;
sort(point);
scan(point,bound);
for (int i =0;i結果:
最小包圍矩形
題目內容 給定一組二維座標,表示直角座標系內的乙個多邊形的連續的頂點的座標序列。計算能包圍這個多邊形的平行於座標軸的最小矩形,輸出它的左下角和右上角的座標。輸入格式 第一行是乙個正整數n表示頂點的數量,第二行是n組整數,依次表示每個頂點座標的x和y值。輸出格式 四個整數,依次表示所計算的矩形的左下角...
matlab練習程式(最小包圍矩形)
又是計算幾何,我感覺最近對計算幾何上癮了。當然,工作上也會用一些,不過工作上一般直接呼叫boost的geometry庫。上次寫過最小包圍圓,這次是最小包圍矩形,要比最小包圍圓複雜些。最小包圍矩形可不一定是個直立的矩形,也可能像下圖一樣是傾斜的。求法如下 1.求多邊形凸包,這裡凸包直接呼叫系統函式了,...
matlab練習程式(最小包圍矩形)
又是計算幾何,我感覺最近對計算幾何上癮了。當然,工作上也會用一些,不過工作上一般直接呼叫boost的geometry庫。上次寫過最小包圍圓,這次是最小包圍矩形,要比最小包圍圓複雜些。最小包圍矩形可不一定是個直立的矩形,也可能像下圖一樣是傾斜的。求法如下 1.求多邊形凸包,這裡凸包直接呼叫系統函式了,...