迭代任意形状的点
Iterate through points in an arbitrary shape
我有一个多点multimap<int,int>
包围(无间隙)任意形状(具体为土地面积)。如何遍历任意形状中包含的所有点?
我知道multimap不足以确定内部点,因此我有一个额外的点,它在形状的内部(确定形状的内部和外部)。
进一步说明:这些点是按x方向排序的,因为multimap是一个排序容器。所有的点都位于一个网格中,因为我使用的是位图。
-
如果你的点相距超过1个像素,那么按x坐标排序的点将不会很有帮助。对它们进行排序,使应该连接的点彼此相邻。
-
在点之间画线
-
找到一个点的内部和洪水填充形状。如果你自己实现它,你需要遍历形状内的每个像素
对于一个点是否在一个形状的内部/外部的一个测试是想象一条从该点到已知在该形状外部的点的射线。计算光线穿过边界的次数,如果这个数字是奇数,那么这个点在形状内,如果是偶数,那么这个点在形状外。参见多边形中点的光线投射算法。
在你的情况下,它将是最容易采取垂直射线具有相同的x值作为你的测试点,(x0,y0)
说。设(x0,y1)
为形状边界框外的某个点。简单地计算multimap中具有相同x值的点的数量。如果是奇数你在里面,如果是偶数你在外面。
上面假设了一些关于你的形状边界的细节:形状的完整边界被包括在内,所以如果形状与边缘的图像点在边缘上被包括在multimap中,你也没有两个相邻的点,所以(x,y)
,和(x,y+1)
都不在multimap中。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 如何在C++中获取任意 (STL) 输出迭代器的"assignable type"
- 有没有办法在一次迭代中进行任意数量的正则表达式替换
- c++中有没有免费的迭代线性系统求解器,可以让我输入任意的初始猜测
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 可变模板形参和元组迭代
- const迭代器的模板形参,而不是迭代器
- 模板类中的模板迭代器,clang不能推断模板形参
- 将任意数量的迭代器对折叠成一个新的迭代器.元编程以获得良好的语法
- 检查模板形参是否有随机访问迭代器
- 迭代任意形状的点