需要多少堆栈才能实现 De Casteljau 算法的迭代版本?
How many stacks are required to implement the iterative version of De Casteljau's algorithm?
我想只有 1 个堆栈是不够的,因为以下逻辑对我来说不太可行:
De-Casteljau 算法
Everything can be done with a stack.
De Casteljau 算法是一种迭代算法,可替代:
{a,b,c,d,...,z}
与:
{a'=lerp(a,b), b'=lerp(b,c), c'=lerp(c,d), ..., y'=lerp(y,z)}
和 运行 减少直到只剩下一个值。
使用堆栈,我们获取两个底部堆栈元素,对它们进行 lerp(基于某个比率值),然后用结果值覆盖底部元素。我们向上移动一个位置,然后重复,移动并重复,移动并重复,直到我们到达堆栈的顶部。然后我们丢弃最顶层的元素。为了找到最后一点,我们 运行 该算法直到堆栈大小为 1。
所以,在伪代码中:
reduceOnce(stack, ratio):
n = stack.length
for(i = 0 to n-1):
stack[i] = (1-ratio) * stack[i] + ratio * stack[i+1]
stack.pop()
stackReduce(stack, ratio):
while(stack size > 1):
reduceOnce(stack, ratio)
完成:需要一堆。
我想只有 1 个堆栈是不够的,因为以下逻辑对我来说不太可行:
De-Casteljau 算法
Everything can be done with a stack.
De Casteljau 算法是一种迭代算法,可替代:
{a,b,c,d,...,z}
与:
{a'=lerp(a,b), b'=lerp(b,c), c'=lerp(c,d), ..., y'=lerp(y,z)}
和 运行 减少直到只剩下一个值。
使用堆栈,我们获取两个底部堆栈元素,对它们进行 lerp(基于某个比率值),然后用结果值覆盖底部元素。我们向上移动一个位置,然后重复,移动并重复,移动并重复,直到我们到达堆栈的顶部。然后我们丢弃最顶层的元素。为了找到最后一点,我们 运行 该算法直到堆栈大小为 1。
所以,在伪代码中:
reduceOnce(stack, ratio):
n = stack.length
for(i = 0 to n-1):
stack[i] = (1-ratio) * stack[i] + ratio * stack[i+1]
stack.pop()
stackReduce(stack, ratio):
while(stack size > 1):
reduceOnce(stack, ratio)
完成:需要一堆。