工作需要判断某个坐标点是否在一系列点所围成的多边形内,使用MOFEI_BIQIGU博主的射线穿透算法,发现一些情况下明明坐标就在范围内,但检测方法的判断结果是false,网上也找不到同样提问或者解答。水平有限浅学一点博主皮毛后,发现坐标点的顺序会影响判断结果,在这里补充下围点的条件:围点列表中相邻项必须按照多边形相邻点来放置,顺时针/逆时针均可。
举个例子,受测点t(6,3),需要判断是否位于a(5,2)、b(8,2)、c(5,4)、d(8,4)所形成的多边形中,如图所示,结果是true:
根据博主的算法, 使用pointList中的顺序,将相邻两点的连接,再检测射线是否穿透该点。但如果pointList相邻两点不是围点,则该线段不应用于检测射线穿透。射线应该与围点所形成的多边形的边线相检测是否相交。
证明方式:根据图1,若pointList的顺序为a、b、c、d的错误顺序(b、c不是相邻点),则算法判断结果为false,与实际不符:
正确检测方式,调用前必须对pointList正确排序,例如使用a、b、d、c的逆时针围点排序,再进行调用,则相连线均为边线,方法执行结果正确: