• 【学习笔记】计算几何


    基础知识

    向量

    概念:有大小和方向的量
    基础算法:
    (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

  • 相关阅读:
    正规矩阵(normal matrix)
    漏洞修复:在应用程序中发现不必要的 Http 响应头
    【VUE项目实战】64、CND优化ElementUI以及首页内容定制
    苹果TF签名全称TestFlight签名,需要怎么做才可以上架呢?
    在虚拟机安装JDK
    16.预处理、动态库、静态库
    大型项目中的Commit Message规范化控制实现
    JSP第三篇 -----JSP浅聊JSTL标签库
    【C#】C# IO类路径合并、本地路径、拼接路径Path.Combine
    白银期货开户交割规则有哪些?
  • 原文地址:https://www.cnblogs.com/linyihdfj/p/16342023.html