我一直在工作上的一个项目的可视化对2个维持续的数据。它是什么样的事情你可以用于研究高程数据或温度模式上的2D地图。在其核心,这是一个真正的方式的压扁3-层面纳入两个尺寸加色彩。在我的特定研究领域,我实际上不是工作地海拔高度数据,但这是一个很好的比喻,所以我会坚持它在这个职位。

无论如何,在这一点上,我有一个"持续的颜色"的呈示,我非常高兴地与:

Continuous Color Renderer

梯度为标准的颜色轮在红素表明坐标的高值和紫色素表明低价值观。

基础数据结构采用一些非常聪明(如果我做这样说自己)插算法使任意深度的缩小到详细的地图。

在这一点上,我想画一些的地形轮廓线(使用quadratic bezier的曲线),但是我没能找到任何好的文献,描述了高效率的算法找到这些曲线。

为了让你知道为什么我想,这是一个贫穷的人实施(其中渲染器只使用一个黑RGB值每当遇到一个象素交的一轮廓线):

Continuous Color with Ghetto Topo Lines

有几个问题,这种办法,但:

  • 区域图用一个陡峭的斜坡结果在薄(往往破碎)地形线。理想的情况下,所有地形的线条应该是连续的。

  • 地区图的一个平坦的斜率导致更广泛地线路(常常整个地区的黑暗,尤其是在外围的渲染地区)。

所以我在寻找一个矢量的绘图方法得到那些好的,完美的1素厚的曲线。基本结构的算法将必须包括以下步骤:

  1. 在每一个离散的海拔的地方我想要绘制地形线,找到一个设定的坐标这里的海拔在那个坐标是极其关闭(给任意epsilon值)的期望的上升。

  2. 消除冗余点。例如,如果三点是在一个完美的直线,那么该中心的一点是多余的,因为它可以消除不改变形的曲线。同样,与贝塞尔的曲线,往往是可能消除cetain锚点通过调整的位置邻近控制点。

  3. 组装剩余点进入一个序列,这样,各分段之间的两点接近高中立的轨迹,并使得没有两个线段过交叉路径。每个点-顺序必须创建一个封闭的多边形,或者必须相交的边界框渲染地区。

  4. 对于每一个顶点,找到一对控制点这种所得的曲线显示出一个最小的错误,相对于消除冗余点在第2步.

  5. 确保所有特征的地形可见,在目前呈现的规模表示,由适当的地形线。例如,如果数据包含一个高峰与高海拔,但极小径中,地形线仍然应该得出的。垂直的功能只应忽略,如果他们的特点直径小于总体呈现度的图像。

但即使在那些限制,我仍然可以想到的几个不同的启发式寻找的线:

  • 找到高点内呈现的边界。从高点,旅游下坡路沿着几个不同的轨迹。任何时间穿越线crossest高阈值,添加这一点来提升具体桶。当穿越路到达的地方最低,改变课程和旅游场所。

  • 执行高分辨率的历着的长方形边界框渲染地区。在每个海拔的阈值(以及在拐点,无论坡逆转的方向),添加那些点来提升具体桶。完成后穿越边界,开始跟踪内从边界点中的那些桶。

  • 扫描整个呈现区域,服用海拔测量在稀疏的定期间隔时间。每个测量,使用它的邻高阈值,作为一个机构来决定是否采取内插测量的邻国。使用这种技术会提供更好的保障的复盖范围跨越整个渲染地区,但这将会是难以组装所得点进入一个合理的顺序,用于建造道路。

因此,这些都是一些我的想法...

之前深入执行,我想看看是否其他任何人在计算器具的经验,这种问题和可能提供的指针为准确和有效的执行。

编辑:

我特别感兴趣的"梯度"提出的建议ellisbben.和我的核心数据结构(忽略的某些优内插快捷方式),可以表示为总结的一个组2D斯功能,这是完全可微的。

我想我需要一个数据结构来代表一个三维的坡度和一个功能用于计算这坡矢量对于在任意一点。关掉我的头顶,我不知道如何做到这一点(虽然它看来似乎应该是容易的),但是如果你有一个链接的解释,我会非常感谢!

更新:

谢谢你的出色贡献ellisbben和阿齐姆,我现在可以计算出的轮廓角度的任何任意点领域。绘制的实地行将遵循不久!

这里有更新的效果,有和无贫民窟基于光栅地形渲染,我一直在使用。每一个图像包括千随机抽样点,表示由红点。的角轮廓在这一点上是由白线。在某些情况下,没有斜率可以衡量在给定点(以上的粒度内插法),所以红点没有发生相应的角轮廓线。

享受!

(注:这些效果使用不同的表面地形图,比以前的效果--因为我随机产生的数据结构在每次迭代,而我原型--但是核心的呈现方法是相同的,所以我敢肯定你的想法。)

alt text

alt text

这是一个有趣的事实:在右手边的这些效果,你会看到一堆怪异的轮廓线的完美的水平和垂直的角度。这些都是文物的插值的过程,其使用网格的内插器数量减少计算(大约500%)有必要执行的核心渲染的操作。所有的那些奇怪的轮廓线发生之间的边界上的两个插网格单元。

幸运的是,这些文物并不实际的问题。虽然文物被检测过的斜率计算,最终绘器不会通知他们,由于它的工作在一个不同的位深度。


更新:

