运用射线法计算点是否落在多边形内。
红点是要计算的点,通过该点引一条水平线,计算多边形各边与该水平线的交点(蓝点),如果红点两侧的射线与多边形各边的交点数都是奇数,那么红点在多边形内,反之不在。
计算红点引出的水平射线与多边形的边有无交点,可以简化为与线段有无交点。
如图:
计算红点引出的射线与蓝线段是否相交,即红点引出的射线与蓝线段的焦点(A,y)是否在蓝线段上,而非蓝线段两头的引线上。
即y值在yi和yi+1之间,并且A值在xi和xi+1之间。
根据几何函数关系可知:(yi-y)/(yi-yi+1)=(A-xi)/(xi+1-xi),求得A=( y -yi)/( yi+1-yi)* (xi+1-xi)+ xi
代码思想如下:
- 先判断y值是否在yi和yi+1之间。
- 然后判断A值是否在xi和xi+1之间
- 再判断A值大于还是小于x值,以此判断是左边交点,还是右边交点。
- 左边交点nl,右边交点nr,如果满足1和2,且A值小于x值,那么左边交点nl+1,;如果满足1和2,且A值大于x值,那么右边交点nr+1。
另注意,如图所示,从红点引出的水平线,与多边形的交点在拐点上,只能算作与一边相交。
即红点的坐标(x,y)。
xi <=x< xi+1 或xi >=x> xi+1 AND yi <=y< yi+1 或yi >=y> yi+1
即相接两边,如果交点在线段端点上,那么这个交点要么算在第一个线段上,要么算在第二个线段上,不能两个线段都算。
为了逻辑清晰,线段(i,i+1),等号=只放在i点上,这样的话,多边形每个拐点都能遍历到,且每个拐点只计算一次。