在圆形集合上找到最短路径

时间:2013-12-18 13:21:38

标签: javascript jquery animation

我不知道我的问题是否完全可以理解。通常情况如下:

我有一个交互式演示文稿,可以绘制静态图像,从而创建动画。单击“播放”按钮时 - 动画逐帧进行 - 1 - 72,当达到72时,n + 1帧将为 - 1.现在,客户端希望有4个附加按钮,这些按钮将动画播放到某些帧最短路 - 特别是第1,18,36,54帧(总共72个)。

诀窍是找到动画的最短路径 - 它应该是正确的(delta == 1)还是左(delta == -1)。

我已经弄清楚了这个问题 - 函数PlayShortest是关键。 =Fiddle=

我尝试了很多东西 - 开关,路线比较(目标 - 当前VS maxFrames - 目标+当前),似乎没有任何东西可以完全正常工作(至少有一条路径不能计算最佳路线)。

该功能的当前版本看起来像这样(我知道 - 这是垃圾,但我很绝望):

function PlayShortest(toFrame){
    var delta = 1;
    var diff = Math.abs(toFrame - currentFrame);

    switch(toFrame){
        case 1:
        case 18:
        case 36:
            if(diff < 36)
                delta = -1;
            break;

        case 54:
            if(diff >= 36)
                delta = -1;
            break;
    }

    Play(toFrame, delta);
}

如果你们中的任何人都能解决这个问题,那么你将成为我的英雄:)

3 个答案:

答案 0 :(得分:1)

也许你可以计算两个方向的旅行费用并进行比较:

var maxFrames = 72;
var pmin = Math.min(currentFrame, toFrame);
var pmax = Math.max(currentFrame, toFrame);
var costForward = pmax - pmin;
var costBackward = pmin + (maxFrames - pmax);
if(costForward <= costBackward) {
  delta = 1;
}else{
  delta = -1;
}

答案 1 :(得分:1)

function PlayShortest(toFrame){
    var delta = 1;
    var diff = currentFrame - toFrame;

    if (diff < -36)
        delta = -1;
    if (diff > 0 && diff < 36)
        delta = -1;

    Play(toFrame, delta);
}

虽然最好使用maxFrames / 2而不是36,但如果帧数发生变化。

答案 2 :(得分:0)

所以如果我完全理解你,你只想知道最短路的方向。因此,您需要先计算“toFrame”和“currentFrame”之间的最短路径。

var maxValue = 72;
var delta = 1;

// Going directly and not over the maximum frame 
// would be simply the difference between them  |...1++++2..|
var directWay = Math.abs(currentFrame - toFrame);

// The other way is the path from the bigger frame
// to the max frame plus the smaller frame  |+++1....2++|
var overMaxWay = currentFrame > toFrame ? (maxValue - currentFrame) + toFrame : (maxValue - toFrame) + currentFrame;

现在你知道哪条路更短,可以计算方向。

// We set delta initially to 1 so you only need to change it, if you
// want to go left, i.e. if the directWay is shorter and the currentFrame 
// bigger than the toFrame |.....2<<<1...| or the overMaxWay is shorter
// and the currentFrame smaller |<<1..........2<<|
if( (directWay < overMaxWay && currentFrame > toFrame) || (directWay > overMaxWay && currentFrame < toFrame) ){
    delta = -1;
}

这肯定不是最短的答案,但我希望它能帮助你理解,这比抄袭意大利面更重要。 ;)