如何判断一个点是否在纹理的多边形内

How tell if a point is within a polygon for texture

这似乎是一个比较常见的问题 -(先听我说完!:)

我创建了一个带有柏林噪声的多边形,它看起来像这样:

我需要从这个点数组生成一个纹理。 (我正在使用 Monogame/XNA,但我认为这个问题有点不可知论)。

反正研究这个问题发现很多人用raycasting to determine how many times a line crosses over the polygon shape(如果有一次,就是在里面,两次或者零次,就是在外面)。这是有道理的,但我想知道是否有更好的方法,因为我掌握了所有要点。 为每个我想填充的像素做一个小的光线投射似乎过分了 - 这是 only/best 方式吗?

如果我需要填充一个 500 像素的方形小图像,我将需要对 250,000 个单独的像素进行光线投射,这看起来太多了。

如果你想对每个像素都这样做,你可以使用扫描线:

从最上面的坐标开始,从左到右检查一条水平射线。计算与多边形的所有交点,并按它们的 x 坐标对它们进行排序。然后迭代线上的所有像素并记住你是在还是在外面。每当遇到十字路口时,请切换到另一侧。如果有某个像素,则设置纹理。如果没有,请忽略它。从上到下对每条可能的水平线执行此操作。

可以通过多种方式增强交集计算。例如。通过使用像网格、四叉树等加速度数据结构,或者通过之前检查多边形的相交或接触边。然后,当你扫线的时候,你就已经知道,哪些边会导致相交。