Marching squares绘制等值线

      marching-squares 是一个生成二维轮廓的算法,当我们需要绘制等值线(例如:降雨量等值线等) 通常会使用到这个算法来先绘制一个初略的轮廓。
当然如果你如果需要绘制3d的可以使用marching cubes 算法来进行绘制。
Marching squares同时算法分为标准的四边形算法和三角形算法,但都大同小异,这里以标准算法为例。
      在绘制等值线之前,我们需要将我们的数据绘制出一张标准的网格。
(注意图中网格大小不一样是因为我用画图工具随意绘制的关系)
     生成网格的算法也很多,可以根据实际业务状况需求选择适合的算法,绘制出自己的数据矩阵图。
例如绘制降雨量等值线时,我们测量雨量的设备是零散的分布在网格内的,而且我们可以基本认定,距离测量器越近的范围内降雨量越接近,因此我们可以根据距离加权算法求出网格上所有点的值:
先求出几个网格上的点到数据点的距离,再求出a,b点的值Z
(注意网格点的划分对数据结果的影响)
      拥有网格后可以通过等值线追踪绘制出等值线,等值线可分为从边界出发到边界结束的等值线和内部封闭的等值线两种情况.追踪法的原理是首先从绘图区域边界或内部网格的边上求得一个等值点(等 值线与网格边的交点) , 然后由该点出发, 判断下一个 等值点的坐标, 直到下一个等值点落在绘图区域边界 上或与起点重合, 则对该条等值线的追踪就算完成了。由一个等值点追踪下一个等值点, 实际上是一个求网格内等值线连接的问题。
(图片来自维基百科)
通过上图的方法追踪等值线最终计算绘制出基本的等值线
     但此时等值线所取的点都是网格上的中心点,时间上在网格上的点还需要根据插值算法求出等值与网格交汇的修正坐标。
插值算法的细类也很多,简单有线性插值法:
 即
最后我们可以得出更精确的等值线轮廓
但此时都还是直线绘制的,需要通过曲线平滑算法进行曲线优化:
这是通过二阶曲线平滑算法调整后的结果
这是通过n阶曲线平滑算法调整后的结果

Leave a Reply

Your email address will not be published. Required fields are marked *