只适用于简单多边形(没有自相交点)。从P点开始的射线穿过多边形边界次数,多边形的边界将多边形分为内部和外部。若是是偶数在多边形外部,不然奇数在多边形内部。以下图所示Pin为内部点,Qout为外部点,n为经过边界次数。测试
另若是射线通过顶点的时候,一个标准的预约是在左边界或下边界的点认定多边形内部,在右边界或上边界的点认为在多边形外部。例如两个不一样多边形共享一个公共边,那么在这条边上点会在一个多边形内部而在另外一个多边形外部。这样能够避免了在计算机图形显示中会出现的一些问题。.net
穿越规则测试规则:blog
1. 方向向上的边包括其开始点,不包括其终止点。get
2.方向向下的边不包括其开始点,包括其终止点。it
3.水平边不参与穿越测试(前提是选择水平的、向点P右边延伸的射线)。方法
4.射线和多边形的边焦点必须严格在P点右侧(规定了多边形右边边界上的点在多边形外部,在左边边界上的点在多边形内部)。im
知足以上规则计算2个线段是否相交。img
转角法很是简单:按照多边形顶点逆时针顺序,从P点到顶点Vi分别作连线,其中αi为Vi和Vi+1之间的夹角。若是α角度逆时针为正,顺时针为负,这样全部到顶点作连线之间夹角和为(环绕数)0,这点P在多边形外部,不然在内部。计算机
如上图所示P点到各个顶点连线夹角和为0,即P在多边形外部。co
如上图所示,角度之和 > 0 为在多边形内部。
环绕数推导公式 wn = 1/2π(α0 + α1 + ...... + αi) i ∈[0, n-1] 推导 wn = 1/2π(PVi*PVi+1/|PVi||PVi+1|) i ∈ [0, n-1]。该公式arccos比较耗时。
另两种判断方法:
1. 从P点向右作射线R,若是边从射线R下方跨到上方,那么穿越+1,若是从上方跨到下方,则是-1。最终和为wn环绕数。以下图所示:
2. 这种方法没必要去计算射线和边的交点,但须要判断点P是否在边的左边,但对于方向向上和向下的边的判断与是否在左边规则不一样。对于方向向上的边,若是穿过设想到达P的右边,那么P是在边的左侧;方向向下的边若是穿越射线的正方向,那么P在边的右边(意思是说判断点P与边的关系,而不是相对坐标系内位置)。
如上图a 和图b中P点都是位于射线左侧,可是向上和向下方向的边P点位于不一样位置。
伪代码以下:须要注意的是一样须要准守射线法中一、二、4项规则。