graham 掃瞄法
1. 在點集q中 尋找乙個凸點p0; 尋找y 值最小的乙個點,如果有多個y 值最小的點,則取x 值最小的;
2. 得到q 中除p0 外的剩餘點集 , 且將 剩餘點集繞p0 極角排序; 如果極角相同的點有多個,則取離p0 距離最遠的點,捨棄其他點;(注意極角排序中,可根據叉積或求取向量n = pi - p0 與x 軸的夾角, 如果夾角的一定都在0 ~pi 之間, 提示可用atan2 (ny, nx) );
3. if m <2
4. return "convex hull is empty";
5. else
// s is a empty stack;
6. s.empty();
// 首先壓入前3個點;
7. push(p0, s);
8. push(p1, s);
9. push(p2, s);
// 對於其他剩餘點;
10. for i = 3 to m
// 迴圈判斷條件
11. while (s.size() > 2) // 如果點數大於3
// 當前點pi 加入後, 是否保持了凸包的left_turn 特性,如果沒有就去除棧中最top 的點
12. if none_lift_turn( next_to_top(s), top(s), pi) == true // 利用叉積判斷
pop(s);
// 經過測試後將該點壓入該棧, 回到下一次for 迴圈判斷;
13. push(pi, s);
// 最後的棧s 中儲存了凸包頂點;
14. return s;
// **:
#define max_point_number 2000
int s_convexpolygonalg::computebygrahamscan(const int poriginalpos[2], const int noriginalcount, int iconvexindices, int &nconvexpointcount)
// 說明:尋找最低最左點 [10/21/2016 zosh];
int istartpointindex = 0;
for (int i=1; iisqdist_i)
continue;
}else
}nhandlecount++;
} // 說明:個數小於2, 直接返回 [10/21/2016 zosh];
if (nhandlecount < 2)
std::stackstackconvexindices;
for (int i=0; i<3; i++)
for (int i=3; i1)
;int i_value_pi_pnext_top[2] = ;
int ivaluecrossdot = crossdot(i_value_pi_ptop, i_value_pi_pnext_top);
// 說明:注意這裡方向可能錯誤 [10/21/2016 zosh];
if (ivaluecrossdot > 0)
else
}else
}} while (!stackconvexindices.empty())
return 0;
}
// by 我執可破. 2016.10.23 於上海浦東.
計算幾何 二維凸包問題 Andrew演算法
凸包 把給定點包圍在內部的 面積最小的凸多邊形。andrew演算法是graham演算法的變種,速度更快穩定性也更好。首先把所有點排序,按照第一關鍵字x第二關鍵字y從小到大排序,刪除重複點後得到點序列p1.pn。1 把p1,p2放入凸包中,凸包中的點使用棧儲存 2 從p3開始,當下乙個點在凸包當前前進...
計算幾何之凸包
今天我們要涉及計算幾何中的凸包。凸包 convex hull 是乙個計算幾何 圖形學 中的概念。凸包這個東西,我們其實並不陌生,因為在斜率優化的時候我們就需要用到凸包來進行輔助。但是今天講的是怎麼求出凸包。在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用...
二維凸包演算法
部落格參考 謝謝 chao xun 把凸包寫的這麼詳細。關於凸包的問題的解決的最初思路是這樣的。1 找到乙個基準點 必須在凸邊上 2 以基準點做射線,然後將該射線向固定方向旋轉,直到接觸到乙個新的點。3 以 2 中找到的點作為新的基準點,作射線繼續朝著一開始的固定的方向旋轉 4 反覆重複2,3直到最...