我有一张地图,按世界地图上的国家/地区按边界(轮廓)划分为多个地区。每个区域都有一定的表面覆盖等级 S (例如0表示水,0.03表示草...)。边界由以下定义:
这是一个例子。
0.0300 0.0000 7
2660607.5 6332685.5 2660565.0 6332690.5 2660541.5 6332794.5
2660621.7 6332860.5 2660673.8 6332770.5 2660669.0 6332709.5
2660607.5 6332685.5
我想制作一个栅格地图,其中每个像素的值 S 对应于像素中心所在的区域。
请注意,边框表示 S 中的步骤更改。 S 的各种值表示离散类(例如草或水),并且不是可以平均的值(即没有湿草!)。
另请注意,并非所有边框都是闭环,如上例所示。这有点像国界:例如美国和加拿大的边界不是一个封闭的环路,而是两端连接着两条其他边界的线:加拿大 - 海洋和美国 - 海洋“边界”。 (尽管如此,闭环边界do exist!)
有人能指出我能做到这一点的算法吗?我不想重新发明轮子!
答案 0 :(得分:6)
以矢量形式处理这种几何的一般情况可能非常困难,特别是因为您描述的结构没有任何要求几何是一致的。但是,由于您只想对其进行栅格化,因此将该问题视为线段的Voronoi图可以更加稳健。
通过将每个线段绘制为一对形成帐篷形状的四边形,可以在OpenGL中以图形方式完成Voronoi图的近似。 z缓冲区用于使最接近的四边形优先,从而根据最接近的线对像素着色。这里的不同之处在于,您需要根据多边形所在线的哪一侧而不是它们所代表的线来为多边形着色。讨论类似算法的好文章是Hoff等人的Fast Computation of Generalized Voronoi Diagrams Using Graphics Hardware
三维几何图形看起来像这个草图,有3个红色/黄色段和1个蓝色/绿色段:
此过程不要求您将任何内容转换为闭环,并且不需要任何花哨的几何库。一切都由z缓冲区处理,并且应该足够快,以便在任何现代图形卡上实时运行。一个改进是使用齐次坐标使基础投影到无穷大。
我在http://www.pasteall.org/9062/python的Python脚本中实现了这个算法。一个有趣的警告是,使用锥体盖住线条的末端不会扭曲锥体的形状,因为代表片段终点的锥体是z-格斗。对于您提供的样本几何,输出如下所示:
答案 1 :(得分:1)
我建议您使用像CGAL这样的几何算法库。特别是参考手册的“2D多边形”页面中的the second example应该为您提供所需的信息。您可以将每个“边框”定义为多边形,并检查某些点是否在多边形内。所以基本上它会像
for every y in raster grid
for every x in raster grid
for each defined polygon p
if point(x,y) is inside polygon p
pixel[X][Y] = inside_color[p]
我不太确定如何处理outside_color,因为外部区域会重叠,不是吗?无论如何,看看你的例子,每个外部区域都可能是水,所以你只能做最后的
if pixel[X][Y] still undefined then pixel[X][Y] = water_value
(或者,在迭代多边形列表之前,将像素[X] [Y]设置为water_value)
答案 2 :(得分:0)
答案 3 :(得分:0)
答案 4 :(得分:0)
我解决这个问题的方法如下:
即使存在非闭合线,例如在地图的边缘。
这不是一个“完美”的分析算法。有两个参数: L 和 d 。只要 d <<<<<<<<< →的。否则,您可能会在分段结点附近出现不准确(通常为单像素),尤其是那些具有锐角的结点。