本文函式影象使用geogebra繪製,感謝它才華橫溢的作者。
那麼這個elastic是什麼呢?
維基百科上說,elastic是對彈性體或者可伸縮纖維的口語說法,或者是指小孩子玩的跳皮筋遊戲。
下面我們就研究一下這個elastic和皮筋有什麼關係。
要研究動作的行為,就離不開它的update函式。
1這是乙個分段函式,兩端的時間點被獨立出來了。先拋開這兩點不管,我們看主要的變換**。void cceaseelasticin::update(cctime time)2 8
else
9
1415 m_pother->update(newt);
16 }
首先看到:
time = time - 1;
這其實就是做了一次以x=0.5為軸的軸對稱。
為了方便我們將time - 1記作u,m_fperiod記作p,那麼變換公式如下:
u=t-1 t∈(0,1)
s(u)=-1*2^(10u)*sin((u-p/4)*2π/p) u∈(-1,0)
s(u)=-1*2^(10u)*sin(2πu/p-π/2) u∈(-1,0)
s(u)=2^(10u)*sin(π/2-2πu/p) u∈(-1,0)
s(u)=2^(10u)*cos(2πu/p) u∈(-1,0)
大家都知道余弦函式是以2π為週期的,這裡公式中有乙個除以p的操作,這說明cos(2πu/p)的週期為p。
又因為u∈(-1,0),1/1024<2^(10u)<1,這說明2^(10u)與cos(2πu/p)相乘最多影響函式曲線的幅度,絕不會改變原來的週期。
所以s(u)的函式週期就是p。
因為這是乙個分段函式,所以可能存在的最大問題就是,在實際運動過程中,精靈的動作可能不是連續的,即(0,0)和(1,1)兩點不在函式曲線上。所以如果你希望讓精靈完美地運動,你就需要小心地選取這個週期引數。
如何選取週期引數呢?
假設我們有這樣乙個函式:
f(u)=cos(2πu/p)
我們希望它能滿足以下條件:
也就是說,我們希望點(0,f(0))落在圖中點a的位置,而點(1,f(1))落在圖中點b、c、d、e、f這樣的位置上。
條件一是時刻滿足的,我們只要針對條件二來確定p就可以了。於是我們得出等式:
2π/p=π/2+n*π n≥0
p=4/(2*n+1) n≥0
於是我們可以得出,比較合適的p的取值有:4、4/3、4/5、4/7。。。
我們選取p=4/7,繪出完整函式影象,看看是什麼樣子的。
這是一條振盪曲線,或者叫做波動曲線,它描述的是精靈運動的幅度。
用什麼來形容這個動作呢?我也說不好。**監測儀上的那支筆?也許吧。
1將cceaseelasticin的影象按照點(0.5,0.5)中心對稱映象,得到的就是cceaseelasticout的影象。void cceaseelasticout::update(cctime time)2 8
else
9
1314 m_pother->update(newt);
15 }
但是,如果你直接將中心對稱公式套入cceaseelasticin的函式中,推導出的並不是上面cceaseelasticout使用的計算公式。不過不用特別擔心,如果再考慮上正弦函式的性質,你會發現他們是相等的。
這是最後乙個ccactionease類動作,勝利在望,加把勁。
1在這段**中,首先將time擴大一倍,然後在減去一,也就是將時間分成了前後兩段。void cceaseelasticinout::update(cctime time)2 8
else
9
1516 cctime s = m_fperiod / 4;
1718 time = time - 1;
19if (time < 0)
20
23else
24
27 }
2829 m_pother->update(newt);
30 }
接著對前後兩段時間分別套用相應的公式,進行變換。
基本都挺正常的,除了下面這一段:
11這個週期引數百分之百會被賦值,而且正常人也不會傳入乙個零作週期。我實在是看不出來這段**有什麼用途,所以還得請高人賜教。if (! m_fperiod)
12
至此ccactionease類系的動作就都介紹完了。其中最頭痛的就是這個ease elastic類的動作,要把這類動作所做的運動描述清楚,感覺是挺費勁的。
最後,總結一下本節的重點:
1.如果fperiod的值越小,那麼精靈彈的次數就越多。
2.如果想要精靈完美運動,即起始點(0,0)、結束點(1,1)以及連線點(0.5,0.5)都在函式曲線上,那麼fperiod的值應該符合下面的公式:
fperiod=4/(2*n+1) n≥0
3.在邏輯上fperiod的值要大於零,在實際應用中還要受float型別精度的限制。
IT 想說愛你不容易
檢查了半天,也跟蹤了伺服器端的執行日誌,沒有發現什麼問題,重啟伺服器程序,繼續跟蹤排程程序和執行程序,依舊沒有看出什麼問題,後來根據日誌中的select語句又到資料庫裡面查了一下,嘿!居然沒有資料。估計是命令解析的時候出了錯誤,看來是程式問題了,在伺服器上找到執行程序的源程式,make clean ...
crontab,想說愛你不easy
跑自己主動化指令碼的機器連不上toastserver了,僅僅能自己寫個指令碼每天跑了。當然要放在crontab裡了。5 3 sh nosecron.sh 第二天過來一看結果,fail了大半。然後在log的最前面有一句 warning failed to execute tcpdump.check i...
ROR TDD,想說愛你不容易
tdd,也就是 test driven development 測試驅動開發,其實是一種開發方式的巨大提高。它 提出了一種新的開發方式 以測試為驅動。在此,我仍然想引用乙個曾經看過的thoughtworks的 乙個人的blog中的一句話 什麼是tdd?tdd就是把你的需求用測試給描述出來。這句話一下...