1. 从如何求点在四边形中开始。
设有一四边形为ABCD,一点P,求四边形和P的位置关系。很明显可以推广到多边形。。。
网上一般的算法是根据叉乘来做的,感觉叉乘太好用了qwq
首先定义四个向量
可以这么理解,如果是两个向量头和头相连,如果角度>180°的话,那么这两个向量的叉乘是一个小于0的数字。
如果像这样的情况的话,旋转一圈,B和C的夹角都大于180°了,那么这个P点肯定在这个多边形的外边。

点在多边形外的情况

点在多边形内的情况
如果一开始的方向就是相反的话,那就整个符号都是相反的。需要保证四个向量的叉乘是同号的(一定要保证每个都同号)。
但是如果不是凸多边形,或者这个顺序是瞎给的怎么办呢?那么我们就改题目吧……找这个凸包怎么找?
算法是这样的:先找到一个顶点,比如最下的顶点。然后以这个顶点为基准,求到其他点的向量。

构造一个栈,把每个点按照y坐标的顺序排序,把前两个点放入栈中,计算栈顶两个点与该点三点向量是否是逆时针转动(第一步肯定是的)。
比如第一步栈中就是P,A,B三个点。PA和PB肯定是逆时针小于180度的。栈中元素为P,A,B
然后第二步,比较A,B,C三个点,AB和BC就不是逆时针小于180度了,扔掉B这个点。C进入栈,所以现在栈中元素为P,A,C
第三步。D入栈,比较A,C,D三个点,是逆时针小于180度,现在是栈中元素为P,A,C,D。
第四步,E入栈,比较C,D,E三个点,是逆时针小于180度,现在的栈中结果是P,A,C,D,E。
第五步,所有的点遍历完毕,算法结束。
输出:凸包为:P,A,C,D,E(当然用栈逆序打印也可以)