Aaaaaaaand,作为一个最后的放纵之前,我去睡觉,这是另一个对的效果,一个老学校的"连续的颜色"的风格,一个梯度为20,000个样本。在这组的效果,我已经消除红点点的样品,因为其不必要地扰乱的图像。

在这里,你真的可以看到这些内插文物,我前面提到的,由于格结构的内插器的收集。我应强调,这些项目将完全看不见的最终轮廓渲染(由于差异在幅度之间的任何两个相邻的内插器的细胞是不到位深度呈现的图像)。

好胃口!!

alt text

alt text

有帮助吗?

解决方案

梯度 是一种数学运算,可以帮助你。

如果你可以把你插入一个微函数,梯度的高度将始终点在该方向上的最大上升。所有曲线的相等高度的垂直渐变的高度评价在这一点上。

你的想法开始从最高点是明智的,但可能会错过的功能,如果有多于一个当地最大。

我建议

  1. 挑选高度值在这你会画线
  2. 创建一堆积在一个现,定期间隔的网格,然后步行中的每一点微小的步渐变方向最近的高度,你想画一条线
  3. 创造的曲线,通过加强每一点垂直的梯度;消除多余点,杀死一点的时候另一个曲线来得太靠近了-但是,为了避免破坏该中心的沙漏喜欢的数字,你可能需要检查之间的角度为导向的矢量垂直的梯度对于两点。(当我说为导向的,我的意思是确保这一角度之间的梯度和垂直的价值计算总是90度相同的方向。)

其他提示

交替,是的 军方 算法,这似乎是适当的问题,尽管你可能想要光滑的结果,如果你使用一个粗略的网格。

在地形曲线你想画是 等值面 标领域超过2尺寸。为等值面在3尺寸,是的 军块 算法。

在应对您的评论@埃里克森,并回答有关计算的梯度的功能。而不是计算的衍生物的300期功能,你可以做一个数字分化如下。

给点[x,y]在你的图像你可以计算出的梯度(方向的最大的体面)

g={  ( f(x+dx,y)-f(x-dx,y) )/(2*dx), 
  {  ( f(x,y+dy)-f(x,y-dy) )/(2*dy) 

其中dx和dy可能的间隔,在你的网格。轮廓线的运行垂直的梯度。因此,要获得的轮廓方向,c,我们可以乘g=[v,w]通过矩阵,=[0-1,1 0]给

c = [-w,v]

我就想像这样的东西我自己,但没有找到一个基于矢量的解决方案。

栅格为基础的解决方案并不坏,不过,尤其是如果数据栅格为基础的。如果你的数据是基于矢量太(换句话说,你的3D模型的你的表面),应该可以做一些真正的数学到找到的曲线的交叉点,与水平面在不同海拔。

栅格为基础的方法,我看看每一对邻近的像素。如果一个人是上一轮廓水平,一如下,很明显轮廓线之间运行。的伎俩我以反别的轮廓线是混合的轮廓线的颜色 像素,比他们亲近的理想化的轮廓线。

也许一些实例会有所帮助。假设目前的像素是在一个"提升"的12英尺,一个邻居是在海拔8英尺,和轮廓线的每一个10英尺。然后,有一个轮廓线的一半的方式之间;油漆目前的像素与轮廓线的颜色在50%的透明度。另一像素是11英尺,有一个邻居在6英尺。颜色的现象素在80%的透明度。

alpha = (contour - neighbor) / (current - neighbor)

不幸的是,我没有代码方便,并有可能已经有点更为它(我依稀记得看着对角的邻居过,并通过调整 sqrt(2) / 2).我希望这足以让你的要点。

它发生在我身上,你想要什么做将是很容易做到MATLAB中使用的轮廓的功能。做的东西喜欢制造低密度逼近你的轮廓,也许可以做一些相当简单处理后的轮廓。

幸运的是,GNU倍频程,MATLAB克隆,已经实现的各种轮廓绘图功能。你可以看看那个代码算法和执行,几乎可以肯定数学上的声音。或者,你可能只能够卸货处理的八度。查阅网页上 与其他语言 看到如果这会更容易些。

披露:我没有用八度非常多,我还没有实际测试它的轮廓绘图。然而,从我的经验与MATLAB,我可以说,它会给你几乎所有的东西你要在仅仅几代码行,前提是你得到你的数据进MATLAB。

此外,祝贺你作出非常VanGough式slopefield的情节。

我一直检查的地方像 http://mathworld.wolfram.com 之前要深我自己:)

也许他们 曲线 科将帮助吗?或者也许这项上 地图.

比你有什么呈现一个真正的世界的地形地图-他们看起来完全相同的给我!我不会改变任何事情...

写的数据,作为一个 恒广通的文件 (很简单的数字高程数据格式中使用通过美国地质勘探局)和使用免费和开放源码 gdal_contour 工具创建的轮廓。这非常适用于陆地地图,约束的数据点都签署了16位的数字,这符合世俗的高度范围在距离非常好,但可能不足以为你的数据,这些数据我猜不是个地图的实际地形-虽然你提了地形图。

我建议 CONREC 方法:

  • 创建一个空行段中的列表
  • 分数据纳入经常方格
  • 对于每一方格,分割方为4组件三角:
    • 对每个三角形,处理所有案件(a至j):
      • 如果一个线段的十字架的一个情况:
        • 计算出它的终点
        • 商店行段中的列表
  • 绘制每个线段在线段中的列表

如果该线是太锯齿,使用一个较小的格栅。如果该线是不够顺畅和算法是把太长,使用一个较大的网。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top