2010-05-10 41 views
2

我有一個難以描述的數學問題,但無論如何我都會試一試。在時間線上跳過一定數量的幀

在時間軸上,我有一些幀,我想跳過一定數量的幀,它們應該沿着時間軸均勻分佈。

例如我有10幀,我想跳過5,那麼解決方案很簡單:我們跳過每一秒幀。 10/5 = 2

if (frame%2 == 0) 
    skip(); 

但如果上述分割確實導致一個浮點數什麼?

例如在44幀我想跳過15次。我如何確定應該跳過的15幀?

bascially我正在尋找一種算法,儘可能沿着44幀均勻分佈這15幀。 它可能看起來像是在2幀之後跳過,然後在3幀之後交替跳過。

謝謝!

回答

3

你可以保持一個額外的浮點值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; 
} 
+0

這通常等於將浮點數轉換爲int(通常)的結果與地板功能相同。不好的部分是行爲不總是被定義的(取決於語言和操作系統)。 – Henri 2010-05-10 10:18:59

+0

@亨利:它等於地板的t,但它不等於地板的除數。這種方法會比你的解決方案更精確。 – Unreason 2010-05-10 11:35:00

+0

簡單而高效,但我更喜歡'地板'是明確的而不是隱藏在演員陣容中;) – 2010-05-10 18:05:47

2

如果您想要跳過的幀數不是總幀數的除數,那麼您顯然可能不會總是非常均勻地執行此操作。因此,如果總是跳過至少您想要的幀數,請在分區(totalFrames/framesToSkip)上執行一次發言。

話雖如此,你可以應用你提出的相同技巧。

if (totalFrames % floor(totalFrames/framesToSkip) == 0) 
    skip(); 

注意,在44和15的情況下,你跳過遠遠超過15.其他posibility是小區的,而不是地板,在這種情況下,你不會跳過15幀,但14幀。

另一種解決方案是做四捨五入到最接近的整數,這是一個更好的近似,但是,你有時會跳過多希望有時候比希望,但平均您有更好的效果

+0

非常詳細的解決謝謝。是的,我知道我不能完全符合該部門的這個數字。這就是爲什麼我要求另一種方式來分發那些應該跳過的幀。 – clamp 2010-05-10 09:51:59

1

我掀起編寫提高了伊戈爾的解決方案,但最終我真的發現的唯一改進是,明確規定round(t)應該用來代替(int)t。所以這裏是Igor的解決方案(一些變量名稱已更改,因此它更明顯,並使用循環函數)。

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; 
} 

使用round(t)將使其成爲最公平的,並嘗試降低幀(INT)是最接近理想的丟幀(雙),同時保持完整的精密計時器(next_skip)。

夫婦的音符

  • 照顧,如果幀以0或1開始,並進行相應的調整,
  • 照顧那的frame_num不> skips_num(如果是,請確保通過更增加next_skip不是每次幀被丟棄的時間框架,否則你會停止增加next_skip並沒有更多的幀將被丟棄)