S5G3 用 GGB 作動(dòng)態(tài)時(shí)鐘
本周的學(xué)用數(shù)學(xué)要來(lái)玩轉(zhuǎn)時(shí)鐘。作出可隨時(shí)間轉(zhuǎn)動(dòng)的時(shí)鐘,并可調(diào)整轉(zhuǎn)速,觀察數(shù)字時(shí)鐘與指針時(shí)鐘。在技巧上最主要是練習(xí)序列來(lái)繪制時(shí)鐘,并且用滑動(dòng)桿的腳步來(lái)同步控制滑動(dòng)桿。
但我覺(jué)得最可貴的還是呈現(xiàn)形式與問(wèn)題拆解思維。要根據(jù)教學(xué)需求構(gòu)想畫面要有哪些交互元素,接著再去拆解要達(dá)到這個(gè)效果需要分解成哪些步驟。

你將學(xué)會(huì)
用【序列】來(lái)繪制時(shí)間版面刻度
用數(shù)學(xué)思維來(lái)將時(shí)間對(duì)應(yīng)指針的位置描述出來(lái)
用【滑動(dòng)桿腳本】來(lái)同步滑動(dòng)桿
使用【按鈕】來(lái)啟動(dòng)、暫停動(dòng)畫
【系統(tǒng)時(shí)間】的使用
先備概念:
序列
弧度與角度的關(guān)系
按鈕腳本的初步認(rèn)識(shí)
操作方法
2 如何繪制鐘面的刻度線?

問(wèn):如何繪制鐘面的刻度線?
答:利用【序列】先建鐘面上 60 個(gè)的點(diǎn)列 mPs 來(lái)定位。接著利用 mPs 往內(nèi)縮 0.95 倍來(lái)繪制分針刻度線 mSs。?再縮為 0.9 倍來(lái)繪制時(shí)針刻度線 hSs ,但對(duì)于 hSs 則是用 5 作為間隔。
cR = 5
O =(0,0)
cO = 圓周(O,cR)
mPs?=?序列((cR;pi/2-pi/30*k),k,1,60)
mSs?=?序列(線段(mPs(k),0.95*mPs(k)),k,1,60)
hSs=序列(線段(mPs(k),0.9*mPs(k)),k,5,60,5)
問(wèn):如何將數(shù)字放到合適的位置?
答:最基本的想法,是用時(shí)針刻度的位置*0.8。但這個(gè)定位點(diǎn)不是文字的正中央。因此,再加入些偏移量,例如 (-0.3,-0.3) 。但對(duì)于 10,11,12 這些二位數(shù)的位置平移量可以再大一些,就再利用 floor(k/10) 來(lái)微調(diào)。
hTs=序列(文本(k,0.8*mPs(5k)),k,1,12)??#初版
hTs=序列(文本(k,0.8*mPs(5k)-(0.3,0.3)),k,1,12)??#第二版
hTs=序列(文本(k,0.8*mPs(5k)-0.1*(3+floor(k/10),3)),k,1,12) #第三版
3 如何繪制鐘面上的指針?

問(wèn):如何讓指針指到正確位置?
答:主要先決定秒針的轉(zhuǎn)角。對(duì)秒針而言,s秒的轉(zhuǎn)動(dòng)量為 s/60*2π,而時(shí)針轉(zhuǎn)動(dòng)的方向與數(shù)學(xué)角度的算法不同。因此, sA 為?pi/2-s/60*2*pi。
但對(duì)分針來(lái)說(shuō),就還需要考慮 m 與 s 的影響,3600 秒繞一圈。所以先將 m分s秒換為 60*m+s ,接著以?(m*60+s)/(60*60)*2*pi 來(lái)計(jì)算其位置。
對(duì)于時(shí)針,要考慮 h,m,s 的影響,用 12*60*60?秒為一圈來(lái)計(jì)算出其位置。
#?先設(shè)定時(shí)分秒的滑動(dòng)條 h m s
h?=?滑動(dòng)條(0,24,1)
m?=?滑動(dòng)條(0,60,1)
s?=?滑動(dòng)條(0,60,1)
# 設(shè)定指針的半徑
hR?=?2
mR?= 3
sR = 4? ?
#?設(shè)定轉(zhuǎn)角?sA,?mA,?hA,再用向量?vector?來(lái)繪制指針
sA?=?pi/2-s/60*2*pi
vS?=?向量(O,O+(sR;?sA))
mA?=?pi/2-(m*60+s)/(60*60)*2*pi
vM?=?向量(O,O+(mR;?mA))
hA?=?pi/2-(h*60*60+m*60+s)/(12*60*60)*2*pi
vH?=?向量(O,O+(hR;?hA))
?4 設(shè)定時(shí)間動(dòng)畫

