#include
#include
#include
#include
typedef
double db;
const db eps =
1e-9
;const db pi =
acos(-
1);// 判斷符號
inline
intsign
(db ps)
// 比較大小
inline
intcmp
(db ps, db b)
// 點
struct p ;p
(db _x, db _y):x
(_x),y
(_y)
;// 四則運算
p operator
+(p p)
const;}
; p operator
-(p p)
const;}
; p operator
*(db d)
const;}
; p operator
/(db d)
const;}
;bool
operator
<
(p p)
const
bool
operator
==(p p)
const
// 兩點間距離
db dis
(p p)
const
// 求與x軸夾角
db alpha()
const
// 模長
db abs()
const
db abs2()
const
// 逆時針旋轉
p rotate
(db phl)
const;}
p rotate90()
const
// 單位化
p unit()
const};
// 點積
db dot
(p p1, p p2)
// 叉積
db cross
(p p1, p p2)
// 夾角
db rad
(p p1, p p2)
// 判斷直線k1k2和直線k3k4是否平行 true平行
bool
checkll
(p k1, p k2, p k3, p k4)
// 求直線k1k2和直線k3k4的交點
p getll
(p k1, p k2, p k3, p k4)
// 判斷區間[l1, r1]和區間[l2, r2]是否相交
bool
intersect
(db l1, db r1, db l2, db r2)
// 線段相交
bool
checkss
(p k1, p k2, p k3, p k4)
// 線段嚴格相交
bool
checkss_strict
(p k1, p k2, p k3, p k4)
// m 在 [k1,k2] 內
bool
ismiddle
(db k1, db m, db k2)
// 點m在點k1和點k2中間
bool
ismiddle
(p k1, p m, p k2)
bool
onseg
(p k1, p k2, p p)
bool
onseg_strict
(p k1, p k2, p p)
// 求點p在直線k1k2上的投影
p project
(p k1, p k2, p p)
// 求點p關於直線k1k2的對稱點
p reflect
(p k1, p k2, p p)
// p到線段k1k2的最近距離
db nearest
(p k1, p k2, p p)
// 線段距離
db disss
(p k1, p k2, p k3, p k4)
// 多邊形面積
db area
(std::vectorps)
// 點包含 2內部 1邊界 0外部
intcontain
(std::vectorps, p p)
return res *2;
}// 凸包 flag=0 不嚴格 flag=1 嚴格
std::vectorconvexhull
(std::vectorps,
int flag =1)
int pre = now;
for(
int i = n -
2; i >=0;
--i)
res.
resize
(now)
;return res;
}// 點集直徑
db convexdiameter
(std::vectorps)
}return res;
}//最小矩形覆蓋
db minrectanglecover
(vector ps)
if(ans ==-1
) ans = w *
(r - l)
/(x2 - x1)
.abs2()
;else
ans =
min(ans, w *
(r - l)
/(x2 - x1)
.abs2()
);}return
max(ans,
0.0);}
// 半徑為r的圓o與直線p1p2的交交點
std::vectoriscl
(p o, db r, p p1, p p2)
; db x =
dot(p1 - o, p2 - p1)
, y =
(p2 - p1)
.abs2()
, d = x * x - y *
((p1 - o)
.abs2()
- r * r)
; d = std::
max(d,
0.0)
; p m = p1 -
(p2 - p1)
*(x / y)
, dr =
(p2 - p1)
*sqrt
(d)/ y;
return;}
// 半徑為r1的圓o1 與 半徑為r2的圓o2 的交點
std::vectoriscc
(p o1, db r1, p o2, db r2);if
(cmp
(d,abs
(r1 - r2))==
-1)return
; d = std::
min(d, r1 + r2)
; db y =
(r1 * r1 + d * d - r2 * r2)/(
2* d)
, x =
sqrt
(r1 * r1 - y * y)
; p dr =
(o2 - o1)
.unit()
; p q1 = o1 + dr * y, q2 = dr.
rotate90()
* x;
return;}
// 切線
std::vectortancp
(p o, db r, p p)
; p q1 = o +
(p - o)
*(r * r / x)
; p q2 =
(p - o)
.rotate90()
*(r *
sqrt
(d)/ x)
;return
;}
(未完待續) 計算幾何模板
sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...
計算幾何模板
include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...
計算幾何模板
多圓面積交 typedef long long ll typedef unsigned long long ull typedef vector vi const int inf 0x3f3f3f3f const double eps 1e 10 const int mod 100000007 co...