码迷,mamicode.com
首页 > 其他好文 > 详细

等高线生成算法

时间:2014-07-19 21:07:54      阅读:422      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   width   re   c   

输入:离散的采样点坐标和高度值(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) 

输出:等高线图,如下所示

bubuko.com,布布扣

  

  

  wiki上的Marching squares算法对此有很好的说明,我也是按照wiki上面的步骤来实现这个算法的,下面对该算法的步骤进行简要说明。

输入参数:

1、点的集合(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) ;

2、高度值数组,即每条等高线表示的值,以上图为例是[0.0, 0.1, 0.2, .... 1.0]共10个区间,9个等高线值;

3、颜色数组,必须与高度值数组等长。

步骤:

1、构造矩阵

计算出输入点的x,y范围,即找到xmin, ymin, xmax, ymax,形成一个rectangle,然后拟定一个step,形成一个空的矩阵,step越小,等高线越平滑,计算速度也越慢。

2、矩阵插值

由输入点的值确定矩阵上每一个元素的值,这样一来,稀疏的输入点就变成了一个稠密的矩阵。一种简单的插值方式是:

matrix(x,y) = Sum(1/dist[i]^2 * value[i]) / Sum(1/dist[i]^2),其中dist[i]表示第i个点到(x,y)的欧式距离。

3、画等高线

到这里就可以完全按照wiki上的Marching squares来进行了。Marching squares算法把等高线绘制分成了两种情况,其一是只画线不上色,即isoLine算法,这种比较简单,不做讨论了;其二是画等高带,即isoBand算法,也就是本文采用的方法,如下说明:

对于每一个等高带,从高度数组中取出相临的两个阈值(如0.0, 0.1),从颜色数组中取一个颜色,用两个阈值把矩阵三值化成为一个只包含0,1,2的矩阵。

然后考虑矩阵中的每一个单位正方形的状态,该状态由其四个角的元素值唯一确定,共3^4 = 81种,再然后就是根据这81种情况分类讨论,分别上色了...

剧终

等高线生成算法,布布扣,bubuko.com

等高线生成算法

标签:style   blog   http   width   re   c   

原文地址:http://www.cnblogs.com/easymind223/p/3849481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!