滾動的球
-
在上一個課程「垂直簡諧運動」的案例中,我們使用的範例是讓「方塊」在「彈簧」上不斷地進行「垂直簡諧運動」,這個課程將「方塊」換成是「圓球」,來探討「滾動的球」。
程式碼,如下:
(一)地球的轉動
Web VPython 3.2 # 匯入視覺化套件 from vpython import * # 1. 參數設定 #球半徑 0.5 m size = 0.5 #時間間隔 dt = 0.001 # 2. 畫面設定 scene = canvas(width=800, height=800, background=vector(0.5,0.6,0.5)) # x軸箭頭 x_axis = arrow(axis=vector(1, 0, 0), shaftwidth=0.01) # y軸箭頭 y_axis = arrow(axis=vector(0, 1, 0), shaftwidth=0.01) # z軸箭頭 z_axis = arrow(axis=vector(0, 0, 1), shaftwidth=0.01) #3. 球的設定 earth = sphere(pos=vector(0,0,0), radius=size, texture=textures.earth) # 4. 運動 while True: rate(1000) earth.rotate(axis=vector(0,0,1), angle=-2*dt)
(二)五顆球的轉動
- 使用循序結構
Web VPython 3.2 # 匯入視覺化套件 from vpython import * # 1. 參數設定 #球半徑 0.05 m size = 0.5 #時間間隔 dt = 0.001 # 2. 畫面設定 scene = canvas(width=800, height=800, background=vector(0.5,0.6,0.5)) # x軸箭頭 x_axis = arrow(axis=vector(1, 0, 0), shaftwidth=0.01) # y軸箭頭 y_axis = arrow(axis=vector(0, 1, 0), shaftwidth=0.01) # z軸箭頭 z_axis = arrow(axis=vector(0, 0, 1), shaftwidth=0.01) #3. 球的設定 earth = sphere(pos=vector(0,0,0), radius=size, texture=textures.earth) stucco = sphere(pos=vector(1,0,0), radius=size, texture=textures.stucco) metal = sphere(pos=vector(-1,0,0), radius=size, texture=textures.metal) wood = sphere(pos=vector(-2,0,0), radius=size, texture=textures.wood) rough = sphere(pos=vector(2,0,0), radius=size, texture=textures.rough) # 4. 運動 while True: rate(1000) earth.rotate(axis=vector(0,0,1), angle=-2*dt) stucco.rotate(axis=vector(0,0,1), angle=-2*dt) metal.rotate(axis=vector(0,0,1), angle=-2*dt) wood.rotate(axis=vector(0,0,1), angle=-2*dt) rough.rotate(axis=vector(0,0,1), angle=-2*dt)
- 使用串列(List)
此處balls屬於一種稱為串列(list)的資料型態,可以儲存並處理多項資料。在list中(被中括號[ ]框住) 的資料稱為元素(element)或項目(item),存在 list 中的元素沒有限定種類,可以是任何種類的資 料或物件等,在這裡balls中存了五個ball。創造一個list最簡單的方式就是用中括號[ ], 在其中放入想存的元素,以逗號分隔。你可以想像,list 就是一個清單,裏面有一串序列的物 件。你可以用索引(index)來定位其中的任何元素,每個元素所對應的索引,就是該元素與 list 中第一個元素的索引值的偏移量(offset),如 list 中的第一個元素的索引值為 0,第二個元素的 索引值為 1、第三個元素的索引值為 2…以此類推。例如
A = [1, 2, 3, 4, 5]
代表我們設定一個 list 叫做 A,其中 A[0]的值是 1,A[1]值是 2,以下依此類推。 另外當索引是 -1 時,則指的是最後一個元素,如 A[-1]的值就是 5。
在程式當中,如果要在已存在的 list 增加元素,可利用 append 指令,其用法範例如下: A.append(6)
如此 A 會有六個元素,依序為 1、2、3、4、5、6。而此時,A[-1]的值就是 6。
不含任何元素的 list 也可以使用,如 B=[ ],或主程式中的 arrows 都是空的 list。
使用迴圈
Python的for敘述會將一系列(例如list)裡所有的元素走訪一遍,而執行的順序是依照系列中元素的順序。例如:
A = [1, 2, 3, 4, 5] for x in A: print(x)
以上的式碼會把A中的元素都印出來。
- 使用重複結構
Web VPython 3.2 # 匯入視覺化套件 from vpython import * # 1. 參數設定 #球半徑 0.05 m size = 0.5 #時間間隔 dt = 0.001 # 2. 畫面設定 scene = canvas(width=800, height=800, background=vector(0.5,0.6,0.5)) # x軸箭頭 x_axis = arrow(axis=vector(1, 0, 0), shaftwidth=0.01) # y軸箭頭 y_axis = arrow(axis=vector(0, 1, 0), shaftwidth=0.01) # z軸箭頭 z_axis = arrow(axis=vector(0, 0, 1), shaftwidth=0.01) #3. 球的設定 earth = sphere(pos=vector(0,0,0), radius=size, texture=textures.earth) stucco = sphere(pos=vector(1,0,0), radius=size, texture=textures.stucco) metal = sphere(pos=vector(-1,0,0), radius=size, texture=textures.metal) wood = sphere(pos=vector(-2,0,0), radius=size, texture=textures.wood) rough = sphere(pos=vector(2,0,0), radius=size, texture=textures.rough) balls = [earth, stucco, metal, wood, rough] # 4. 運動 while True: rate(1000) for ball in balls: ball.rotate(axis=vector(0,0,1), angle=-2*dt)
(三)滚動的球
Web VPython 3.2 # 匯入視覺化套件 from vpython import * # 1. 參數設定 #球半徑 0.05 m size = 0.05 #地板長 L = 1.0 #時間間隔 dt = 0.001 # 2. 畫面設定 scene = canvas(width=800, height=800, background=vector(0.5,0.6,0.5)) bottom = box(pos=vector(0,-size,0), length=2*L, height=0.001, width=2) wall = box(pos=vector(L,-size/2,0), length=0.01, height=size, width=2) #3. 球的設定 earth = sphere(pos=vector(-L,0,0), radius=size, texture=textures.earth) earth.v = 0.5 # 4. 運動 while True: rate(1000) earth.pos.x = earth.pos.x + earth.v *dt earth.rotate(axis=vector(0,0,1), angle=-earth.v*dt/size) if earth.pos.x >= L-size : earth.v = 0
【作業】
請修改上述程式碼,使用串列(list)與迴圈(for loop)畫出三顆滾動的球。