C++插值记录
一、插值介绍
项目中,由于测量点太少,最少时只有几个点,而且位置不确定,不是成行列的,使用VTK生成热力图/3D图时,图形要么显示不出来,要么显示异常,因此想到了插值,插值有好多种算法,例如:
1、IDW:距离反比(Inverse distance weighting)
2、ModifiedShepard:IDW的改进方法
3、RBF:径向基函数(RadialBasisFunction)
4、Kriging:克里金
5、NNI:自然邻点插值(NaturalNeighbor)
二、距离反比插值(效果差)
开始使用最简单的距离反比插值,但是发现数据波动较大时,插值后的图像显示不全或整体坑洼现象严重:
三、QT MinGW 32bit插值代码
之后网上找了大神的下面这个代码,有IDW、ModifiedShepard、RBF、Kriging等插值算法,在QT MinGW 32bit下可以编译通过,但是在QT5.9.2 MSVC2017 64bit编译时离谱报错,技术不到家没研究明白,就放弃了(谁能帮帮我)。
大神的链接(QT MinGW 32bit):
【Qt】绘制热度图、频谱图、地形图、colormap - miyanyan - 博客园
我又保存了防止链接失效(QT MinGW 32bit):
【免费】QTMinGW32bit下可以编译通过的插值算法,有IDW、ModifiedShepard、RBF、Kriging等插值算法资源-CSDN文库
四、QT VS2017 64bit下克里金插值(效果好)
于是从网上找了克里金插值的C++代码,VS2017下可以直接运行,我整理代码到QT VS2017 64bit下测试后效果很好,下面是2个点的时候(1个点调用克里金插值会报异常):
大神的代码链接(VS2017):
GitHub - ByteShark/Kriging: Simple and Ordinary Kriging
我备份后的代码链接(VS2017):
插值算法:VS2017下的克里金插值算法代码资源-CSDN文库
我整理后的部分代码链接:
插值算法:QT5.9.2MSVC201764bit下,距离反比、克里金插值算法资源-CSDN文库
调用方式:
void TestInterpolation()
{ //point_3D是自定义结构体QVector<point_3D> data;point_3D tmp;tmp.x_value = 5;tmp.y_value = -15;tmp.z_value = 10000.8;data.append(tmp);tmp.x_value = -35;tmp.y_value = 5;tmp.z_value = 20100.8;data.append(tmp);tmp.x_value = 35;tmp.y_value = 5;tmp.z_value = 10030.8;data.append(tmp);tmp.x_value = -35;tmp.y_value = -5;tmp.z_value = 10000.8;data.append(tmp);//插值,如果是克里金插值,输入1个点或以下时克里金插值将出现异常,至少2个点以上才可以插值QVector<point_3D> interp_points;if(data.count() >= 2){Interpolation Interp;Interp.InitPar((WaferSizeEnum)ExternParameters::m_detect_wafer_size);Interp.ComputeInterpolation(data, interp_points);}else{return;}
}