C語言中文網 目錄

Go語言輸出正弦函數(Sin)圖像

Go 語言中,正弦函數由 math 包提供,函數入口為 math.Sin。正弦函數的參數為 float64,返回值也是 float64。在使用正弦函數時,根據實際精度可以進行轉換。

Go 語言的標準庫支持對圖片像素進行訪問,并且支持輸出各種圖片格式,如 JPEG、PNG、GIF 等。

首先給出本節完整的代碼:
package main

import (
    "image"
    "image/color"
    "image/png"
    "log"
    "math"
    "os"
)

func main() {

    // 圖片大小
    const size = 300
    // 根據給定大小創建灰度圖
    pic := image.NewGray(image.Rect(0, 0, size, size))

    // 遍歷每個像素
    for x := 0; x < size; x++ {
        for y := 0; y < size; y++ {
            // 填充為白色
            pic.SetGray(x, y, color.Gray{255})
        }
    }

    // 從0到最大像素生成x坐標
    for x := 0; x < size; x++ {

        // 讓sin的值的范圍在0~2Pi之間
        s := float64(x) * 2 * math.Pi / size

        // sin的幅度為一半的像素。向下偏移一半像素并翻轉
        y := size/2 - math.Sin(s)*size/2

        // 用黑色繪制sin軌跡
        pic.SetGray(x, int(y), color.Gray{0})
    }

    // 創建文件
    file, err := os.Create("sin.png")

    if err != nil {
        log.Fatal(err)
    }
    // 使用png格式將數據寫入文件
    png.Encode(file, pic) //將image信息寫入文件中

    // 關閉文件
    file.Close()
}

設置圖片背景色

以下是設置圖片背景的代碼:
// 圖片大小
const size = 300

// 根據給定大小創建灰度圖
pic := image.NewGray(image.Rect(0, 0, size, size))

// 遍歷每個像素
for x := 0; x < size; x++ {
    for y := 0; y < size; y++ {
        // 填充為白色
        pic.SetGray(x, y, color.Gray{255})
    }
}
代碼說明如下:
  • 第 2 行,聲明一個 size 常量,值為 300。
  • 第 5 行,使用 image 包的 NewGray() 函數創建一個圖片對象,使用區域由 image.Rect 結構提供。image.Rect 描述一個方形的兩個定位點 (x1,y1) 和 (x2,y2)。image.Rect(0,0,size,size) 表示使用完整灰度圖像素,尺寸為寬 300,長 300。
  • 第 8 行和第 9 行,遍歷灰度圖的所有像素。
  • 第 11 行,將每一個像素的灰度設為 255,也就是白色。

灰度圖是一種常見的圖片格式,一般情況下顏色由 8 位組成,灰度范圍為 0~255,0 表示黑色,255 表示白色。

初始化好的灰度圖對象內存區域默認值都是 0,對應全是黑色,考慮到顯示效果和習慣,將所有像素設置為 255,也就是白色。

繪制正弦函數軌跡

正弦函數是一個周期函數。定義域是實數集,值域范圍是 [-1, 1]。用編程的通俗易懂的話來說就是:math.Sin 函數的參數支持任意浮點數范圍,函數返回值的范圍總是在 -1~1之間(兩端包含)。

要將正弦函數放在圖片上需要考慮以下一些因素:
  • math.Sin 的返回值在 -1~1 之間。需要考慮將正弦的輸出幅度變大,可以將 math.Sin 的返回值乘以一個常量進行放大。
  • 圖片的坐標系原點在左上角,而 math.Sin 基于笛卡爾坐標系原點在左下角。需要對圖像進行上下翻轉和平移。

將這些處理邏輯匯總為代碼如下:
// 從0到最大像素生成x坐標
for x := 0; x < size; x++ {

    // 讓sin的值的范圍在0~2Pi之間
    s := float64(x) * 2 * math.Pi / size

    // sin的幅度為一半的像素。向下偏移一半像素并翻轉
    y := size/2 - math.Sin(s)*size/2

    // 用黑色繪制sin軌跡
    pic.SetGray(x, int(y), color.Gray{0})
}
代碼說明如下:
1) 第 2 行,生成 0 到 size(300)的 x 坐標軸。

2) 第 5 行,計算 math.Sin 的定義域,這段代碼等效為:
rate := x / size
s := rate * 2 * math.Pi
x 的范圍是 0 到 size,因此除以 size 后,rate 的范圍是 0~1 之間,再乘以 2π 后,s 的范圍剛好是 0~2π 之間。

float64(x) 表示將整型的 x 變量轉換為 float64 類型,之后運算的所有表達式將以 float64 類型進行。

3) 第 8 行中,math.Sin(s)*size/2 表示將正弦函數的返回值幅度從 1 擴大到二分之一的 size。負號表示將正弦函數圖形以圖形中心上下翻轉。疊加 size/2 表示將圖形在 y 軸上向下偏移二分之一的 size(圖片坐標系的 y 向下)。

4) 第 11 行將計算好的 x 軸和 y 軸數據,以灰度為 0(黑色)使用 SetGray() 方法填充到像素中。

寫入圖片的正弦函數圖像如下圖所示:

寫入圖片文件

內存中的正弦函數圖形是不可見的,我們選用 PNG 格式將圖形輸出為文件。Go 語言提供了文件創建函數和 PNG 格式寫入函數,代碼如下:
// 創建文件
file, err := os.Create("sin.png")

if err != nil {
    log.Fatal(err)
}
// 使用PNG格式將數據寫入文件
png.Encode(file, pic)  //將image信息寫入文件中

// 關閉文件
file.Close()
代碼說明如下:
  • 第 2 行,創建 sin.png 的文件。
  • 第 4 行,如果創建文件失敗,返回錯誤,打印錯誤并終止。
  • 第 8 行,使用 PNG 包,將圖形對象寫入文件中。
  • 第 11 行,關閉文件。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo