共线凸包 极坐标排序和水平排序的抉择

博客讨论了在处理共线凸包问题时,极坐标排序的局限性,指出在需要包含共线点的情况下,应当使用水平排序。极坐标排序在不考虑共线点时有效,但当三点共线时,可能导致错误的点序。文章推荐在处理共线点的题目中采用水平排序算法。
摘要由CSDN通过智能技术生成

凸包的原理,这里就不多介绍了.

前几天做多校的时候遇到一道共线的凸包问题. 由于自己图样, 直接用极坐标排序的模板上去做,wa了一天. 

然后就到处找资料, 看别人代码,看书.  

终于知道了,凸包的 极坐标排序 无法解决共线问题.


一般凸包的极坐标排序,都是找到最左下(y首先考虑)的点后放到point[ 0 ],根据  point[ 0 ]->point[ a ] 和 point[ 0 ]->point[ b ]  叉乘的值排序 ,  最后排序结果是把point[ 0 ]  看做原点,其他的点按顺序逆时针分部的. 如果 三点共线,  那么, 按到point[ 0 ] 的距离从小到大排序.

排序如图A 为point[ 0 ], B C Q.... P D E 都是根据极坐标排序 先后找到的点.


接下来 来讲下极坐标排序的弊端(详见lrj黑书P395)  .  


极坐标摸板里看到第73行中的 while(top>0&&cross(list[stack[top-1]],list[stack[top]],list[i])<=0) top--;

不要共线的点的情况下

这一行的意义在于 如果stack 里面有两个或者以上的点.  那取stack[top-1]为中心点 .   stack[top]为a点,  list是正要入栈的点为b点.

以ABC点为例,在没去掉while()里面的=号之前,这个模板,会删去stack[top]点, 也就是B点, 这样可以选着最少的点,最后留下的是AC点

在看末尾对应的PED点, D点因为离A近,所以先入栈,当E点再入栈的时候, D点会

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值