計算幾何 模板

2021-09-11 11:48:38 字數 4070 閱讀 6784

#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...