• 【学习笔记】计算几何


    基础知识

    向量

    概念:有大小和方向的量
    基础算法:
    (1)加:(A.x+B.x,A.y+B.y)(A.x+B.x,A.y+B.y)
    (2)减:(A.xB.x,A.yB.y)(A.xB.x,A.yB.y)
    (3)乘常数:(A.xk,A.yk)(A.xk,A.yk)
    (4)点积:A·B=|A||B|cosθ=A.xB.x+A.yB.yAB=|A||B|cosθ=A.xB.x+A.yB.y
    (5)叉积:A×B=|A||B|sinθ=A.xB.yA.yB.xA×B=|A||B|sinθ=A.xB.yA.yB.x

    基础算法

    (1)旋转:将 (x,y)(x,y) 逆时针旋转 θθ 就是 (xcosθysinθ,xsinθ+ycosθ)(xcosθysinθ,xsinθ+ycosθ)
    (2)把向量 A 转到与向量 B 同向:B|A||B|
    (3)求多边形面积:12|n1i=1Pi×P(i+1)%n|
    (4)以 A 为原点 B 为单位点求 P 的新坐标:(AB·AP,AB×AP)1|AB|2
    (5)P 与直线 AB 的位置关系:根据 AB×AP
    (6)点 P 在直线 AB 上的投影:A+AB(AB·AP)|AB|2
    (7)点与线段的位置关系:判断与线段所在直线的位置关系、点积判断在哪里
    (8)AB//CDAB×CD=0
    (9)直线 AB 和直线 CD 求交点:A+ABCD×CAAB×CD
    (10)线段与直线求交点:线段两端点在直线两侧、直线求交点

    凸包

    Graham 扫描法

    求凸包:
    (1)找到所有的点中最左下角的点,并加入栈中
    (2)将所有点按极角排序逆时针
    (3)每次找到一个点,判断该点是否在最后这条边的右边,若是则弹出栈顶,直到不能弹出就加入栈里
    求下凸壳:
    按横坐标从小到大排序,然后执行上文 (3)
    求上凸壳:
    按横坐标从大到小排序,然后执行上文(3)

    旋转卡壳

    本质:固定一个点,所求与另一个点的位置呈单峰函数且峰值关于固定点单调的算法

    例题:

    题目描述:
    求解凸多边形的直径。直径的定义为凸多边形上两点间距离的最大值。
    解法:
    (1)任意选择一个点为固定点
    (2)以固定点在逆时针顺序下的下一个点为第二个点
    (3)因为这两点间的距离与第二个点的位置呈单峰函数,且峰值关于固定点单调,所以就按逆时针方向移动第二个点
    (4)移动到最大距离处,计算贡献,并按逆时针方向移动固定点,不移动第二个点
    (5)重复(3)直到移动结束
    例如下图所示:

    先随机找到固定点 A,与对应的第二个点 B

    移动 B ,使得 AB 两点间距离最大

    保持 B 不动,移动 A
    然后再按照上文的方法一直循环执行

    点与圆


    判断点是否在圆上: dr
    d=|PC|,r=r DAC=arccos(rd),DAC=(arcsinrd)

    直线与圆


    根据叉积得到 d
    |MA|=|MB|=r2d2OBM=arccosdr

    圆与圆

    是否相交


    根据 dr1+r2

    不交圆外公切线


    k=r2r1,CAB=arccosr2r1d,DBA=arccosr1r2d

    不交圆内公切线


    BAG=ABF=arcsinr1+r2d

  • 相关阅读:
    @Async注解的坑,小心
    微信小程序小说阅读器+后台管理系统|前后分离VUE
    会议管理系统SSM记录(一)
    Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
    使用Kubernetes部署Kubernetes集群
    不适合学习编程的人是你吗?
    ansible角色运行指定角色路径
    dplyr 中的filter报错:Can‘t transform a data frame with duplicate names
    【优化算法】基于matlab反向策略的麻雀搜索算法【含Matlab源码 1918期】
    Acrobat中的颜色转换和油墨管理功能以及专色转换
  • 原文地址:https://www.cnblogs.com/linyihdfj/p/16342023.html