# 計算幾何 - 課前預習
## 座標與向量
座標
- 極座標
- 二維平面座標
```cpp
typedef pair<double, double> pdd; // 依據題目要求可用 double / int
```
向量
- 有向線段(向:方向、量:長度)
- 純量:只有大小、沒有方向的量
- $\overrightarrow{AB}$:由 A 點起始指向 B 點的向量
- 可以任意平移
- 向量長度(加絕對值表示):兩點的歐基里德距離
$\vert\overrightarrow{AB}\vert=\sqrt{(x_1-x_2)^2 +(y_1-y_2)^2}$
向量運算
1. 向量加法 $\overrightarrow{a}+\overrightarrow{b}$
- 頭尾相連:$\overrightarrow{AB}+\overrightarrow{BC}=\overrightarrow{AC}$
- 在圖上可以用三角形法或平行四邊形法
- 代數運算:
$\overrightarrow{a}(x_1,y_1)$, $\overrightarrow{b}(x_2,y_2)$, $\overrightarrow{c}(x_3,y_3)$
$\overrightarrow{a}+\overrightarrow{b}=\overrightarrow{c}$
$\Rightarrow x_1 + x_2 = x_3$
$\Rightarrow y_1 + y_2 = y_3$
2. 向量減法 $\overrightarrow{a}-\overrightarrow{b}$
- 負向量 = 相反向量:$-\overrightarrow{AB}=\overrightarrow{BA}$
- 向量相減即加上一個相反向量:$\overrightarrow{AB}-\overrightarrow{CD}=\overrightarrow{AB}+\overrightarrow{DC}$
3. 向量係數積 $k\overrightarrow{a}$
- 幾何意義:將 $\overrightarrow{a}$ 縮放 $k$ 倍
- 計算方式:$k(x,y) = (kx,ky)$
4. 向量內積 $\overrightarrow{a} \cdot \overrightarrow{b}$
- 表示兩個向量在「同一方向」的程度。
- 兩個向量的內積(點積)以「`⋅`」表示。
- 運算結果為一個**純量**(scalar)。
- 計算方式:
- $\overrightarrow{a} \cdot \overrightarrow{b}=\vert\overrightarrow{a}\vert\vert\overrightarrow{b}\vert\cos\theta$ 其中 $\theta$ 為兩向量夾角
- [座標化形式](https://slides.com/peienwu1216/deck#/1/12):$(x_1,y_1) \cdot (x_2,y_2) = x_1x_2+y_1y_2$
- 正定性:向量與自身的內積為其長度平方:$|\overrightarrow{a}|^2 =\overrightarrow{a} \cdot \overrightarrow{a}$
- 內積判斷角度關係:
- 運用餘弦的性質
- $\overrightarrow{a} \cdot \overrightarrow{b}>0$ 則 $0^{\circ}\leq\theta<90^{\circ}$ 銳角
- $\overrightarrow{a} \cdot \overrightarrow{b}=0$ 則 $\theta=90^{\circ}$ 垂直
- $\overrightarrow{a} \cdot \overrightarrow{b}<0$ 則 $90^{\circ}<\theta\leq180^{\circ}$ 鈍角
5. 向量外積 $\overrightarrow{a} \times \overrightarrow{b}$
- 三維空間中代表兩個向量的公垂向量
- 兩個向量的外積(叉積)以「`×`」表示。
- 三維運算結果為一個**向量**。
- 計算方式:
- $\overrightarrow{a} \times \overrightarrow{b} = |\overrightarrow{a}||\overrightarrow{b}|\sin\theta\,\overrightarrow{n}$
其中 $\theta$ 為兩向量夾角,$\overrightarrow{n}$ 是依**右手定則**決定方向的單位向量。
- 座標化形式 (二維):
若 $\overrightarrow{a}=(x_a,y_a)$,$\overrightarrow{b}=(x_b,y_b)$,則外積為
$\overrightarrow{a} \times \overrightarrow{b} = x_ay_b - x_by_a$
(結果為**純量**)
- 特性:
- **三度空間**中外積為向量,且垂直於 $\overrightarrow{a}$ 和 $\overrightarrow{b}$ 張成的平面。
- **二度空間**外積的意義是「兩向量張成的平行四邊形的有向面積」。
- 外積判斷向量關係:
- $\overrightarrow{a} \times \overrightarrow{b} > 0$:從 $\overrightarrow{a}$ 逆時針旋轉到 $\overrightarrow{b}$。
- $\overrightarrow{a} \times \overrightarrow{b} = 0$:兩向量平行(共線)。
- $\overrightarrow{a} \times \overrightarrow{b} < 0$:從 $\overrightarrow{a}$ 順時針旋轉到 $\overrightarrow{b}$。
6. 內積 vs 外積
- 向量內積(Dot Product)
- 判斷向量是否垂直
- 結果為純量
- 向量外積(Cross Product)
- 判斷向量是否平行
- 結果為向量(今天都當純量來用)
- 判斷向量夾角方向 (順時針或是逆時針)
- 可用來計算面積
7. 向量實作
- 座標表示法 $A(x,y)$,做法跟點一樣,代表向量 $\overrightarrow{OA}$
```cpp
typedef pair<double, double> pdd; // 依據題目要求可用 double / int
```
- 運算子 (用多載實現)
```cpp
#define X first
#define Y second
#define eps 1e-12
// #define double long long
typedef pair<double, double> pdd;
pdd operator+(pdd a, pdd b)
{ return pdd(a.X + b.X, a.Y + b.Y); }
pdd operator-(pdd a, pdd b)
{ return pdd(a.X - b.X, a.Y - b.Y); }
pdd operator*(pdd a, double b)
{ return pdd(a.X*b, a.Y*b); }
pdd operator/(pdd a, double b)
{ return pdd(a.X/b, a.Y/b); }
double dot(pdd a, pdd b)
{ return a.X*b.X + a.Y*b.Y; }
double cross(pdd a, pdd b)
{ return a.X*b.Y - a.Y*b.X; }
double abs2(pdd a) // Square
{ return dot(a, a); }
double abs(pdd a)
{ return sqrt(dot(a, a)); }
```
- eps
- 在進行有小數的計算幾何時,常常會有很多的浮點誤差
- eps為誤差容忍值,兩數相差eps內視爲相等