go语言学习-笔记4
go image 试验, 生成心形线。
思路: go image 包生成的image数据 -> 转化为html 格式, 通过网页查看图片。
先上脚本(更改数据格式为 -> html)
gofile=$1
htmfile=$2
go build $gofile.go
eval "./$gofile" >> temp_go_jpg.data
if [ -e "$htmfile.html" ]
then
rm $htmfile.html
fi
echo "<img src=\"data:image/png;base64," >> $htmfile.html
sed -i "s/IMAGE://g" temp_go_jpg.data
cat temp_go_jpg.data >> $htmfile.html
echo "\">" >> $htmfile.html
rm temp_go_jpg.data
其中标红的即为替换数据部分.
echo "<img src=\"data:image/png;base64," >> $htmfile.html
sed -i "s/IMAGE://g" temp_go_jpg.data
cat temp_go_jpg.data >> $htmfile.html
echo "\">" >> $htmfile.html
这样假如脚本文件为 gen.sh,go文件为 image.go, 要生成 index.html, 即可以 运行命令 ./gen.sh image index
心形线选择的方程为 : (x2 + y2 - t)3 = x2y3
为了有一点渐变效果, 心型区域着色根据t变化
代码如下:
package main
import (
"golang.org/x/tour/pic"
"image"
"image/color"
"math"
)
type Image struct {
width int
}
// 计算心形线半径
func (img *Image) CalcHeartRadius(x, y, shift int) float64 {
// 心形线方程: (x^2 + y^2 - t)^3 = x^2 * y^3, 求t
// 做标轴修正 x = x, y = -y, 方程 (x^2 + y^2 - t)^3 = 0 - x^2 * y^3, 求t
// x = x - shift, y = y - shift
fx := float64(x) - float64(shift)
fy := float64(y) - float64(shift)
fValue1 := math.Pow(fx, 2)
fCbrt := math.Cbrt(fValue1) * fy
ft := math.Pow(fx, 2) + math.Pow(fy, 2) + fCbrt
if ft < 0 {
return 0
}
return math.Sqrt(ft)
}
func (img *Image) ColorModel() color.Model {
return color.RGBAModel
}
func (img *Image) Bounds() image.Rectangle {
return image.Rect(0, 0, img.width, img.width)
}
func (img *Image) At(x, y int) color.Color {
intShift := img.width / 2
radius := img.CalcHeartRadius(x, y, intShift)
fmax := float64(intShift)*0.9
if radius > fmax {
return color.RGBA{0, 0, 0, 0}
}
intRadius := uint8(radius)
if fmax > 150 {
intRadius = uint8(150 * float64(intRadius) / fmax)
}
return color.RGBA{255-intRadius, 0, 0, 255}
}
func main() {
width := 240
m := Image{width}
pic.ShowImage(&m)
}
因为go image包中坐标轴方向, y轴方向向下, 即(0,0)点在正方形左上方, 因此要转变方程,替换y为-y, 另外心形中心变为(width/2, width/2), 因此平移方程,x=x-width/2, y = y-wdith/2
生成后,打开html, 查看图像,图片如下:


浙公网安备 33010602011771号