【计算几何】学习笔记

基础操作

判断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

posted @ 2017-12-28 15:50  减维  阅读(191)  评论(0编辑  收藏  举报