問(wèn):如何讓時(shí)間穩(wěn)定的轉(zhuǎn)動(dòng)?
答:在用 h m s 滑動(dòng)桿再控制時(shí)針時(shí),無(wú)法處理分針繞一圈,時(shí)針前進(jìn)一大格的問(wèn)題。這時(shí)用另個(gè)時(shí)間滑動(dòng)桿 t 來(lái)顯示一天經(jīng)過(guò)的秒數(shù),再將這數(shù)值通過(guò)整除與取余數(shù)來(lái)調(diào)整 h,m,s 的數(shù)值。
問(wèn):如何控制轉(zhuǎn)速模擬真實(shí)的時(shí)間。
答:因?yàn)?,滑?dòng)桿移動(dòng)一次為 10s ,而?t 的范圍為一天的?86400秒。因此,將 t 的移動(dòng)速度設(shè)定為 v/8640,通過(guò)調(diào)整速度v,可達(dá)到真實(shí)時(shí)間加快為 v 倍的效果。
v = 滑動(dòng)條(1,120,1)
t?=?滑動(dòng)條(0,24*60*60,1)?
t?=?滑動(dòng)條(0,24*60*60,1,v/(86400))?
?
# 加入速度設(shè)定
#以下對(duì)滑動(dòng)條設(shè)定對(duì)?h,m,?s?的連動(dòng)
賦值(s,取余(t,60))
賦值(m,取余(floor(t/60),60))
賦值(h,取余(floor(t/(60*60)),24))
5 啟動(dòng)與暫停按鈕

問(wèn):是否可讓 h, m, s 拉到底端時(shí),自動(dòng)回到原位,同時(shí)做到進(jìn)位的效果?
答:在 t,m,s 的腳本同時(shí)取更新 t 的值。再由 t 的值來(lái)修正 s,m,h。?
補(bǔ)充:這個(gè)寫法有個(gè)缺點(diǎn)就是 s,m,h 無(wú)法變小,只能增大。
#?秒針滑動(dòng)條的腳本
賦值(t,取余(t+1,86400))
賦值(s,取余(t,60))
賦值(m,取余(floor(t/60),60))
賦值(h,取余(floor(t/3600),24))
#?分針滑動(dòng)條的腳本
賦值(t,取余(t+60,86400))
賦值(s,取余(t,60))
賦值(m,取余(floor(t/60),60))
賦值(h,取余(floor(t/3600),24))
#?時(shí)針滑動(dòng)條的腳本
賦值(t,取余(t+3600,86400))
賦值(s,取余(t,60))
賦值(m,取余(floor(t/60),60))
賦值(h,取余(floor(t/3600),24))
問(wèn):如何用按鈕來(lái)設(shè)定自動(dòng)轉(zhuǎn)動(dòng)與停止。
答:用【啟動(dòng)動(dòng)畫】指令。停止與啟動(dòng)都是這個(gè)指令,差別在于參數(shù)的 True與 False。
#啟動(dòng)腳本
啟動(dòng)動(dòng)畫(t,True)
#停止腳本
啟動(dòng)動(dòng)畫(t,False)
啟動(dòng)動(dòng)畫(h,False)
啟動(dòng)動(dòng)畫(m,False)
啟動(dòng)動(dòng)畫(s,False)
6?系統(tǒng)時(shí)間

問(wèn):是否可讓時(shí)間顯示現(xiàn)在的時(shí)間呢?
答:可利用【系統(tǒng)時(shí)間】,這會(huì)取得一串list {毫秒、秒、分、時(shí)、日、月、年、月(文)、星期(文)、星期}。再通過(guò)?( ) 來(lái)取得對(duì)應(yīng)的秒、分、時(shí)的數(shù)值。
ST=系統(tǒng)時(shí)間()
賦值(t,ST(4)*3600+ST(3)*60+ST(2))

問(wèn):如何顯示數(shù)字時(shí)間?
答:先用 floor(h/10) 取得 h 的十位數(shù)字,再用??Mod(h,10) 取得 h?的個(gè)位數(shù)字。?對(duì)于m, s 的取法也是類似。
floor(h / 10)取余(h, 10):floor(m / 10)取余(m, 10):floor(s / 10)取余(s, 10)
相關(guān)鏈接
【GGB】https://www.geogebra.org/m/e8cdcgdh
【Bili 】https://www.bilibili.com/video/bv1sz411B7s1
【YouTube】 https://www.youtube.com/playlist?list=PLXH05kw-i_5IADW91fs6CZ7XxrVLGB5OR