總有一天會用到的筆記

本站為減緩筆者下列疑難雜症誕生:記性很差,學過就忘;智商低落,囫圇吞棗。

0%

【模板】計算幾何

Default Code

1
2
3
4
5
6
7
8
9
10
typedef pair<int,int> vec;
vec operator - (vec p){ return {-p.ff, -p.ss}; }
vec operator + (vec p, vec q){ return {p.ff+q.ff, p.ss+q.ss}; }
vec operator - (vec p, vec q){ return {p.ff+q.ff, p.ss+q.ss}; }
vec operator * (vec p, int q){ return {p.ff*q, p.ss*q}; }
vec operator / (vec p, int q){ return {p.ff/q, p.ss/q}; }
int cross (vec p, vec q){ return p.ff*q.ss - p.ss*q.ff; }
int dot (vec p, vec q){ return p.ff*q.ff + p.ss*q.ss; }
int abs2 (vec p){ return dot(p,p); }
double abs (vec p){ return hypot(p.ff,p.ss); }

常用

內積定義、正弦定理、夾角

1
2
cross(v1,v2) = abs(v1)*abs(v2)*sinθ
dot(v1,v2) = abs(v1)*abs(v2)*cosθ
  • asin 可以 acos 算出弳度
1
2
3
4
5
6
7
dot(v1,v2) < 0, θ < 90
dot(v1,v2) = 0, θ = 90
dot(v1,v2) > 0, θ > 90

cross(v1,v2) > 0, v1 到 v2 逆時針
cross(v1,v2) = 0, v1 平行 v2
cross(v1,v2) < 0, v1 到 v2 順時針
  • 粗估順逆時針、夾角大小

點到直線距離

1
點到直線距離 = cross(v1,v2)/abs(v2)