---
# System prepended metadata

title: 【模板】計算幾何
tags: [競程, 模板, 數學]

---

【模板】計算幾何
===

## Default Code
```cpp=
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); }
```

## 常用

### 內積定義、正弦定理、夾角
```
cross(v1,v2) = abs(v1)*abs(v2)*sinθ
dot(v1,v2) = abs(v1)*abs(v2)*cosθ
```
* 用 `asin` 可以 `acos` 算出弳度

```
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 順時針
```
* 粗估順逆時針、夾角大小

### 點到直線距離

![](https://i.imgur.com/HCmJ9Xb.png)
```
點到直線距離 = cross(v1,v2)/abs(v2)
```

###### tags: `競程` `模板` `數學`