Algorithm 轮廓线到二维布尔阵列的变换算法

Algorithm 轮廓线到二维布尔阵列的变换算法,algorithm,Algorithm,我想创建二维数组,表示由轮廓(边列表)给出的几何形状。 形状总是可以分割成矩形基本体并放在网格上(就像在有方格纸的笔记本中一样)。我的目标是创建2D布尔数组,该数组表示网格,字段为:true-如果网格单元位于轮廓内(是形状的一部分),否则为false。有人知道如何做到这一点吗?我花了几个小时在这个问题上,但仍然一无所获。如果(行,列)处的单元格在其左边框上有一条边(这很容易从边列表中计算),则将left(行,列)设为true。然后: isInside是您的布尔网格。该算法完全忽略水平边,并假设形

我想创建二维数组,表示由轮廓(边列表)给出的几何形状。 形状总是可以分割成矩形基本体并放在网格上(就像在有方格纸的笔记本中一样)。我的目标是创建2D布尔数组,该数组表示网格,字段为:true-如果网格单元位于轮廓内(是形状的一部分),否则为false。有人知道如何做到这一点吗?我花了几个小时在这个问题上,但仍然一无所获。

如果(行,列)处的单元格在其左边框上有一条边(这很容易从边列表中计算),则将left(行,列)设为true。然后:

isInside
是您的布尔网格。该算法完全忽略水平边,并假设形状是闭合的(因此“内部”和“外部”具有含义)。如果形状没有闭合,那么结果就没有意义,因为没有内部和外部


这是最佳的(因为它与输出的大小成线性)。

将边放在两个排序列表中-垂直边按X排序,水平边按Y坐标排序

查找轮廓内的任何单元格-例如,最左侧边的底端附近


然后从这个单元开始。左右移动和水平移动时,检查垂直列表中的边框。上下移动时列出(使用二进制搜索)。

将网格中每个单元格的中心视为一个点,然后在多边形方法中搜索点。我不明白如何将其定义为最佳?如果我们有一个
n=1000 x 1000
的“世界”和一个
k=1 x 1
区域,那么您的
O(n)
解决方案需要
n=1M
迭代来填充一个像素?我将最优性更多地定义为
k
的函数……如果你有一个1000 x 1000的网格,那么你需要100万个步骤来输出100万个值,即使你总是输出false并且不做任何计算。是的,如果您想知道网格中仅1个点的“真”或“假”值,则它不是最佳值。但我不是这样理解这个问题的。正如我所读到的,多边形是网格的一个子集。我同意,但网格可能已经初始化,或者您可能希望按顺序绘制多个区域……如果您的意思是初始化网格一次,然后将许多小多边形绘制到同一网格,避免每次都遍历整个网格,这很简单,您只需从min(x)到max(x)对于列和行的最小值(y)到最大值(y)(当前多边形顶点坐标的最小值和最大值),而不是0…N,0…M。而不是设置true或false,或使用当前值。
for each row
    inside = false
    for each column
        if (left(row, column) == true)
            inside = !inside
        isInside[row, column] = inside