什么是一种快速的方法来实现这种骨纤毛功能。
签名如下:
public static double Calculate(UInt64 currentCounter, uint duration, uint inDuration, uint outDuration)
结果应该是当前计数器的两倍,骨化在0到1之间骨愈合速度由duration参数定义(单个愈合的节拍数)同样,上升和下降速度是通过inDUrationoutDurationinDUration+outDuration)定义的。
alt text http://img252.imageshack.us/img252/9457/graphuf.jpg
这个图的X轴当然是currentCounter

最佳答案

编辑-这里有一个新函数,它包括在outDuration和下一个inDuration之间保持1.0。注意,我已经更改了您的函数签名-输入参数现在是inDurationholdDurationoutDurationinDuration样本的函数在outDurationholdDuration之间保持为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,从index0下降到inDuration,在indexduration-outDuration之前保持在0,然后在indexduration时上升到1.0,因此它在“持续时间”样本中是周期性的。
我有段时间不明白你的评论“在输出和输入之间是1”,你不需要另一个参数来指定保持时间吗?

08-04 21:11