什么是一种快速的方法来实现这种骨纤毛功能。
签名如下:public static double Calculate(UInt64 currentCounter, uint duration, uint inDuration, uint outDuration)
结果应该是当前计数器的两倍,骨化在0到1之间骨愈合速度由duration
参数定义(单个愈合的节拍数)同样,上升和下降速度是通过inDUration
和outDuration
(inDUration
+outDuration
)定义的。
alt text http://img252.imageshack.us/img252/9457/graphuf.jpg
这个图的X轴当然是currentCounter
。
最佳答案
编辑-这里有一个新函数,它包括在outDuration
和下一个inDuration
之间保持1.0。注意,我已经更改了您的函数签名-输入参数现在是inDuration
、holdDuration
和outDuration
。inDuration
样本的函数在outDuration
和holdDuration
之间保持为0,而另一个outDuration
样本的函数在holdDuration
之后保持为1.0坡道又是半汉恩函数,你可以根据需要改变它们。
public static double Calculate(UInt64 currentCounter, uint inDuration, uint holdDuration, uint outDuration)
{
UInt64 curTime;
double ret;
curTime = currentCounter % (inDuration + 2*holdDuration + outDuration); //this wrapping should really be handled by the caller
if (curTime < inDuration)
{
ret = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * (inDuration - curTime) / (2.0 * inDuration)));
}
else if (curTime < inDuration + holdDuration)
{
ret = 0.0;
}
else if (curTime < inDuration + holdDuration + outDuration)
{
ret = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * (curTime - inDuration - holdDuration) / (2.0 * outDuration)));
}
else
{
ret = 1.0;
}
return ret;
}
这与前一版本具有相同的周期性特征。
这是一个显示函数两个循环的图测试回路是
for (ctr = 0; ctr < 20000; ctr++)
Calculate(ctr, 2500, 2250, 3000);
alt text http://img16.imageshack.us/img16/4443/oscfnxn2.png
第一版本
我是那种东西的超级粉丝。如果这是个问题的话,它是连续可微的。下面是一个简单的实现:
public static double Calculate(UInt64 currentCounter, uint duration, uint inDuration, uint outDuration)
{
UInt64 curTime;
double ret;
//should check that inDuration + outDuration <= duration
curTime = currentCounter % duration; //this wrapping should really be handled by the caller
if (curTime < inDuration)
{
ret = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * (inDuration - curTime) / (2.0 * inDuration)));
}
else if (curTime >= (duration - outDuration))
{
ret = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * (outDuration + duration - curTime) / (2.0 * outDuration)));
}
else
{
ret = 1.0;
}
return ret;
}
这是一个样本图。这是由循环生成的
for (ctr = 0; ctr < 10000; ctr++)
Calculate(ctr, 10000, 2500, 3000);
Hann function
该函数从1.0下降到0,从index
0
下降到inDuration
,在indexduration-outDuration
之前保持在0,然后在indexduration
时上升到1.0,因此它在“持续时间”样本中是周期性的。我有段时间不明白你的评论“在输出和输入之间是1”,你不需要另一个参数来指定保持时间吗?