<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 5.3.2 計算機動畫 顧名思義,動畫就是運動的畫面,計算機動畫就是通過計算機編程來實現運動的畫面。計算機動畫在很多領域中都有應用,例如游戲開發、電影電視制作、教學演示等。計算機動 畫并不神秘,只要掌握了靜止圖形的繪制方法,就很容易學會活動畫面的制作。 現實世界中運動是連續的,而數字計算機只能處理離散量,因此計算機動畫本質上只能 是對連續運動的近似和模擬。具體來說,動畫是通過在屏幕上快速地交替顯示一組靜止圖形(圖像),或者讓一幅圖形(圖像)快速地移動而實現的。每一幅靜止圖形(圖像)稱為一 幀,幀與幀之間在畫面上只有小部分的不同,于是人眼的視覺暫留現象會使我們產生運動的 感覺。實驗表明,每秒顯示 24 幀畫面能使人眼感覺到最佳的連續運動效果,所以在連續兩幀畫面之間應該停頓 0.04 秒左右。 動畫制作有很多現成軟件工具可用,例如在網頁和多媒體教學中常用的 Flash。而我們在此介紹的是直接編程實現動畫。 下面我們利用 Tkinter 來實現一個簡單的動畫程序。程序的功能是演示太陽、地球和月 球三個天體之間的運動情況,即月球繞地球運動,并且和地球一起繞太陽運動。 程序規格 輸入:沒有輸入。 輸出:演示太陽、地球和月球之間相對運動的動畫。 算法設計 首先當然是建立窗口和畫布,然后畫出太陽、地球和月球三個天體,具體做法與 5.2.3 節中繪制橢圓的例子相似(圖 5.9),當然現在需要多畫一個月球,并且需要移動地球和月球。 本程序最關鍵的部分是解決地球和月球沿橢圓軌道移動的計算(假設太陽位置固定不動),下面先解決地球的運動問題。中學數學告訴我們,橢圓可以用如下方程來刻劃: ``` x = a cos t y = b sin t ``` 因此,地球在軌道上自西向東旋轉時的每一個位置(x,y)都可利用此方程算出,其中橢圓軌 道的 a、b 值是固定不變的,位置只由旋轉角度 t 決定(參見圖 5.20)。假設地球每次旋轉 0.01p 弧度(這就是連續運動的離散化!),則地球的下一位置就是 ``` x' = a cos(t + 0.01 pi) y' = b sin(t + 0.01 pi) ``` 由此可算出 ``` dx = x' - x dy = y' - y ``` 于是可利用畫布對象的 move()方法來移動地球到新的位置。 再看圖 5.20,由于畫布的坐標系原點不是橢圓軌道的中心,橢圓中心在畫布坐標系中是(150,100),故地球在 t 角度時的位置應該做個變換: ``` x = 150 + a cos t y = 100 - b sin t ``` 注意畫布坐標系中 y 軸是向下的,因此上式計算 x 和 y 坐標時有加減的不同。 ![](https://box.kancloud.cn/2016-02-22_56cafce1ac4c2.png) 圖 5.20 地球沿橢圓軌道旋轉位置的計算 接下來解決月球的運動問題。首先月球是與地球一起沿橢圓軌道繞太陽運動的,因此月球相對于太陽的位置變化與地球一樣由上述 dx 和 dy 決定,即程序 5.3 中的 edx 和 edy。 此外,月球又在繞地球旋轉,利用同樣方法可算出月球沿繞地球橢圓軌道(設 a、b 的值分 別為 20 和 15)運動時相對于地球的位置變化,即程序 5.3 中的 mdx 和 mdy。最終月球的位 置變化為 edx+mdx 和 edy+mdy。注意,月球繞地球的旋轉速度大約是地球繞太陽的旋轉 速度的 12 倍(一年有十二個月)。 解決了關鍵的地球月球的位置計算問題,本程序的算法就明確了,偽代碼如下: ``` 算法: 創建窗口和畫布; 在畫布上繪制太陽、地球和月球,以及地球的繞日橢圓軌道; 設置地球和月球的當前位置; 進入動畫循環: 旋轉 0.01p; 計算地球和月球的新位置; 移動地球和月球到新位置 更新地球和月球的當前位置; 停頓一會 ``` 代碼實現 上面的算法很容易翻譯成如程序 5.3 所示的 Python 代碼。代碼中有兩處需要說明一下: 第一,每次循環中修改圖形位置后都必須執行一個更新畫布顯示的方法 c.update(),以 使新畫面顯示出來;第二,兩個畫面之間的停頓可以用 time 模塊中的 sleep()函數來實 現,該函數的作用就是讓程序休眠一會(參數以秒為單位)①。 【程序 5.3】animation.py ``` from Tkinter import * from math import sin,cos,pi from time import sleep def main(): root = Tk() c = Canvas(root,width=300,height=200,bg='white') c.pack() orbit = c.create_oval(50,50,250,150) sun = c.create_oval(110,85,140,115,fill='red') earth = c.create_oval(245,95,255,105,fill='blue') moon = c.create_oval(265,98,270,103) eX = 250 # earth's X eY = 100 # earth's Y m2eX = 20 # moon's X relative to earth m2eY = 0 # moon's Y relative to earth t = 0 while True: t = t + 0.01*pi new_eX = 150 + 100 * cos(t) new_eY = 100 - 50 * sin(t) new_m2eX = 20 * cos(12*t) new_m2eY = -15 * sin(12*t) edx = new_eX - eX edy = new_eY - eY mdx = new_m2eX - m2eX mdy = new_m2eY - m2eY c.move(earth,edx,edy) c.move(moon,mdx+edx,mdy+edy) c.update() eX = new_eX eY = new_eY m2eX = new_m2eX m2eY = new_m2eY sleep(0.04) main() ``` > ① 如果不知道這個 sleep 函數,也可以自己寫一個純粹消磨時間的循環語句,例如循環 1 百萬次,每次 都執行無用語句。同樣能起到讓畫面停頓的效果。 圖 5.21 是程序 5.3 執行過程中的一個屏幕截圖。 ![](https://box.kancloud.cn/2016-02-22_56cafce1bddb3.png) 圖 5.21 程序 5.3 的屏幕截圖
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看