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, 查看图像,图片如下:

 

posted @ 2020-04-06 00:36  upupon  阅读(186)  评论(0编辑  收藏  举报