C++插值记录

一、插值介绍

项目中,由于测量点太少,最少时只有几个点,而且位置不确定,不是成行列的,使用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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值