判断一个坐标点是否在 任意给定边界顶点集的不规则多边形 内部

基本流程和思想

  1. 首先根据已知给定多边形边界顶点集求得其最小x值Xmin、最小y值Ymin、最大x值Xmax和最大y值Ymax,根据这4个值可以确定包含该不规则多边形的水平放置的最小矩形,在此前提下,输入一个任意位置的测试点(x_test,y_test),判断该点是否在矩形中,如果不在这个矩形中,那一定不被包含在多边形里,如果在矩形里,执行下一步操作进行进一步的判断。判断的逻辑也很简单:如果Xmin 判断一个坐标点是否在 任意给定边界顶点集的不规则多边形 内部_第1张图片
  2. 进一步的判断方法
    代码部分转自reference: 核心部分的代码来源
    判断一个坐标点是否在 任意给定边界顶点集的不规则多边形 内部_第2张图片

我的理解

可以看到,这段代码基于一个主要的思想:以测试点(test_x,test_y)为起始点做水平射线,,看与边界有多少个交点,如果交点的个数为奇数,则该点在多边形内,如果为偶数,则在多边形外。(边界和顶点问题暂时不考虑)。那这个思想如何用数学表达式来描述呢?涉及几个关键点
1) for循环代表的是边界点连成的线段逐段依次(顺时针或者逆时针取决于原始标记)做if中的条件判断,这里是首先最后一个点和第一个点连成的直线进入判别,然后是第一个和第二个点连成的直线,依次类推,直到遍历完所有的线段。注:输入虽然是每个顶点的坐标,但本质上是判断两个顶点连成的直线与以测试点为起始点的水平射线之间的关系。
2)if里第一个判别条件的含义:测试点的y坐标值test_y大小介于两个顶点值之间,&&前的条件才为真,这样保证了以测试点为起点的水平射线与两个顶点之间的线段有交点。
3)if里第二个判别条件本质上就是,根据两个顶点确定它们所在的直线的方程(已知两点坐标,求直线方程,可以用点斜式),然后把测试点所在的水平直线的方程(y=test_y)带进去,就可以求得两直线交点(如果存在,只要两个顶点y值不相等不平行即存在)的x坐标值X*,即代码中"testx <"后面那一串;testx右的水平射线与边界的相交次数,换成大于也可以,只是含义变成了统计以测试点为起始点的向的水平射线与边界的相交次数。
4)判别符号c的改变及含义:初始值为0,即否,每当一段线段满足if条件式,即与水平向右的射线相交,则将其值置反,这样就保证了在遍历完所有顶点对后,如果与测试点所在水平向右的射线相交的线段数为奇数,则c值为1,表示测试点在多边形内,反之则c为0,测试点不在多边形内。

你可能感兴趣的:(算法学习笔记)