求凸包的兩種演算法

2021-08-07 01:39:26 字數 735 閱讀 2065

凸包指的是乙個點集中的最小凸多邊形,且其包含了所有點集內的點;簡單地說,就是點集最外側的點構成的凸多邊形。求凸包有兩種方法:卷包裹法和graham-scan演算法。

1、卷包裹法:

(1)找出左下角的點(以橫縱座標為第一第二關鍵字,可以找x最小的,x相同則找y最小的),顯然這個點一定為凸包上的乙個頂點;

(2)以(1)中找出的點為原點,選出任意一條邊(起點為原點),與所有其它邊進行對比直至找到極角最小的邊(通過叉乘比較,詳見計算幾何板塊);

(3)通過該邊找到下乙個點,重複(2)中過程,直到回到原點,這個序列就是凸包序列。

效率分析:每找到乙個點,我們都要列舉一遍其他所有點,因此效率是

部分**:

int dist(int x1,int y1,int x2,int y2) //求距離

int mul_cross(int x1,int y1,int x2,int y2) //求叉乘

void find_1() //找左下角的點

void swap(int i,int j) //交換,把左下角的點放在陣列第一位

double distance_self(int i,int j) //求兩點間距離

void qs(int l,int r) //排序

}if (il) qs(l,j);

}void find_1() //找左下角的點

void find_2() //求凸包

}

graham求凸包演算法

問題 點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。這個演算法是由數學大師葛立恆graham發明的,他曾經是美國數學學會ams att 首席科學家.see 模板 see include include using namespace std cl...

求a的n次方的兩種演算法對比

一 演算法一 遞推相乘法 示例 public class testn private static long f int a,int n 解析 這種演算法累乘的次數比較多,當n比較大時,程式的執行效率不是很高。二 演算法二 二進位制分解法 示例 public class testpower priv...

求素數的兩種解法

檔名 exp1 1.cpp 求素數的個數 include include bool prime int n 判斷正整數n是否是素數 int main for i 3 i n i 2 printf n return 0 檔名 exp1 1 2.cpp 利用快速篩選法求素數的個數 篩法的思想是去除要求範...