計算幾何說起來都是一套一套的,寫起來卻讓人二楞二楞的qwq
接下來直接粘**,稍微高階的演算法講解詳見超連結【基本的定義&演算法】
#include
const
double eps =
1e-7
;//誤差允許範圍,廣泛用於大小比較
inline
double
dcmp
(double x)
//強烈建議浮點數的大小比較都用這個函式
struct point
point
(double a,
double b):x
(a),
y(b)
//算極角
friend
double
dots
(point a, point b)
//點積
friend
double
cross
(point a, point b)
//叉積
friend
double
dist
(point a, point b)
//模長
point operator+(
const point a)
const
//向量加法
point operator-(
const point a)
const
//兩點間的向量、向量的減法
point operator*(
const
double a)
const
//向量的數乘
bool
operator
<
(const point a)
const
bool
operator==(
const point a)
const
/*關係運算子因題而異(此處的過載用於極角排序)*/};
struct line
line
(point a, point b):p
(a),
v(b - a)
//算極角
friend point get_cross
(line a, line b)
//求交點
friend
bool
onleft
(line a, point b)
//判方向
bool
operator
<
(const line a)
const
/*關係運算子因題而異(此處的過載用於極角排序)*/};
inline
double
get_s
(int n)
//多邊形面積
intmain()
求凸包
//由於極角排序的演算法導致點的儲存不穩定(即無論如何處理,都可能會有一些邊上點無法完全保留或完全剔除,故採用以x為第一關鍵字,y為第二關鍵字的方法)
//本模板將所有凸包上的點都保留了下來
point stk[mn]
, p[mn]
//為保證好讀,此處的point已根據需要過載運算子「<」和「==」;
int top;
inline
void
make_polygon
(int n)
/*上下凸殼各做一次,然後合併得凸包*/
for(i = n; i; i--
)int siz =
unique
(stk +
1, stk +
1+ top)
- stk -1;
//去重
}
半平面交
point p[mn]
;int cnt, h, t;
line q[mn]
, l[mn]
;inline
double
merge_halfplane
(int cnt)
if(h < t)
p[t -1]
=get_cross
(q[t -1]
, q[t]);
//獲取交點
}while
(h < t &&
!onleft
(q[h]
, p[t -1]
)) t--
;//判斷首尾連線處
p[t]
=get_cross
(q[t]
, q[h]);
return
get_s
(h, t)
;//算面積
}
計算幾何,持續更新
先放兩個比較好的部落格 模板比較全的 1.叉積 兩個點l a,b r c,d lr向量等於 c a,d b 兩個向量p x1,y1 q x2,y2 if s 0 說明從p到q逆時針旋轉的角度為 0,180 如果相同起點的一堆向量,如果某乙個向量和其他任何向量的叉乘s都 0,則這個向量是逆時針旋轉的起...
計算幾何模板 更新中
今天又切了一題,做題的同時當然也驗證了各種模板 每次都感覺有所改進 view code include include include using namespace std const int maxn 100010 const double eps 1e 8 inline int max int...
模板整合 及時更新 天坑 計算幾何模板
計算幾何模板要寫的內容真多 我寫煩了 先寫這些放上來吧 include include include include include include define maxdbl 1e20 define eps 1e 9 define pi acos 1 using namespace std st...