3.2 多边形的交点 [点/多边形 内/外 测试]

  一旦得到平面方程,就可以进行射线/多边形的交点。在计算射线/平面交叉后,下一步是确定交点是否在多边形内。

  有许多不同的方法可以解决这个问题。Berlin[1]很好地概述了一些技术。这里给出的方法是在[14]中提出的“射线相交”算法的一个修改版本。该算法的工作原理是,从交点处向任意方向发射一束射线,并计算相交的线段数。如果交叉的数目是奇数,则点在多边形内;其他外。这就是所谓的Jordan曲线定理。图6描述了这个定理的用法。下面提出的改进算法优雅地处理了测试光线与多边形顶点相交的特殊情况。这是我自己的发明,似乎是一个最佳的解决方案。

  以点集定义定义多边形:

    

  定义平面:

    

  定义平面的法线(非必要法线):

    

  平面与光线的交点:

    

  第一步是将多边形投射到二维平面上。在这个平面中,所有的点都由一对(U,V)指定。所以,我们想要的是每个[X Y Z]坐标都对应一个(U,V)。

  一种方法是将平面绕一些轴旋转,直到法线与其他轴平行(比如Z)。在这之后,剩下的两个轴(在这个例子中是X和Y)可以用来生成(U,V)对。该方案的缺点是必须为每个多边形生成和存储一个旋转矩阵,并且必须为每个坐标执行一个矩阵乘法。

  这些成本可以通过简单地丢弃其中一个[X Y Z]坐标并使用另外两个来消除。这个动作将多边形投射到由两个选定的坐标定义的平面上。多边形的面积没有保留,但是拓扑结构保持不变。选择扔掉哪个坐标的定义如下:扔掉相应平面方程值最大的坐标。例如,对于一个Pn=[0 -5 3]的多边形,Y坐标会被丢弃,X和Z被分配给U和V (U和V是任意的)。我们将用最大大小的坐标作为主导坐标。

   一旦多边形被投射到平面上,内外测试就相当简单了。平移多边形使交点在原点,即从每个顶点减去交点的坐标(Ui Vi)。将这些新顶点标记为(U',V')。现在想象一条射线从原点出发沿着+U轴运动。对多边形的每条边进行射线测试。如果边缘穿过光线,而不是这个事实。如果交叉的总数是奇数,则点在多边形内。这个操作如图7所示。

  

猜你喜欢

转载自www.cnblogs.com/TooYoungTsukasa/p/9235337.html