Algorithm 版 (精华区)

发信人: sino (茶水博士), 信区: Theory
标  题: 等值线的画法---(转)
发信站: 哈工大紫丁香 (Sun Aug 27 13:34:00 2000), 转信

发信人: beloveded (宠儿), 信区: Algorithm
发信站: 南京大学小百合站 (Wed Apr 19 22:52:00 2000), 站内信件

离散点插值方法、等值线的绘制及平滑技巧

吕勇平 戴景茹

  由于等值线图看起来非常直观、形象,因此在天气预报、气候预测分析等方面用得非
常多,已成为预报员不可缺少的工具之一。如各等压面层的位势高度图、高空环流、温度
及降水分布图等等。目前也有一些非常好的微机用绘图软件,如SUFER、GRADS等。这些软
件一般都只有DOS版,在流�
械腤INDOWS平台上,虽然可以调用,但不能使用鼠标操作,故不如使用在WINDOWS环境中开发
的软件方便。因此,许多希望在自己开发的应用程序中能方便地显示及打印各类等值线图
的人,都想知道绘制等值线图的原理方法。如何用格点资料绘制等值线图在文献〔1〕中已
有介绍,而离散点(如气�
筇ㄕ�)的资料必须通过插值才能绘制等值线图。插值的方法有几种,比如三角网插值,它是
将相邻的三个点连成一个个三角形,然后用文献〔1〕介绍的追踪法或其它方法在三角形边
上进行插值。此方法的优点是需要插的值少,插值算法简单,数据处理量少。缺点是三角网
的生成随意性很大,任�
馑母龅憧缮啥椴煌娜切�,不同的三角网插值得出的等值线也不可能完全相同。若
人为固定三角网,当有资料缺测时,就不得不重新调整三角网,因此程序的通用性不高。目
前比较流行的是通用性好的网格化方法。
  
1 离散点网格化
  理论上,离散点网格化可采用局部曲面拟合方法,用多元回归方法建立

V(X,Y)=a+bX+cY

或二次方程

V(X,Y)=a+bX+cY+dX2+eY2+fXY

所谓局部,是指采用拟合点周围一定范围的部分离散点进行拟合。这种做法虽然在许多情
况下效果不错,但通常总是有些地方与实际情况有较大出入。因此根据人工绘制等值线时
的直接内插方式,采用以下几个步骤。
1.1 定 点
  (1)根据离散点的分布范围确定整个网格的范围及网格距,网格距不宜过大或过细。
  (2)确定每个离散点属于哪一个网格,也即每个网格包含哪些离散点。
  (3)在欲插值的网格点周围一定范围内(约3~4个网格距如图1),按其4个象限各找一个
合适的离散点,剔除距离插值点最远的一个点(或其对面象限的点,使网格点处于另三点组
成的三角形之内)。若有2个象限找不到离散点,则要判别是否有已插值的格点值可替代,若
也没有已插值可替代,则
该格点暂时不插值,并记下该格点位置,留最后补插值。
 



图1 离散点网格化 

找合适点的原则:

Abs(Xi-X0)×A+Abs(Yi-Y0)×B=最小

式中:X0、Y0——为网格点坐标,
  A、B——为权重系数,(可根据其相邻象限有无离散点不断调整)。
1.2 插 值
  当某离散点与网格点距离小于0.1个网格距时,可近似作为该网格点值。
  一般情况下,先由3个点插出与纬向线相交点的2个值,最后这2个值内插出网格点上的
值。为了使内插值更准确,可以考虑所选的3个离散点各点与网格点的距离,内插时乘上权
重系数,距离越近权重系数越大。
  当4个离散点的值如图2的情况时,有可能是高中心,正常插值肯定小于这4个点的最大
值,不成为高中心,因此要根据周围离散点的值作特殊处理。
 



图2 高中心特殊处理

1.3 补 插
  将初次无法进行插值记录下来的格点,重新检查是否可插值。
1.4 外围点插值
  采用此方法插值,得到的网格点值只能在外围离散点所包的范围内。为了使插值的网
格点尽可能包围外围离散点,可以在外围采用外延的方法,将插值网格点扩大一圈。方法是
:对于任一个无插值网格点,在其周围应有8个(边线上5个)方向,任何一个方向,只要最近的
两个格点有值,则可外推
出该格点值,将8方向可能推出的两个以上的值求算术平均作为该格点的插值。
1.5 技 巧
  为方便下一步连等值线,所有格点的值不要与等值线的值相等,可对插出的格点值增减
一个非常小的值ε(如0.01)。若周围有一个格点的值比该值大,则减去ε,否则加上ε。

2 绘制等值线
  网格点资料如何绘制等值线,文献〔1〕介绍了直接追踪法, 这里介绍另一种方法。
  (1)先将每个已插值的网格点与其右边及下边两个网格点值进行比较,若满足条件

Sgn(Z(x,y)-Z0)+Sgn(Z(x+1,y)-Z0)=0

