Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的B样条递归定义#_C#_Recursion_Bspline - Fatal编程技术网

C# C语言中的B样条递归定义#

C# C语言中的B样条递归定义#,c#,recursion,bspline,C#,Recursion,Bspline,我试图在c#中实现B样条曲线的递归定义,但我做不好。以下是我所做的: 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

我试图在c#中实现B样条曲线的递归定义,但我做不好。以下是我所做的:

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;
}

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

请记住,数学和逻辑是正确的。如果将正确的术语放在大括号中,则第二个解决方案可以正常工作(解释如下)。这一行:

num2 = x - t[i] / denom2;
应改为:

num2 = (x - t[i]) / denom2;
等等。然后,结果如所需:0.125

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


请记住,这是数学和逻辑。如果将正确的术语放在大括号中,则第二个解决方案可以正常工作(解释如下)。这一行:

num2 = x - t[i] / denom2;
应改为:

num2 = (x - t[i]) / denom2;
等等。然后,结果如所需:0.125

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


非常感谢,我从来没有想过!我同时编辑了我的原始问题,但你的解决方案很好!也许它毕竟没有被整理出来:D我使用了你对上面递归函数的解决方案,我用0得到了正确的结果。请参阅stakx的注释。也许这些条件并不总是得到正确的满足。x>1是一个允许的输入吗?我已经读过那个评论,这应该不是问题所在。x>1当然是允许的输入,但是递归定义应该产生0。也许我混淆了一些索引,但就我的一生而言,我无法找出错误所在,也无法在c#中找到实现,尽管这是一个非常著名的定义。您是否手动评估了x>1的结果?你是从哪里得到函数的定义的?您的一些术语/索引与英文维基百科文章中给出的B样条曲线的定义不同。非常感谢,我从来没有想到过这一点!我同时编辑了我的原始问题,但你的解决方案很好!也许它毕竟没有被整理出来:D我使用了你对上面递归函数的解决方案,我用0得到了正确的结果。请参阅stakx的注释。也许这些条件并不总是得到正确的满足。x>1是一个允许的输入吗?我已经读过那个评论,这应该不是问题所在。x>1当然是允许的输入,但是递归定义应该产生0。也许我混淆了一些索引,但就我的一生而言,我无法找出错误所在,也无法在c#中找到实现,尽管这是一个非常著名的定义。您是否手动评估了x>1的结果?你是从哪里得到函数的定义的?您的一些术语/索引与英文维基百科文章中给出的B样条浮点等式比较的定义不同(
denom1==0
denom2==0
),因为有轻微的舍入错误。即使当您认为一个数字应该是0时,您能否确保没有算术运算(例如减法除法运算符)引入微小的舍入误差?浮点相等比较(
denom1==0
denom2==0
),因为例如轻微的舍入误差。即使你认为一个数字应该是0,你能确定没有算术运算(例如减法除法运算符)引入微小的舍入误差吗?