样条之抛物线(一元三点)插值函数

它是根据给定结点上的数值,用抛物插值计算指定插值点处的函数。一元三点插值算法是一种精度更高的插值算法,使用这种方法插值出来的曲线不像线性插值算法那样在分段点的地方出现折点,显得更为平滑。但它是使用二次函数来进行曲线的拟合,曲线中还是会有不平滑的情况。

关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html

核心代码:

//////////////////////////////////////////////////////////////////////
// 一元三点等距插值
//////////////////////////////////////////////////////////////////////
static float GetValueParabolic(const void* valuesPtr, int stride, int n, float t)
{
    int i,j,k,m;
    float z,s,xi,xj;

    // 初值
    z=0.0;

    // 特例处理
    if (n < 1)
    {
        return(z);
    }
    if (n == 1)
    {
        z = YfGetFloatValue(valuesPtr, stride, 0);
        return(z);
    }
    if (n == 2)
    {
        float y0 = YfGetFloatValue(valuesPtr, stride, 0);
        float y1 = YfGetFloatValue(valuesPtr, stride, 1);
        z = y0 + (y1 - y0)*t;
        return(z);
    }

    float xStep = 1.0f/(n - 1);

    // 开始插值
    if (t <= xStep)
    {
        k = 0;
        m = 2;
    }
    else if (t >= (n-3)*xStep)
    {
        k = n-3;
        m = n-1;
    }
    else
    {
        i = (int)(t/xStep)+1;

        if (fabs(t-i*xStep) >= fabs(t-(i-1)*xStep))
        {
            k = i-2;
            m = i;
        }
        else
        {
            k = i-1;
            m = i+1;
        }
    }

    z = 0.0f;
    for (i = k; i <= m; i++)
    {
        s = 1.0f;
        xi = i*xStep;

        for (j = k; j <= m; j++)
        {
            if (j != i)
            {
                xj = j*xStep;
                // 抛物线插值公式
                s = s*(t-xj)/(xi-xj);
            }
        }

        z = z + s*YfGetFloatValue(valuesPtr, stride, i);
    }

    return(z);
}

切图:

相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip

……

时间: 2025-01-04 06:32:19

样条之抛物线(一元三点)插值函数的相关文章

插值与样条

先讲些题外话,前几天国庆回老家,在家中翻出了十年前大学时的一些教材课本,翻了几本看了看竟然如此的陌生.想当年考试前那么地刻苦学习,拼了命地上自——到如今变成了一场空,真令人唏嘘.其中有一本教材是<数值分析>,这门课也是挺难的,至少现在让我看是完全看不懂了.而<数值分析>一开始就是讲插值的,可以说插值是这门课的基础. 在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近

OpenCASCADE Conic to BSpline Curves-Parabola

OpenCASCADE Conic to BSpline Curves-Parabola [email protected] Abstract. Rational Bezier Curve can represent conic curves such as circle, ellipse, hyperbola, .etc. But how to convert a conic curve to BSpline curve is still question, i.e. Represent a

SVG Path高级教程

课程分为四个方面: 1. Path概述 2. 移动和直线命令 3. 弧线命令 4. 贝塞尔曲线命令 Path概述 <path> 标签用来定义路径,Path字符串是由命令及其参数组组成的字符串,是非常强大的绘图工具. 例如: <path  d="M0,0L10,20C30-10,40,20,100,100"  stroke="red"> 命令汇总 命令 含义 M/m (x,y) 移动当前位置 L/l (x,y) 从当前位置绘制线段到指定位置

[LeetCode] Sort Transformed Array 变换数组排序

Given a sorted array of integers nums and integer values a, b and c. Apply a function of the form f(x) = ax2 + bx + c to each element x in the array. The returned array must be in sorted order. Expected time complexity: O(n) Example: nums = [-4, -2,

突击优化算法!

Matlab语言可以与C/C++语言转换或调用. Matlab语句:load name 把name中文件的所有变量载入到工作空间中.save name 保存工作空间的变量到name.mat中. cholesky分解把一个正定矩阵分为一个下三角矩阵和它转置矩阵的乘积. 两种创立符号函数的方法:sym函数与syms函数,sym函数一次只能生成一个变量,syms能生成多个变量. 常用的符号运算:极值,级数求和,微积分,解微分方程. plot3函数:绘制三维图像,mesh绘制三维网格曲面,surf绘制三

C++ 流程控制篇

我们知道每个程序都有它的一套流程结构,而一个经典的程序更是离不开流程控制.这节我来讲解流程控制的各种结构. 结构按一定的顺序执行的叫顺序结构如下所示,直到程序执行完毕退出. , 语句1 语句2 语句3 ... return 0语句  选择结构 (1)if ~ else     条件语句 (2)switch      多分支选择开关语句 (3)for         循环语句 (4)while       循环语句 (5)do ~ while   循环语句 (6)continue     结束执行

[线代笔记]第一章 线性方程组解法

第一章 线性方程组解法 代数学起源于解方程(代数方程) 一元一次.一元二次.一元三次.一元四次都有求根公式(通过系数进行有限次加.减.乘.除.乘方.开方得到解),一元五次以上方程就不再有求根公式了(近世代数) 二元一次方程组.三元一次方程组.…….n元一次方程组(线性代数研究对象) 高等代数——线性代数+多项式理论 1. 线性方程组的同解变形.线性组合.初等变换.消去法 例1 同解变形:用3种同解变形必可化方程组为阶梯型 交换两个方程位置 用非0的数c乘某个方程两边 用某个方程的k倍加到另一个方

【抽象代数】 01 - 数学的“倚天剑”

在一般人的印象中,数学就是用来计算的,这种说法笼统讲也没有错,因为大部分的数学应用都是为了得到某个值.但如果深入到数学对象这个角度,计算有时并不是主角.最简单的例子就是大家熟悉的平面几何,它很多时候只是在研究点线之间的"关系".代数学刚开始被用作计算的符号表示,但随着其使用范围的扩大,人们发现它还可以表示各种各样的"关系".在集合论中,我们已经看到过"关系"的精确定义,那么这里我开始对它的深入讨论."关系"存在于非常多的应用模

湮没在先秦的【文士道】精神

道墨结合:道借墨之行,墨享道之思.(下) [思想]湮没在先秦的[文士道]精神--                         士道:做一个独立声音型知性贵族(时代的紧迫需要) 结尾我们来简单介绍一下我个人对[文士道]的肤浅理解. 1:什么是士?什么是士道? 士,是指古代职业政治家.士是由一些秉承思想贵族精神的知识分子组成.现代社会即使也存在着职业政治家,但是其意境与气度以及气节不可同日语.这就是仕人与士人的微妙区别--士人是狼独立而自由:仕人是犬傍依于屋檐. 士道,则是士人的人格理想与行为规