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