组成凸包的点有极性,叫做极点。反之,是非极点。
极点的特征是,过该点必然至少有一条直线,直线的一边为空,另一边是凸包上的所有点。
从下图可以看到,蓝色的点组成凸包,是极点。内部的青色的点是非极点。比如,p,q,r就是极点。
那如何判断当前点是否是极点呢?
根据1.1凸相关,可以知道,如果能线性表示,且系数均非负,且和为1时,即在三角形内部时,不是极点。很明显,下图的UV两点不是极点
而上图的1,2,3,4均为极点。
这就出现了第一个判断极点的算法—判断点是否在三角形内。
首先初始化所有的点都是极点。先构建三角形pqr,再找判断点s,如果s在三角形内,则s不是极点。很明显,这是个四重循环。时间复杂度O(n4)
那如何判断点在三角形内呢?用toleft测试,上图中,三角形pqr按照逆时针分为三个向量pq,qr,rs,点s在都在这三个向量的左边;如果按照顺时针,分为qp,pr,rq,那么点s都在这三个向量的右边。这说明点s在三角形内。
即,要么点均在各向量左,要么点均在各向量右。
在to-left判断时,邓老师用了海伦公式,实际上我更倾向于向量叉乘看符号,因为右手定则,能判断方向。比如sp和sq叉乘,sq和sr叉乘,sr和sp叉乘,这三个值在第三个方向上的分量如果同号,则点在三角形内。