算法5A----计算几何

算法5A----计算几何

某个点是否在三角形内

  • 正确且简洁

  • 一种解法,发射射线,穿过次数是奇数次,但是求交过程是很复杂的

  • 分而治之和减而治之都是reduction 简化或减化

    • 三角形是最简单的多边形了

    • 转换成3个问题

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jgf5927Z-1602634390559)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014064923548.png)]

    • 某一条边左右延长,注意是射线,分别是pq,qr,rp,分成两个半平面,点必须在它的左半平面

    • 其余两条同样如此

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPHqNqiG-1602634390560)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014065309419.png)]

    • 为什么只用判断3边的结果是相等的?

    • ccw的控制模式导致的是+++,反过来是cw(顺时针),结果是—

怎么判断一个点在某条射线的左侧

  • 通过叉积算面积,由于有正负,所以可以区分,海伦公式
  • 行列式
    • 正3条对角线的乘积-反三条对角线的乘积 得到的是平行四边形的面积,除以2就是三角形的面积

两条线段怎么判断相交

  • 4个坐标
  • 所谓的思维方式要循序渐进,要一环扣一环
  • 异或操作 XOR 各有一个才是true ^
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CDmukCJ-1602634390561)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014070840758.png)]

位置判断

  • 两条平行直线确定的条带
    • 切割成很多梯形
    • 任意给一个点,在哪个梯形中
  • 两条正交的有向射线(射线上有一系列点)
    • 任意给一个点,在哪个四边形中

凸包

demo

  • 桌子上有很多钉子
  • 用一个橡皮筋撑开包住所有点,松开,就可以把其他钉子都包在里面
  • 构成了一个convex hull 即凸包
  • 二分类
    • 与橡皮筋接触的是蓝色 extreme points 极点,这样的点存在一条经过它的有向射线,所有的点都在它的一侧,另一侧是空
    • 不接触的是绿色 不具备这种分割属性 进一步就是存在三个点,可以把这个点包住,但是算法复杂度是O(n^4)
  • 极边 extreme points
    • 相邻极点连接成的边,也具备所有点在极边的一侧,另一侧为空,算法复杂度是O(n^3)

Jarvis march : selectionsort

  • 选择排序,后缀有序,前缀无序
  • 每一步可以持续找到一个解

gift wrapper algorithm

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y33nGkEO-1602634390563)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014073219209.png)]

  • 从某一个极点出发,与其他所有点出发做射线,依次做toLeft测试,直到停止,这就找到了下一个与它相连的极点,

  • 上面的步骤只用遍历依次,然后外面嵌套一层遍历,总体的时间复杂度是O(n^2)的

  • 上面这个方法的前提是有第一个极点?

  • 建立坐标系,X轴最大最小,或者y轴最大最小,习惯上一般取y轴最小

  • 缺陷:有可能是两个相等的点

    • 找到最左边的点 Lowest then left -> LTL

插入排序

  • 前缀有序,后缀无序

模仿这个思路

  • 已经构成了一个凸包,加入一个点,判断是否可以继续作为极点,继续撑大这个凸包
    • 增加一个极点
    • 不是极点,不增加
    • 增加一个极点,封杀掉若干个原先的极点(原先是极点,变成非极点)

如何判断一个点是否在当前凸包的内侧还是外侧

  • 分而治之

  • 找到一个极点,找到它的前驱节点和后驱节点,分别做两条射线

  • 然后与其他极点相连,构成了若干个三角形,然后做二分查找,左边或者右边

  • 一直找到,除基准极点后,只存在一条及边时,判断点是在极边的内侧还是外侧

    • 在内侧,不增加

    • 在外侧 support/tangent

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YStRjNfV-1602634390564)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014075636521.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKz1Nchg-1602634390565)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080012933.png)]

      • 找到LL RR ,区分阴面和阳面

fruit ninja

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIxo0lhN-1602634390566)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080614212.png)]

  • 一刀切尽可能多的水果

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3Mywezs-1602634390566)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080752865.png)]

  • 如果存在最大,上端点都在切刀线之上,下端点都在切刀线之下

  • separation theorem 分割 compact 紧 unbound open (更严谨的凸包)

  • 求出上端点的凸包(点多了之后,有的点不是极点),通过最左最右极点,可以分割出下凸和上凸

  • 判断上端点凸包的下凸和下断点凸包的上凸没有交点?

你可能感兴趣的:(数据结构,算法)