矢量转换轮廓区域,(边界)向一个光栅地图(素格)
-
18-09-2019 - |
题
我有地图,被切割成若干区域边界(轮廓)像国家在世界地图。每个区域具有某些表面复盖类 S (例如0水,0.03草...).边界的定义是:
- 什么价值 S 是在它的两侧(0.03在一边,0.0,在下面的示例)
- 多少分的边界是由(n=7在下面的例子),并且
- n 协调对(x, y).
这是一个例子。
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 代表离散的类别(例如草地或水),并不是值,可被平均的(即没有湿草!).
还注意到,并非所有边境被关闭循环像上面的例子。这是一个有点像国家边界:例如美国-加拿大边境不是一个封闭循环,而是有线连接起来,在每个结束其他两个边界:加拿大洋和美国的海洋"边界"。(闭环境 的确存在 尽管如此!)
任何人都可以点我到了一种算法,可以这样做?我不想要重新发明轮子!
解决方案 5
我已经解决了这个如下:
- 三月沿着每一个分段;停在一定间隔 我.
- 在每一站,放置跟踪点立即向左边和右边的段(在某些小的距离 d 自该段)。跟踪点的原因是左右S值,分别为。
- 做一个最近的邻国的插值。上各点的栅格,是因为S最近的示踪点。
这一工作,即使当有非封闭线中,例如在边缘地图。
这不是一种"完美"的分析性算法。有两个参数: 我 和 d.算法精美的作品一样长 d << 我.否则,你可以得到的不准确性(通常单素)附近段路口,特别是那些急性角度。
其他提示
一般情况下为处理这种的几何图形矢量形式可以是相当困难,特别是由于没有关于结构你需要描述的几何形状是一致的。然而,由于你刚才想要的栅格化,那么处理该问题作为一个泰森图的线段,可以更加坚固。
逼近的泰森图可以做到的图形的方式,在照片画的每条线段,作为一个四边形对使一个帐篷形状。Z-缓冲区用于使最近的四采取优先权,并因此色素的基础上取线,是接近的。这里的区别是,你会想要的颜色是多边的基础上,这边行它们,而不是其行他们表示。一个很好的纸讨论一个类似的算法是Hoff等人的 快速计算的广义泰森图使用图形硬件
3d几何将这个样子的草图有3个红黄色段和1蓝色,绿色段:
这一程序不需要你把东西放入一个封闭循环和不需要任何花式的几何图书馆。一切都是由z缓冲器,并且应当足够快的速度实时运行上的任何现代化的绘图卡片。一个改进,将使用均匀的坐标,以使该基地项目向无穷大。
我实现这个算法在Python脚本 http://www.pasteall.org/9062/python.一个有趣的警告是,使用锥帽端的线没有工作,没有扭曲形状的锥体,因为锥体代表的终点段是z-战斗。对于该样本的几何你提供的,输出这样的:
我建议你使用了算法几何图书馆喜欢 CGAL.尤其是 第二个例子 在"2D面"的一页的参考手册应该提供你所需要的。你可以定义每一个"边界"作为一个多边和检查,如果某些要点是内部多边形。所以基本上会像
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前迭代过面列表)
- 第一,把你所有的边境进入封闭循环(可能包括边缘地图),以及识别里面的颜色。这是可能的,否则你有一个不一致,在你的数据
- 使用bresenham的算法得出所有的边界线的地图上,在一个单一的未使用的颜色
- 商店的一个列表中的所有"边界点"为你这么做
- 然后为每个边境
- 作三角测量它(德洛奈)
- 迭代过三角形,直到你找到一个其中心内部边界(点的面试)
- floodfill你的地图在这一点在境内的颜色
- 一旦你已经充满了所有内陆地区,迭代过列表的像素边界,看看哪个颜色的每个人应该是
- 选择两个未使用的颜色标记的"空"和"边境"
- 填补所有区域的与"空白"的颜色
- 绘制的所有地区的边界通过"边境"的颜色
- 迭代过点找到第一个与"空白"的颜色
- 确定哪些地区属于(谷歌"点内部多边形",可能是你需要做你的边界关闭,因为马丁DeMello建议)
- 执行洪水填充算法从这一点颜色的区域
- 去到下一个"空的"点(没有必要重新搜索-只要继续)
- 等等,直到没有"空的"点将仍然是