C# 中的 B 样条递归定义

本文关键字:递归 定义 样条 中的 | 更新日期: 2023-09-27 18:36:00

我正在尝试在 c# 中实现 B-Splines 的递归定义,但我无法正确理解。这是我所做的:

public static Double RecursiveBSpline(int i, Double[] t, int order, Double x)
{
    Double result = 0;
    if (order == 0)
    {
        if (t[i] <= x && x < t[i + 1])
        {
            result = 1;
        }
        else
        {
            result = 0;
        }
    }
    else
    {
        Double denom1, denom2, num1, num2;
        denom1 = t[i + order + 1] - t[i + 1];
        denom2 = t[i + order] - t[i];
        if (denom1 == 0)
        {
            num1 = 0;
        }
        else
        {
            num1 = t[i + order + 1] - x / denom1;
        }
        if (denom2 == 0)
        {
            num2 = 0;
        }
        else
        {
            num2 = x - t[i] / denom2;
        }
        result = num1 * RecursiveBSpline(i + 1, t, order - 1, x) 
            + num2 * RecursiveBSpline(i, t, order - 1, x);
    }
    return result;
}

以下是我调用该函数的方式:

Double[] vect = new Double[] { 0, 1, 2, 3 };
MessageBox.Show(BSpline.RecursiveBSpline(0,vect,2,0.5).ToString());

我应该在屏幕上看到 0,125,而不是得到 0,25。两个分母变量用于检查它们是否等于 0,如果等于 0,则根据定义应将数字设置为 0。有人可以指出我哪里弄错了吗?

C# 中的 B 样条递归定义

请记住

,C# 中的数学和逻辑运算符具有优先顺序。如果您将正确的术语放在大括号中,则您的第二个解决方案可以正常工作(解释如下)。这一行:

num2 = x - t[i] / denom2;

应改为:

num2 = (x - t[i]) / denom2;

等等。那么结果如愿以偿:0.125

除法运算符

作为加法运算符具有更高的顺序优先级。要影响执行顺序,请使用大括号(首先将评估大括号中的所有内容):

var r1 = 2 + 2 / 2; // Step1: 2 / 2 = 1 Step2: 2 + 1 Output: 3
var r2 = (2 + 2) / 2;   // Step1: (2 + 2) = 4 Step2: 4 / 2 = 2 Output: 2