前提条件
1 |
|
点(向量)
已知
$(x,y)$,点坐标或向量坐标
函数
相加、相减、与常数相加、点乘、叉乘、旋转、标准化
向量旋转
$$
\begin{bmatrix} \cos \theta & -\sin \theta \ \sin \theta & \cos \theta \end{bmatrix}
\begin{bmatrix} x \ y \end{bmatrix} =
\begin{bmatrix} x\cos\theta-y\sin\theta \ x\sin\theta+y\cos\theta \end{bmatrix}
$$
代码
1 | // 点或向量 |
极坐标点
1 | struct polar{ |
线段
已知
已知线段两端端点$A,B$
函数
跨立实验,快速排斥实验
代码
1 | // 线段 |
直线与射线
已知
已知直线上一点和向量,$P,\vec{s}$
函数
获得直线上的一点
求两直线交点

公式
$$
P=A-\frac{\vec{b}\cdot\vec{BA}}{\vec{b}\cdot\vec{a}}\cdot\vec{a}
$$
代码
1 | struct line{ |
圆
已知
圆心$O$,半径$r$
代码
1 | struct circle{ |
直线与圆

已知
直线:$P$点坐标$(P_x,P_y)$,$\vec{s}=(s_x,s_y)$
圆:$O$点坐标$(O_x,O_y)$,圆的半径$r$
推导
$$
|OE|= \frac{\vec{s} \times \vec{PO}}{|\vec{s}|} \
|PE|= \frac{\vec{s} \cdot \vec{PO}}{|\vec{s}|}\
|AE|=|BE|=\sqrt{r^2-|OE|^2}\
|PA|=|PE|-|AE|\
|PB|=|PE|+|BE|\
A=P+\frac{|PA|}{|\vec{s}|}\cdot\vec{s}\
B=P+\frac{|PB|}{|\vec{s}|}\cdot\vec{s}
$$
代码
1 | seg intersectionOfLineAndCircle(const line& p, const cle& c){ |
凸包
已知
已知一个二维坐标图中每个顶点,求最小周长能够包含所有所有顶点的凸包
思路
先将点双关键字排序,横坐标为第一关键字,纵坐标为第二关键字
排序之后

图片向量方向迭代方向
之后维护单调单调栈,其中栈顶为$S_1$,栈顶第二元素为$S_2$,当前检查的点为$P$,由于凸包是不会出现右转的,所以当出现$\vec{S_2S_1}\times\vec{S_1P}<0$说明栈顶的元素不是最优凸包,弹出栈顶重复上一步。



第一次循环迭代之后,会发现求完了下凸包先在需要倒转迭代方向,再次遍历




第二次迭代完善上凸包,最终会形成一个最短周长的能够包含所有顶点的凸包
注意:运行结果最后还会添加一次初始节点,那么周长就为$$\sum_{i=0}^{tp-1}|\vec{p_ip_{i+1}}|$$
代码
1 | const int N = 1e5+10; |
