这似乎是一个很有问题的问题 - (首先听我讲!)
我创建了一个带有perlin噪声的多边形,它看起来像这样:
我需要从这个点数组生成纹理。 (我正在使用Monogame / XNA,但我认为这个问题有些不可知)。
无论如何,研究这个问题告诉我许多人使用raycasting to determine how many times a line crosses over the polygon shape(如果一次,它在里面。两次或零次,它在外面)。这是有道理的,但我想知道是否有更好的方法,因为我有所有的观点。 对我要填写的每个像素进行小型光线投射似乎过多 - 这是唯一/最佳方式吗?
如果我需要填充一个小的500px方形图像,我需要为250,000个像素进行光线投射,这看起来非常多。
答案 0 :(得分:1)
如果要对每个像素执行此操作,可以使用扫描线:
从最上面的坐标开始,从左到右检查水平光线。计算与多边形的所有交点,并按x坐标对它们进行排序。然后迭代线上的所有像素,并记住您是否进入或离开。每当遇到交叉路口时,请切换到另一侧。如果有一些像素,请设置纹理。如果没有,请忽略它。对于每条可能的水平线,从上到下执行此操作。
可以通过多种方式增强交叉点计算。例如。通过使用像网格,四叉树等的加速度数据结构,或者通过检查多边形的交叉或触摸边缘。然后,当您扫描线时,您已经知道哪些边将导致交叉。