gpt4 book ai didi

algorithm - 找到由相邻网格点组成的多边形的所有内部网格点

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:48:14 26 4
gpt4 key购买 nike

我有点列表(int x,int y)。它们一起形成区域,我检查该区域是否封闭,然后我需要获得由该区域内的所有仓位形成的内部区域。

示例区域:

enter image description here

我唯一的想法是将这个区域转换为矢量并检查每个点是否在多边形内,计算多边形的交点轴的点。

但我认为这不是最有效的方法。

另一个想法是首先获取所有在外面的点,我从角开始(如果角不是点列表的一部分,那么它是 100% 空的),添加所有空的相邻点并重复。那么所有不在外部且不在突出显示列表中的点都在内部。

但又觉得有点麻烦...

最佳答案

要找到网格多边形的所有内部网格点,可以利用这些观察结果:

  1. 对于每个内部网格点 (x,y),(x,y+0.5) 和 (x,y-0.5) 也是内部点。
  2. y=n+0.5 定义的线与网格多边形有简单的交点

这导致了以下算法:

  1. 作为先决条件,需要所有非水平(即垂直和对角线)多边形边,实际上每个(第二)中间行的中心 x 坐标按升序排列。

  2. 在每一秒的水平“中线”处扫描网格,即 y=2n+0.5,其中 n 来自足够的整数范围 s.t.多边形被“覆盖”,请参见图中的蓝线。

  3. 从左边开始,要检测与多边形的所有交点(即非水平边)和形式 (m,2n+0.5) 的所有内部点,请参见红色和绿色圆圈(这是通过迭代边缘中心的 x 坐标)
  4. 现在内部点(m,2n+0.5)的垂直网格邻居(m,2n)和(m,2n+1)是内部点,如果不在边界上,看scetch中的绿色点.

AlgoScetch_innerPoints

这是一些伪代码(受 C++/python 启发:-)):

list<Point> polygon; // given polygon as list of neighbouring grid points

// get centers of non-horizontal edges organized by line
map<int, set<float> > edgeCentersX; // for each scan line the x-coords of edges in ascending order

p_i = polygon[0]
yMin, yMax = 999999, -999999
for (i=1; i<polygon.size(); ++i)
p_i1 = polygon[i] // next point after p_i
if (p_i.x == p_i1.x)
continue // horizontal edges can be ignored
yMin_i = min(p_i.y, p_i1.y)
if (yMin_i % 2 == 1)
continue // we only need to look at each second mid-row
if (yMin_i < yMin)
yMin = yMin_i
if (yMin_i > yMax)
yMax = yMin_i
cx = 0.5*(p_i.x+p_i1.x)
edgeCentersX[yMin_i].insert(cx) // store edge center (yMin_i+0.5, cx)
p_i = p_i1

list<Point> innerPoints
for (y=yMin; y<= yMax; y+=2)
inside = false
cx_i = edgeCentersX[y][0]
for (i=1; i<edgeCentersX[y].size(); ++i)
cx_i1 = edgeCentersX[y][i]
inside = !inside
if (!inside)
continue
for (x=floor(cx_i)+1; x<cx_i1; ++x)
pLower = Point(y,x)
if (!polygon.contains(pLower))
innerPoints.append(pLower)
pUpper = Point(y+1,x)
if (!polygon.contains(pUpper))
innerPoints.append(pUpper)

关于algorithm - 找到由相邻网格点组成的多边形的所有内部网格点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14685739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com