第二章多边形
代码表示
struct Polygon{vector<Point> p;}
//逆时针表示端点
面积
可以选定任意一点O与多边形的顶点 P P P相连
S = ∣ ∣ ∑ i = 0 n − 1 o p i ⃗ × o p ⃗ ( i + 1 ) m o d n ∣ ∣ S=||\sum_{i=0}^{n-1}\vec {op_i}\times\vec {op}_{(i+1) mod~n}|| S=∣∣∑i=0n−1opi×op(i+1)mod n∣∣
特别的是,当点o位于多边形外时同样成立
由图可见,蓝色部分与红色部分得到的结果符号不同,红色部分被蓝色部分全部覆盖。
因此,结论同样成立。
判断点是否在多边形内
光线投射法
从点A向任意方向做射线
- 该射线与多边形有奇数个交点,点在多边形内
- 该射线与多边形有偶数个交点,点在多边形外
但是,当射线与顶点相交时,无法判断,因此需要特判顶点
当交点为顶点时,只需将点上移,即可符合该结论。
回转法
对于一个多边形,我们只需计算逆时针计算相邻夹角的角度和。
- 当角度和为0,则点在多边形外(同“面积”部分的第二个图所示
- 当角度和为180度,则点在多边形内(同“面积”部分的第一个图所示
但是,该方法需要使用反三角函数,会存在精度问题
光线投射法的推广(无精度问题
以需要判断的点为顶点,任意画一条射线
- 若线段逆时针穿过射线, w n + 1 wn+1 wn+1
- 若线段顺时针穿过射线, w n − 1 wn-1 wn−1
当 w n wn wn为0时,点在多边形外,否则在多边形内。(逆时针与顺时针可交换
注意
以上方法都需要先特判点是否在多边形上
代码和习题后续补充