【计算几何】学习笔记
基础操作
判断A在线段BC上
先判断BA与CA的叉积是否为零
再判断A的横坐标是否在两点横坐标之间(否则在直线BC上而不一定在线段BC上)
判断线段AB与线段CD是否相交
再判断C、D在线段AB两侧(AC叉积AB)*(AB叉积AD)>=0
先判断A、B在线段CD两侧(同上)
求线段AB与线段CD交点
先判断是否有交点
再用面积比计算(加权平均)(x1*s1+x2*s2)/(s1+s2)
判断点在多边形内部
引任意一条射线与多边形相交次数为奇数(注意与点、边的重合)
点算上不算下
线段不算
求多边形面积
任选一点顺序累加叉积
凸包
Graham
极角排序(左下角开始(最左的最下)):
计算出所有点到左下点的直线的角度大小(函数atan2)
按照角度排序
按顺序维护凸包
水平序(左下角开始)(支持维护动态凸包):
可以得到下凸壳
可以反过来再求出上凸壳
动态凸包
加入点
平衡树维护(基于水平序)
删除
CDQ分治or分块or二进制分组?
平面最远点对
求凸包再求旋转卡壳
旋转卡壳
枚举凸包上的所有边,对每一条边找出凸包上离该边最远的顶点
计算这个顶点到该边两个端点的距离,并记录最大的值
直观上这是一个O(n^2)的算法,和直接枚举任意两个顶点一样
但是注意到当我们逆时针枚举边的时候,最远点的变化也是逆时针的
这样就可以不用从头计算最远点,而可以紧接着上一次的最远点继续计算
于是我们得到了O(n)的算法
半平面交
极角排序再去掉无用直线
最小圆覆盖
随机增量法
对于i-1个点的最小圆覆盖,若i不在圆外,不管
若i在圆外,i一定在i个点的最小圆覆盖上,以i和圆心建圆把i-1个点一次
加入同理
求出在i个点的最小圆覆盖上
同理求出三个点,三点定圆
圆的面积并
辛普森积分
题目
poj2398
poj3384
poj2826
bzoj2732
bzoj2178
Asteroids