C# C语言中的B样条递归定义#
我试图在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
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,你能确定没有算术运算(例如减法除法运算符)引入微小的舍入误差吗?