白書16 12凸包

2021-08-17 15:42:33 字數 1243 閱讀 2631

安德魯演算法

安德魯演算法判斷凸包需要用到叉積

關於叉積

首先在二維座標下介紹一些定義:

點: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...