make loop

This commit is contained in:
chai2010
2015-12-26 20:05:30 +08:00
parent 82ec0c025d
commit e15e88dad7
74 changed files with 207 additions and 207 deletions

View File

@@ -1,10 +1,10 @@
## 1.4. GIF動畵
下面的程序會演示Go語言標準庫里的image這個package的用法我們會用這個包來生成一繫列的bit-mapped圖然後將這些圖片編碼爲一個GIF動畵。我們生成的圖形名字叫利薩如圖形(Lissajous figures)這種效果是在1960年代的老電影里現的一種視覺特效。它們是協振子在兩個緯度上振動所産生的麴線比如兩個sin正絃波分别在x軸和y軸輸入會産生的麴線。圖1.1是這樣的一個例子:
下面的程序會演示Go語言標準庫里的image這個package的用法我們會用這個包來生成一繫列的bit-mapped圖然後將這些圖片編碼爲一個GIF動畵。我們生成的圖形名字叫利薩如圖形(Lissajous figures)這種效果是在1960年代的老電影里現的一種視覺特效。它們是協振子在兩個緯度上振動所産生的麴線比如兩個sin正絃波分别在x軸和y軸輸入會産生的麴線。圖1.1是這樣的一個例子:
![](../images/ch1-01.png)
譯註:要看這個程序的結果,需要將標準輸重定向到一個GIF圖像文件使用 `./lissajous > output.gif` 命令。下面是GIF圖像動畵效果
譯註:要看這個程序的結果,需要將標準輸重定向到一個GIF圖像文件使用 `./lissajous > output.gif` 命令。下面是GIF圖像動畵效果
![](../images/ch1-01.gif)
@@ -69,17 +69,17 @@ bla kIndex)
當我們import了一個包路徑包含有多個單詞的package時比如image/colorimage和color兩個單詞通常我們隻需要用最後那個單詞表示這個包就可以。所以當我們寫color.White時這個變量指向的是image/color包里的變量同理gif.GIF是屬於image/gif包里的變量。
這個程序里的常量聲明給了一繫列的常量值,常量是指在程序編譯後運行時始終都不會變化的值,比如圈數、幀數、延遲值。常量聲明和變量聲明一般都會現在包級别所以這些常量在整個包中都是可以共享的或者你也可以把常量聲明定義在函數體內部那麽這種常量就隻能在函數體內用。目前常量聲明的值必鬚是一個數字值、字符串或者一個固定的boolean值。
這個程序里的常量聲明給了一繫列的常量值,常量是指在程序編譯後運行時始終都不會變化的值,比如圈數、幀數、延遲值。常量聲明和變量聲明一般都會現在包級别所以這些常量在整個包中都是可以共享的或者你也可以把常量聲明定義在函數體內部那麽這種常量就隻能在函數體內用。目前常量聲明的值必鬚是一個數字值、字符串或者一個固定的boolean值。
[]color.Color{...}和gif.GIF{...}這兩個表達式就是我們説的複合聲明4.2和4.4.1節有説明。這是實例化Go語言里的複合類型的一種寫法。這里的前者生成的是一個slice切片後者生成的是一個struct結構體。
gif.GIF是一個struct類型參考4.4節。struct是一組值或者叫字段的集合不同的類型集合在一個struct可以讓我們以一個統一的單元進行處理。anim是一個gif.GIF類型的struct變量。這種寫法會生成一個struct變量併且其內部變量LoopCount字段會被設置爲nframes而其它的字段會被設置爲各自類型默認的零值。struct內部的變量可以以一個點(.)來進行訪問就像在最後兩個賦值語句中顯式地更新了anim這個struct的Delay和Image字段。
lissajous函數內部有兩層嵌套的for循環。外層循環會循環64次每一次都會生成一個單獨的動畵幀。它生成了一個包含兩種顔色的201&201大小的圖片白色和黑色。所有像素點都會被默認設置爲其零值也就是palette里的第0個值這里我們設置的是白色。每次經過內存循環都會通過設置像素爲黑色生成一張新圖片。其結果會append到之前結果之後。這里我們用到了append(參考4.2.1)這個內置函數將結果appen到anim中的幀列表末尾併會設置一個默認的80ms的延遲值。最終循環結束所有的延遲值也被編碼進了GIF圖片中併將結果寫入到輸流。out這個變量是io.Writer類型這個類型讓我們可以可以讓我們把輸結果寫到很多目標,很快我們就可以看到了。
lissajous函數內部有兩層嵌套的for循環。外層循環會循環64次每一次都會生成一個單獨的動畵幀。它生成了一個包含兩種顔色的201&201大小的圖片白色和黑色。所有像素點都會被默認設置爲其零值也就是palette里的第0個值這里我們設置的是白色。每次經過內存循環都會通過設置像素爲黑色生成一張新圖片。其結果會append到之前結果之後。這里我們用到了append(參考4.2.1)這個內置函數將結果appen到anim中的幀列表末尾併會設置一個默認的80ms的延遲值。最終循環結束所有的延遲值也被編碼進了GIF圖片中併將結果寫入到輸流。out這個變量是io.Writer類型這個類型讓我們可以可以讓我們把輸結果寫到很多目標,很快我們就可以看到了。
內存循環設置了兩個偏振。x軸偏振使用的是一個sin函數。y軸偏振也是一個正絃波但是其其相對x軸的偏振是一個0-3的隨機值併且初始偏振值是一個零值併隨着動畵的每一幀逐漸增加。循環會一直跑到x軸完成五次完整的循環。每一步它都會調用SetColorIndex來爲(x, y)點來染黑色。
main函數調用了lissajous函數併且用它來向標準輸中打印信息所以下面這個命令會像圖1.1中産生一個GIF動畵。
main函數調用了lissajous函數併且用它來向標準輸中打印信息所以下面這個命令會像圖1.1中産生一個GIF動畵。
```
$ go build gopl.io/ch1/lissajous