计算几何 学习笔记
二维向量以及基础知识
二维向量是一条有向线段,只有长度和方向,因此可以用 来表示一条向量从 指向 。
对于一条向量 , 表示模长,也就是长度。
对于 :
模长:。
向量加:。
数乘 。
点积:, 表示夹角。
叉积:, 表示从 转到 的夹角的 值。
容易发现这几个运算满足运算基本定理,结合律,交换律,分配率。
简单的代码实现:
struct Po {
db x, y;
};
Po operator+(Po x, Po y) { return {x.x + y.x, x.y + y.y}; }
Po operator-(Po x, Po y) { return {x.x - y.x, x.y - y.y}; }
db operator*(Po x, Po y) { return x.x * y.x + x.y * y.y; }
db operator/(Po x, Po y) { return x.x * y.y - x.y * y.x; }
判定两条线段相交
需要满足两个条件:
-
该线段作为对角线的矩形有交。
-
对于两条线段分别做以下判定:
一条线段是 ,另一条是 ,判定 和 是否在 异侧。
求两向量夹角
判断一点是否在多边形内部
从这个点出发随机射出一条射线,与多边形边有奇数个交点就说明在其内部。
二维凸包
这个其实比较简单,容易发现 轴最小和最大的点一定在凸包上,因此求个上凸包和下凸包即可。
具体实现就是开个单调栈,从左向右把点加进去,需要满足斜率的单调。
如果有共线的情况还是比较阴间的。
旋转卡壳
省选前更新一下(
就是对于凸包求最远两点的距离,考虑用两条平行线去夹凸包,然后一起旋转,得到所有可能更新答案的方案。
凸包转的时候,一个点会在多条平行线的方案里,因此去考虑每条边,然后找到对面的点进行更新。
注意,线必须转完一圈,不能只转一半。
求最小矩形覆盖
相当于现在是找四个点,还是可以用一条边去找点对,然后左右两边用点积求即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!