判断点在凸包内
主要介绍二分法^l1
二分法
如图,
可以通过向量叉积得到任意 V0Vi 和 V0P 的左右关系。
先通过 V0V1 和 V0Vn−1 排除 P 在灰色区域的情况。
显然通过二分,就能找到 V0Vi 使得 V0P 在 V0Vi 和 V0Vi+1 之间
接下来只需要判断 ViP 是否在 ViVi+1 左侧即可(假定凸包以逆时针方向给出)。
Code
其他方法
判断内角和 360 ,射线相交……
凸包极值点
即一个凸包在某一个向量 u 方向上投影的极值点。^l2
对于任意向量 v ,可以通过 v⋅u 的正负性判断 v 在 u 投影的方向。
二分法
分类讨论:
Code
注意 r 初值为 n 。
点到凸包的切线
容易发现,点到凸包的切线实际上就是凸包上各个点到某个点极角的极值,只要能得到两个点 Vi 和 Vj 关于点 P 的“上下关系”,那么就可以套用凸包极值点的二分策略。
显然只要用 PVi×PVj 的正负性判断就行了。
Code
在凸包极值点代码的基础上修改:
改成叉积:
改变判定方式: