计算几何入门

计算几何

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

向量

点积

\(\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\),那么为正,否则为负。

证明的话,方向是直接定义的,先不管,尝试证明。 \[ (x_1y_2-x_2y_1)^2=\sin^2\theta \mathbf{a}^2\mathbf{b}^2\\ \] 我觉得这个不太适合用 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\) 然后旋转向量,最后乘半径再加上去。

切点

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