0%

计算几何入门

计算几何

写一下学计算几何的感悟。

向量

点积

$\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}|\times|\mathbf{b}| \times \cos\theta = x_1x_2+y_1y_2$

常用来计算向量夹角。

叉积

$\mathbf{a} \times \mathbf{b} = |\mathbf{a}|\times |\mathbf{b}|\times \sin\theta = x_1y_2-x_2y_1$

几何意义是两个向量围成的平行四边形的面积。

从 $\mathbf{a}$ 旋转到 $\mathbf{b}$,如果角度小于 $\pi$,那么为正,否则为负。

证明的话,方向是直接定义的,先不管,尝试证明。

我觉得这个不太适合用 markdown 写下来。

为什么方向是对的,可以替换一下 $x,y$ 变成 $\sin,\cos$,然后很自然是对的。

可以用来求线段交点。

算一下 $BCD,ACD$ 的面积,用相似求 $AO$,就可以得到 $O$ 点坐标。

image-20221004210732068

向量旋转

有人不会用这个东西,我不说是谁。

$\mathbf{a}$ 转 $\alpha$ 角:$(|\mathbf{a}|\cos(\theta+\alpha),|\mathbf{a}|\sin(\theta+\alpha))$。

和差角公式记不住的话朱某要来找麻烦,所以有人还是能记住。

多边形

三角剖分

$S=\dfrac{\sum\mathbf{a_i}\times \mathbf{a_{(i+1)\%n}}}{2}$

盗一波图。

image-20221004211714058

凸包

按照逆时针方向看,多边形凸包永远往左拐。

直线

可以用一个点 $P$ 加方向向量 $\mathbf{v}$ 存储,也可以顺便记一个 $P_2$。

点在直线的哪边

求 $PQ\times \mathbf{v}$ 即可,为正在下方,为负在上方,$0$ 则在线上,前提条件是向量 $\mathbf{v}$ 的 $x$ 为正 。

快速排斥实验和跨立实验

image-20221005160200348

两个矩阵不交,则通过快速排斥实验。

比较简易的方式是对于两维独立判断线段是否有交,如果任何一维无交,则通过快速排斥实验。

跨立实验则是判断一条线段的两端是否在另一条线段的两边,可以用向量叉乘做。

相互做跨立实验,如果均能通过,则线段有交或共线,结合快速排斥实验可以判断线段是否有交

两条线段共线但不交也能通过跨立实验。

两直线交点

先判断平行和重合。

然后对于两条直线 $(P_1,\mathbf{a_1}),(P_2,\mathbf{a_2})$,设 $Q=k\mathbf{a_1}+P_1$,则有 $(P_2-(k\mathbf{a_1}+P_1))\times \mathbf{a_2}=0$

叉积有分配律,所以直接拆开解 $k$ 然后带回去。

$k=\dfrac{(P_2-P_1)\times \mathbf{a_2}}{\mathbf{a_1}\times\mathbf{a_2}}$

如果你敢约分,朱某就敢把你鲨了。

线和直线的垂足

算出 $PQ$ 在 $\mathbf{v}$ 上投影的长度和方向(点积),$P$ 加上这个就行。

点到直线距离

可以先算垂足,也可以用记下来的另一个点带面积公式算。

角平分线

模长相同的方向向量相加,得到角平分线的方向向量,证明考虑构造菱形。

凸包

于是乎求凸包的时候多了一种判定方式:

如果是上凸包,弹出点的充要条件是上个点在该点与上上个点的连线下方

下凸包,弹出条件就是在上方,比斜率好一点,而且判共线很方便。

线援交圆交

求出点到直线距离和垂足,然后勾股定理算两个点。

圆圆交

半径相等可以求中点勾股定理偷懒,半径不等可以选一个三角形解三角形。

具体的,可以算出一个角的 $\cos$ 然后旋转向量,最后乘半径再加上去。

切点

勾股定理,旋转,解三角形。