安德魯演算法
安德魯演算法判斷凸包需要用到叉積
關於叉積
首先在二維座標下介紹一些定義:
點:a(x1,y1),b(x2,y2)
向量:向量ab=( x2 - x1 , y2 - y1 )= ( x , y );
向量的模 |ab| = sqrt ( x*x+y*y );
向量的點積: 結果為 x1*x2 + y1*y2。
點積的結果是乙個數值。
點積的集合意義:我們以向量 a 向向量 b 做垂線,則 | a | * cos(a,b)為 a 在向量 b 上的投影,即點積是乙個向量在另乙個向量上的投影乘以另乙個向量。且滿足交換律
應用:可以根據集合意義求兩向量的夾角,
cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) = x1*x2 + y1*y2 / (| a | * | b |)
向量的叉積: 結果為 x1*y2-x2*y1
叉積的結果也是乙個向量,是垂直於向量a,b所形成的平面,如果看成三維座標的話是在 z 軸上,上面結果是它的模。
方向判定:右手定則,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉積的方向)
叉積的集合意義:1:其結果是a和b為相鄰邊形成平行四邊形的面積。
2:結果有正有負,有sin(a,b)可知和其夾角有關,夾角大於180°為負值。
3:叉積不滿足交換律
應用:1:通過結果的正負判斷兩向量之間的順逆時針關係
若 a x b > 0表示a在b的順時針方向上
若 a x b < 0表示a在b的逆時針方向上
若 a x b == 0表示a在b共線,但不確定方向是否相同
在順時針方向上為凸包
否則是凹進去的。
以此依次加點。
將座標按照x從小到大排序。
先加上面的凸包 然後加下面的凸包。
#include
using
namespace
std;
#define mo 100005
struct node
d[mo],p[mo];
int chaji(node a,node b,node c)//叉積計算
bool cmp(node a,node b)//座標點排序
for(int i=n-2;i>=0;i--)
cout
<1
}
白書幾何模板
白書幾何模板 const double eps 1e 10 struct point typedef point vector 向量就是點的表示 vector operator vector a,vector b vector operator vector a,vector b vector op...
白書若干題
1.p32 排列 用1 2 3 9組成3個三位數abc,def和ghi,每個數字恰好使用一次,要求abc def ghi 1 2 3。輸出所有解。int i,j,k for i 123 i 987 3 i next permutation等全部重拍,然後判斷是否滿足比例關係。2.p50 乘積的末三位...
劃分數 白書
1 include 2 include 3 4using namespace std 5 有關計數問題的dp6 有n個無區別的物品,劃分成不超過m組,求方法數取模m的餘數78 const int max n 1000 2 9 const int max m 1000 2 10 const int m...