基本流程和思想
- 首先根据已知给定多边形边界顶点集求得其最小x值Xmin、最小y值Ymin、最大x值Xmax和最大y值Ymax,根据这4个值可以确定包含该不规则多边形的水平放置的最小矩形,在此前提下,输入一个任意位置的测试点(x_test,y_test),判断该点是否在矩形中,如果不在这个矩形中,那一定不被包含在多边形里,如果在矩形里,执行下一步操作进行进一步的判断。判断的逻辑也很简单:如果Xmin<x_test<Xmax && Ymin<y_test<Ymax,则点(x_test,y_test)在矩形内,反之则不在。
- 进一步的判断方法
代码部分转自reference: 核心部分的代码来源
我的理解
可以看到,这段代码基于一个主要的思想:以测试点(test_x,test_y)为起始点做水平射线,,看与边界有多少个交点,如果交点的个数为奇数,则该点在多边形内,如果为偶数,则在多边形外。(边界和顶点问题暂时不考虑)。那这个思想如何用数学表达式来描述呢?涉及几个关键点:
1) for循环代表的是边界点连成的线段逐段依次(顺时针或者逆时针取决于原始标记)做if中的条件判断,这里是首先最后一个点和第一个点连成的直线进入判别,然后是第一个和第二个点连成的直线,依次类推,直到遍历完所有的线段。注:输入虽然是每