一、插值介绍
项目中,由于测量点太少,最少时只有几个点,而且位置不确定,不是成行列的,使用VTK生成热力图/3D图时,图形要么显示不出来,要么显示异常,因此想到了插值,插值有好多种算法,例如:
1、IDW:距离反比(Inverse distance weighting)
2、ModifiedShepard:IDW的改进方法
3、RBF:径向基函数(RadialBasisFunction)
4、Kriging:克里金
5、NNI:自然邻点插值(NaturalNeighbor)
二、距离反比插值(效果差)
开始使用最简单的距离反比插值,但是发现数据波动较大时,插值后的图像显示不全或整体坑洼现象严重:
三、QT MinGW 32bit插值代码
3.1之后网上找了大神的下面这个代码,有IDW、ModifiedShepard、RBF、Kriging等插值算法,在QT MinGW 32bit下可以编译通过,但是在QT5.9.2 MSVC2017 64bit编译时离谱报错(2025-06-28问题已解决,.cpp和.h文件编码的问题)。报错如下:
2025-06-28补充,通过修改.h和。cpp文件的编码格式解决上面的报错问题:
参考了下面的文章:
Qt项目中使用MinGW编译成功但MSVC失败_qt 选msvc报错-优快云博客
MSVC要求UTF-8编码的文件必须包含BOM(字节顺序标记),而MinGW无此限制。若源码保存为无BOM的UTF-8格式(Qt Creator默认如此),MSVC会将其误判为本地编码(如GBK),导致中文字符乱码或语法错误。
将源码转换为带BOM的UTF-8格式(使用Notepad++或VS Code转换,注意.pro不用变化),或在.pro文件中强制指定编码:
win32-msvc {
QMAKE_CXXFLAGS += /utf-8
}
大神的链接(QT MinGW 32bit):
【Qt】绘制热度图、频谱图、地形图、colormap - miyanyan - 博客园
我又保存了防止链接失效(QT MinGW 32bit):
【免费】QTMinGW32bit下可以编译通过的插值算法,有IDW、ModifiedShepard、RBF、Kriging等插值算法资源-优快云文库
四、QT VS2017 64bit下克里金插值(效果比较好)
于是从网上找了克里金插值的C++代码,VS2017下可以直接运行,我整理代码到QT VS2017 64bit下测试后效果很好,下面是2个点的时候(1个点调用克里金插值会报异常):
大神的代码链接(VS2017):
GitHub - ByteShark/Kriging: Simple and Ordinary Kriging
我备份后的代码链接(VS2017):
插值算法:VS2017下的克里金插值算法代码资源-优快云文库
我整理后的部分代码链接:
插值算法:QT5.9.2MSVC201764bit下,距离反比、克里金插值算法资源-优快云文库
调用方式:
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;
}
}