判断一个点是否在多边形内部(PNPOLY算法)

算法文档:https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html

(该知识点是阿里模拟笔试,配送区域问题的考点)

判断一个点是否在多边形内部(PNPOLY算法)_第1张图片

(1)先判断点在不在多边形的内部,如果在的话,问题很简单(后面有过程)

(2)如果不在多边形的内部(超过配送区域)

那么计算点到多边形的所有的边的距离(直线距离),取点到所有边的最短的距离的最小值。

判断一个点是否在多边形内部(PNPOLY算法)_第2张图片

1、如果点是情况1,len就是最短的距离

2、如果投影在外围,那么最短距离就是点到顶点的距离,求配送点到每个多边形顶点的距离(取其中的最小值)

综上所述:如果在外围,我们求点到所有边的距离,和点到所有顶点的距离,然后取最小值即可。

 

 

判断点在多边形的哪里:

如果一个点在多边形的内部,那么从这个点引一条射线,那么与多边形的边的交点是奇数个,那么就在多边形的内部;如果是偶数个,那么该点在多边形的外面

c语言的核心代码

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
	 (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

 

点到直线的距离

向量的点乘:

向量的叉乘:

 

以红色点到两个蓝色点形成的线段的直线距离为例

判断一个点是否在多边形内部(PNPOLY算法)_第3张图片

 

将问题转换一下加锁 红色点坐标(x0, y0)、蓝色点坐标(x1, y1)、(x2, y2)

判断一个点是否在多边形内部(PNPOLY算法)_第4张图片

 

判断一个点是否在多边形内部(PNPOLY算法)_第5张图片


 

 

你可能感兴趣的:(面试编程题,ACMer)