我不知道我的问题是否完全可以理解。通常情况如下:
我有一个交互式演示文稿,可以绘制静态图像,从而创建动画。单击“播放”按钮时 - 动画逐帧进行 - 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);
}
如果你们中的任何人都能解决这个问题,那么你将成为我的英雄:)
答案 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;
}
这肯定不是最短的答案,但我希望它能帮助你理解,这比抄袭意大利面更重要。 ;)