则记录一竖线段两个坐标

Sgn(Z(x,y)-Z0)+Sgn(Z(x,y+1)-Z0)=0

则记录一横线段两个坐标
  式中:Z()——格点值;
Z0——等值线的值;
Sgn( )——求正负号函数。
  即把所有格点值看成只有两值,一是大于Z0,一是小于Z0(前面插值处理使任何一格点
值不等于Z0),最后可得到若干条线段(图3)。
 



图3 两值化的等值线图

  (2)线段连接。对于某一线段X,根据其终点,顺序查找与之共点的起点或终点的线段Y
,确定他们相连关系,根据线段X两边格点值插出等值线值的位置,作为等值线的一个点坐标
并记录下来。再根据Y的终点或起点继续查找……,当再也找不到时,即为该连线的一个端
点,同样要插值确定并记�
几孟咧盏阕辍T倩毓反酉叨蝀的起点继续找,直至找到另一个端点。当等值线起点终
点属于同一个网格时,该等值线是闭合的。
  当某一线段起点终点均找不到与之相连的其它线段时,可以考虑不要该线段。当某一
线段一头与另外3个线段共点时(如图4),即
 



图4 多线段共点

  当等值线的值为10时,按顺序会记下4个线段A、B、C、D,4个线段的都有一个共同的端
点。这种情况下则应根据等值线值与4个格点值,按相互间距离最近的两个相连,另外两个
相连来处理(图中虚线)。
  (3)当组成一条折线的点少于4时,可以不要该条折线。

3 等值线的平滑
  前面连成的等值线,其实是一条条折线,当网格距足够小时(可在粗网格上插细网格),
这些折线看起来就比较平滑。但这样处理有两个缺点,一是要做很细的网格插值,但无论如
何细,曲线还是会随着图形的放大而逐渐变成了折线。二是要记录很细的格点值及等值线
,可能就要开一个很大的�
�,若要存放在磁盘上则会占用较大的磁盘容量。为节省存储空间,又要较精确地描绘曲
线,唯一的办法是增加数据处理工作量,必须从折点数据中找到一系列的函数关系,使之完
全通过这些折点。根据这些函数加密数据点画出的折线是看起来是连续而平滑的。图形越
放大,需加密数据点越多�
D壳�,采用的平滑方法有多项式拟合、样条函数、拉格郎日插值函数、斜轴抛物线平均加
权法等方法进行逐段拟合。不管是哪种方法,直接使用都可能会出现不合理的情况(图5),
解决办法是先对拟合点或自变量作些初步处理或称预处理,最后进行坐标(旋转)变换后,用
拉格郎日插值函数绘制�
交摺�
 



图5 直接插值曲线

3.1 预处理
  (1)检查闭合线
  当一条曲线的第一点与最后一点同属一个网格时,则可以认为这条线是闭合的,在最后
点之后加上第一点坐标作为最后点。
  (2)合并紧邻点
  相连的两个点距离小于0.2个网格距时,可在中间插一个点,而将这两个点取消。
  (3)将大折角减小
  当3个相邻点之间的夹角小于一定角度时,通过逐步调整3个点的Y坐标,将夹角加大(角
β减小)。可以通过多次的合并及减小折角,使得曲线逐步平滑。
3.2 配函数绘线
  加密数据点的拉氏插值函数程序如下:
  For I=1 To N:Z(I)=1:Next I
  For I=1 To N:For J=1 To N
    If I<>J Then Z(J)=Z(J)×(XX-X(I))/(X(J)-X(I))
  Next J:Next I
  YX=0:For I=1 To N:YX=YX+Z(I)×Y(I):Next I
  N是样本点数,对应数组X( )、Y( ),XX是插值X坐标,YX是插出的Y坐标。
  采用3点样本插值的具体做法是:
  (1)采用3点在第一、二点之间进行插值。
  (2)为了避免出现如图5那样的不合理插值,可采用坐标转换方式。即根据第一点与第
二点连线和第二点与第三点连线的夹角来确定新坐标旋转角度γ(图6),使角α等于角β。
  (3)在新的坐标系下进行第一、二点之间进行插值。插值步长可以根据网格距大小及
999 



图6 确定新坐标旋转角

  图的放大倍数由程序自动确定。每一个插值要还原到原坐标系下进行连线。
  (4)这样我们可用1、2、3点绘出1、2点之间曲线,2、3、4点绘出2、3点之间曲线,最
后2点的曲线,只须将最后一点与倒数第三点调换位置,调用同一个子程序便可绘出。

4 不足之处
  由于不能插出比样本离散点最大值更大或最小值更小的值,因此,当高(低)中心的离散
点的值只比等值线的值略大时,绘出的高(低)中心最内的闭合线所包围的面积比手工绘的
要小,这种情况需作进一步的改进。
 

--
※ 修改:.fib 於 Aug 27 13:31:41 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.南京大学小百合 bbs.nju.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: fib.bbs@bbs.nju.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.199毫秒