計算幾何之求取二維點集的凸包 凸多邊形包圍盒

2021-07-23 23:08:05 字數 1782 閱讀 7453

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直到最...