近期学习图形学,经常来回碰到一个该死的问题:如何判断点在多边形的内外关系如果用matlab,有直接的内置函数,诸如 in_polygon()之类的。但是你需要用OpenGL上实现的时候,你会发现,这个问题要复杂的多,我调研了一些已有的算法,并在最后罗列自己幼稚的代码,以供参考。
其一:射线法
从V点发出射线,与多边形相交,若交点个数为偶数,V点在外边,反之则不在。这个很好理解,看看下边的图,就可以明白。需要考虑的是特殊情况,比如改点在边界上,或是画出的射线与图形相切之类的。大家就自己想想吧。
其二:累计角度法:
从V点向多边形P顶点发出射线,形成有向角计算有向角之和。此法也算是简单,看起来也抽象,但是顶点数多的时候,计算就很麻烦。而且误差积累较高。
具体算法可以参考:
笔者也做了一种近似的算法,对于精度要求不太高的,还是值得一试的。
其具体想法如下:
对多边形上的点进行均匀采样,然后做出极坐标。然后对任意一个点,判断其与所有射线的夹角。选择夹角最小的射线,最为其方向,然后比较到原点的距离,如果小于该射线的长度,则证明在多边形内,否则 不在。