我正在尝试编写 B 样条的递归定义,但我无法编写递归,我的代码无法编译,因为我试图将“vacuous 分配给numeric”,
根据在线资源,要返回一个值,您需要省略末尾的分号。
但是这不能编译:
vardef calculate_basis(expr t, i, order)=
numeric ret;
if order=0:
index := knots[i];
if (t >= index) and (t < knots[i+1]):
label.top(textext("\huge$"& decimal(70) &"$"), (0,0));
ret := 1
else:
ret := 0
fi;
else:
(t-knots[i]) / (knots[i] + order - knots[i]) * calculate_basis(t, i, order-1) + (knots[i + order + 1] - t) / (knots[i + order + 1] - knots[i+1] * calculate_basis(t, i+1, order-1))
fi;
ret := 0
enddef;
% Start figure
beginfig(0);
make_knots(3, 7);
val = calculate_basis(0.5, 1, 0);
endfig;
但是将最后一行改为calculate_basis(0.5, 1, 0);
,即消除分配,确实可以正常运行。
我究竟做错了什么?
答案1
ret
您应该在宏的末尾添加vardef
,以便它获取变量的值ret
:
vardef calculate_basis(expr t, i, order)=
numeric ret;
if order=0:
index := knots[i];
if (t >= index) and (t < knots[i+1]):
label.top(textext("\huge$"& decimal(70) &"$"), (0,0));
ret := 1
else:
ret := 0
fi;
else:
(t-knots[i]) / (knots[i] + order - knots[i]) * calculate_basis(t, i, order-1) + (knots[i + order + 1] - t) / (knots[i + order + 1] - knots[i+1] * calculate_basis(t, i+1, order-1))
fi;
ret := 0;
ret % new line here!
enddef;