凸包的原理,这里就不多介绍了.
前几天做多校的时候遇到一道共线的凸包问题. 由于自己图样, 直接用极坐标排序的模板上去做,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点会