zoukankan      html  css  js  c++  java
  • 凸包

    凸多边形

    --整个图形在任一条边的一侧

     

    凸图形

    --任意两个内点在任一内分点也在内部

     

    凸包

    --对于一个平面点集或者一个多边形,它的凸包指的是包含它的最小凸图形或最小凸区域

    凸包的求法

      --从最左边的最低点P0开始

      --找到一个点P1,使得P0为起点的水平方向的射线到P0P1的角度最小

      --然后找下一个P2,使得P2P1到P1P0角度最小。

      --。。。。。。

      --则P0P1P2....Pm是凸包上的顶点

      --实际比较的时候,不一定要用角度来衡量

      --可以采用叉乘来判断:只要知道相对的方向(顺时针还是逆时针)就可以

        --比如判断AC1和AC2的夹角大小,只要判断AC1在AC2的右边

      --这样每次查找需要O(n)的时间复杂度

      --因此总的时间复杂度为O(n2)

    卷包裹法的特殊情况

    --多点共线的情况

      --输出包括所有共线点

      --输出不包括所有共线点

    --解决

      --如果要共线点:则共线的时候,根据与上一个凸包中的点发的距离从近到远选取

      --如果不要共线点,则从远到近选取

    Graham-Scan法

    --卷包裹法每一步都确定性的求出凸包上的一条边

    Graham-Scan算法每一步是得到一个临时的凸包

      --只要当前点在上一条边的左手方向,就加入这个点;否则回溯,直到新的点在左手方向为止

    极角序:

      --以一个内部点X为中心,点集中的所有点按关于X的极角逆时针排序,就以X点出发向右延伸,平行于X轴的一条射线为排序的起始位置

      --但是不便于计算,不能用叉乘,而需要用到三角函数

      --还要保证起点一定在凸包上,否则会出错

    Graham-Scan法序的选取

    --选取最低点中最左的一个作为参考点

    --用叉乘来排序所有点的相对位置

    --时间复杂度

      -排序O(n log n)

      -扫描O(n)

      -总的是O(n log n)

    Graham-Scan法的特殊情况

    重复点

    --删除

    共线点

    --对于不要求求共线点的情况,可以对叉乘做严格的判定

    --对于要求求共线点的情况,没有办法简单而完美的处理:

      -A、B两点没有办法都加入凸包中

    Graham-Scan法的另外一种序

    用水平序

    --先按Y坐标排

    --Y相同的按X坐标排

    2次扫描

    --先从第1个点即0开始到最后1个点即9得到右链

    --再从最后一个点即9点开始到第1个点即0,不包括已经在右链的点

     

    处理特殊情况

    --如果不要共线的点,则严格判断叉乘(即只有在左边才可以)

    --如果要共线的点,则叉乘等于0即共线也认为可以

    直观理解

       

     

     

     

     

  • 相关阅读:
    个人作业——软件产品案例分析
    项目Beta冲刺(团队)随笔集
    【Alpha】随笔集合
    个人作业——软件工程实践总结作业
    用户调查报告
    项目Beta冲刺(团队)总结
    项目Beta冲刺(团队)第七天
    项目Beta冲刺(团队)第六天
    项目Beta冲刺(团队)第五天
    项目Beta冲刺(团队)第四天
  • 原文地址:https://www.cnblogs.com/yoru/p/2706144.html
Copyright © 2011-2022 走看看