Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 跳过时间线上特定数量的帧_Algorithm_Math - Fatal编程技术网

Algorithm 跳过时间线上特定数量的帧

Algorithm 跳过时间线上特定数量的帧,algorithm,math,Algorithm,Math,我有一道数学题,这道题有点难以描述,但无论如何我都要试一试 在时间轴中,我有许多帧,其中我想跳过一定数量的帧,这些帧应该沿时间轴均匀分布 例如,我有10帧,我想跳过5帧,那么解决方法很简单:我们跳过每一帧。 10/5=2 但是如果上面的除法确实导致了一个浮点数呢 例如,在44帧中,我想跳过15次。如何确定应跳过的15帧 基本上,我正在寻找一种算法,该算法将15帧尽可能均匀地分布在44帧上。 它可能看起来像是在2帧后跳转,然后在3帧后交替跳转 谢谢 如果要跳过的帧数不是总帧数的除数,则显然不能始终

我有一道数学题,这道题有点难以描述,但无论如何我都要试一试

在时间轴中,我有许多帧,其中我想跳过一定数量的帧,这些帧应该沿时间轴均匀分布

例如,我有10帧,我想跳过5帧,那么解决方法很简单:我们跳过每一帧。 10/5=2

但是如果上面的除法确实导致了一个浮点数呢

例如,在44帧中,我想跳过15次。如何确定应跳过的15帧

基本上,我正在寻找一种算法,该算法将15帧尽可能均匀地分布在44帧上。 它可能看起来像是在2帧后跳转,然后在3帧后交替跳转


谢谢

如果要跳过的帧数不是总帧数的除数,则显然不能始终均匀地执行此操作。因此,如果始终至少跳过所需的帧数非常重要,请在分割上执行一个楼层(totalFrames/framesToSkip)

话虽如此,你还是可以用你提议的方法

if (totalFrames % floor(totalFrames/framesToSkip) == 0)
    skip();
请注意,在44和15的情况下,您跳过的远远多于15。另一个可能性是天花板而不是地板,在这种情况下,你不会跳过15帧,而是14帧


另一个解决方案是对最接近的整数进行四舍五入,这是一个更好的近似值,但是,您有时跳过的次数比希望的多,有时跳过的次数比希望的少,但平均而言,您会获得更好的结果

您可以保留一个与要跳过的下一帧对应的额外浮点值t,并在每次跳过时更新它。像这样:

int frame_num = 44; 
int skips_num = 15; 
double dt =((double)(frame_num))/skips_num;
double t = 0.0;
...
// then, in your loop
if (frame == (int)t) {  
  skip();   
  t += dt; 
}

我开始编写一个改进Igor的解决方案,但最后我真正发现的唯一改进是明确指出应该使用
round(t)
而不是
(int)t
。这是Igor的解决方案(更改了一些变量名,使其更加明显,并使用了round函数)

使用
round(t)
将使其成为最公平的,并在保持全精度计时器的同时,尝试丢弃最接近理想丢弃帧(double)的帧(int)(
next\u skip

几张纸条

  • 如果帧以0或1开头,请小心,并进行相应调整
  • 请注意,frame_num不是>skips_num(如果是,请确保每次删除帧时将
    next_skip
    增加一帧以上,否则将停止增加
    next_skip
    ,并且不会再删除更多帧)

我突然想到,将跳转与非跳转混合的问题有点像在绘制像素线时,将对角向下的步骤与笔直穿过的步骤混合的问题。线条绘制问题在

中得到了非常详细的解决,谢谢。是的,我知道我不能完全满足部门的要求。这就是为什么我要求提供另一种方法来分发那些应该跳过的帧。这通常等于地板效果,因为将浮点转换为int(通常)在功能上等于地板效果。糟糕的是,行为并不总是被定义的(取决于语言和操作系统)。@亨利:它等于定义了t,但不等于定义了除数。这种方法将比您的解决方案更精确。简单高效,尽管我更希望
地板
是明确的,而不是隐藏在演员阵容中;)
int frame_num = 44; 
int skips_num = 15; 
double dt =((double)(frame_num))/skips_num;
double t = 0.0;
...
// then, in your loop
if (frame == (int)t) {  
  skip();   
  t += dt; 
}
int frame_num = 44; 
int skips_num = 15; 
double frames_between_skips =((double)(frame_num))/skips_num;
double next_skip = 0.0;
...
// then, in your loop
if (current_frame == round(next_skip)) {  
  skip();   
  next_skip += frames_between_skips; 
}