迭代任意形状的点

Iterate through points in an arbitrary shape

本文关键字:任意形 迭代      更新时间:2023-10-16

我有一个多点multimap<int,int>包围(无间隙)任意形状(具体为土地面积)。如何遍历任意形状中包含的所有点?

我知道multimap不足以确定内部点,因此我有一个额外的点,它在形状的内部(确定形状的内部和外部)。

进一步说明:这些点是按x方向排序的,因为multimap是一个排序容器。所有的点都位于一个网格中,因为我使用的是位图。

  1. 如果你的点相距超过1个像素,那么按x坐标排序的点将不会很有帮助。对它们进行排序,使应该连接的点彼此相邻。

  2. 在点之间画线

  3. 找到一个点的内部和洪水填充形状。如果你自己实现它,你需要遍历形状内的每个像素

对于一个点是否在一个形状的内部/外部的一个测试是想象一条从该点到已知在该形状外部的点的射线。计算光线穿过边界的次数,如果这个数字是奇数,那么这个点在形状内,如果是偶数,那么这个点在形状外。参见多边形中点的光线投射算法。

在你的情况下,它将是最容易采取垂直射线具有相同的x值作为你的测试点,(x0,y0)说。设(x0,y1)为形状边界框外的某个点。简单地计算multimap中具有相同x值的点的数量。如果是奇数你在里面,如果是偶数你在外面。

上面假设了一些关于你的形状边界的细节:形状的完整边界被包括在内,所以如果形状与边缘的图像点在边缘上被包括在multimap中,你也没有两个相邻的点,所以(x,y),和(x,y+1)都不在multimap中。