本篇需要带你复习一下三角函数知识。不用太多,只要你知道 y=sin(x)y=sin(x)y=sin(x) 是什么样子就行了。什么?忘记长啥样了?看下面。


图1 y=sin(x)y=sin(x)y=sin(x) 图像

我们的目标是,使用 go 语言生成一幅 y=sin(x)y=sin(x)y=sin(x) 的曲线图像出来, jpeg 或者 png 随便你。下面是使用 go 生成图像的一个例子。


图2 使用 go 生成的 png 图像

虽然有点丑,但是美化的目标就交给你了。

1. 基础知识

1.1 相关的包介绍

主要使用的包有这三类

  • image,在内存里创建图像会用到这个包的相关函数。
  • image/color,和颜色相关的函数都在这里。
  • image/png,将内存里的图像编码png文件。

类似 png 的包还有 image/jpegimage/gif 这些包,它们的功能都是将内存里的像素信息编码成具体某种格式的图片。

1.2 相关的概念

  • 彩色图像

彩色图像是一个矩形,由一行一行的像素点组成,每个像素点有自己的颜色。这些颜色的类型可以是 RGBA 类型,也可以是 CMYK 类型。本文只介绍 RGBA 类型。

RGBA 是 Red-Green-Blue-Alpha 的首字母缩写,使用 R, G, B 就可以控制像素的颜色,使用 A 可以控制像素的透明度。

绘制图像的基本原理就是给矩形中每个像素设置一个颜色。

  • in-memory image

在内存中的图像,是指还没有被编码成具体格式的图像数据。只要有了 in-memory image,我们就可以将其编码成任意格式的图像。我们可以把 in-memory image 看成是图 3 里的样子,从左到右是 xxx 轴,从上到下是 y" role="presentation" style="position: relative;">yyy 轴,左上角坐标是 (0,0)(0,0)(0, 0)。


图3 in-memory image

在 go 语言中,in-memory image 有很多种,但是他们都需要实现 image.Image 接口。接口的概念我们还没有正式学过,这里暂且认为它是某个抽象类,定义了以下几个方法:

type Image interface {ColorModel() color.ModelBounds() RectangleAt(x, y int) color.Color
}

1.3 编码成具体格式的图像

只要有了 in-memory image,我们就可以使用某种编码器,比如 jpeg 来将其编码成 jpeg 的 2 进制图像数据,然后保存到本地。

jpeg.Encode(file, in-memory image)

2. 程序

2.1 原理

绘制部分的主要原理就是给 in-memory image 里的像素填颜色。就好比图像 3 里那样,要想绘制图三角函数图像,就需要在图 3 里找到正确的像素小方格,填充好颜色。

难点在于,要给哪些像素点填充颜色?这里,我们不妨就假设 xxx 轴就是图3 里的 x 轴,但是 y" role="presentation" style="position: relative;">yyy 轴方向和我们在数学课上学到的是反的,其实这无关紧要。

假设图像是个正方形,其边长是 2×size2×size2\times size 个像素,则需要绘制的坐标点应该像下面这个参数公式(使用参数 ttt 来控制 x" role="presentation" style="position: relative;">xxx 和 yyy)

x=2×size×t2πy=size+100×sin(t)t∈[0,2π]" role="presentation">x=2×size×t2πy=size+100×sin(t)t∈[0,2π]x=2×size×t2πy=size+100×sin(t)t∈[0,2π]

x = 2\times size \times {t \over {2\pi}}\\ y = size + 100 \times sin(t)\\ t \in [0, 2\pi]

上面的公式你完全可以改造,yyy 坐标加上 size 的原因是希望图像不要太靠上方了,应该尽量位于中心,当然你可以不加这个值,再尝试输出图像看看。sin(t)" role="presentation" style="position: relative;">sin(t)sin(t)sin(t) 乘以 100 是为了让三解函数这幅值变化更大一点,这样显的不是那么扁。这些参数你都可以任意更改,这也算是一个作业。

2.2 实现

创建的文件名字叫 sin1.go. 文件路径是 gopl/tutorial/image/rgba/sin1.go

// sin1.go
package mainimport ("fmt""image""image/color""image/png""math""os"
)const (size = 128 // 常量
)func main() {rec := image.Rect(0, 0, 2*size, 2*size) // 创建矩形画布image := image.NewRGBA(rec) // 返回一个 in-memory imagec := color.RGBA{0xff, 0, 0, 0xff} // 定义一个红色值// 下面两个 for 循环是把 in-memory 中所有的像素初始化为灰色 #eeeeeefor x := 0; x < 2*size; x++ {for y := 0; y < 2*size; y++ {image.Set(x, y, color.RGBA{0xee, 0xee, 0xee, 0xff})}}// 绘制 sin 函数曲线for t := 0.0; t < 2*math.Pi; t += 0.001 {x := int(2.0*size*t/(2.0*math.Pi) + 0.5) // 加 0.5 是为了4舍5入y := int(size + 100*math.Sin(t) + 0.5)image.Set(x, 2*size-y, c) // 给对应的像素位置设置颜色值}// 将 in-memory image 编码成 png 格式数据,并写入标准输出。err := png.Encode(os.Stdout, image) if err != nil {fmt.Fprintf(os.Stderr, "%v\n", err)}
}

2.3 运行

$ go run sin1.go > a.png

这样就生成了一幅三角函数图像啦。

2.4 分析

  • 常量

在 go 里,常量使用 const 关键字声明,且只能是数字、字符串和布尔值。在上面的程序里,我们声明了一个 size 常量,它在需要的时候,可以转换成 int 类型,也可以转换成 float64 类型。具体转换成什么类型,就看它怎么使用了。

关于常量,后面还会详细介绍。

  • color.RGBA

这种类型有点像我们在 c/c++ 里学习的结构体,在 go 里它被称之为复合类型。在我们程序里,我们使用 color.RGBA{...} 初始化一个颜色值,这是复合类型初始化的一种方法。关于复合类型,后续还会介绍。

3. 总结

  • 了解 go 语言更多的语法结构
  • 了解 go 语言强大的包支持,知道 go 语言可以非常方便的做很多事情

练习:

1. 通过命令行参数来控制三角函数曲线的『频率,幅值和相位』。
2. 更改曲线的颜色。
3. 编码成 jpeg 图片。

007-绘制三角函数图像(一)相关推荐

  1. 用计算机绘制函数图像ppt,ppt中怎么绘制三角函数图像?

    ppt中怎么绘制三角函数图像? 2018-03-16 20:22 责任编辑:砕月 导读 / 教学中我们最常用的莫过于ppt演示文稿了,除了基本的演示功能外,它也可以制作函数图像,如果利用ppt来制作函 ...

  2. python绘制三角函数图像

    利用matplotlib和numpy库绘制三角函数图像,包括正弦函数.余弦函数.正切函数.余切函数图像 代码如下: import numpy as np import matplotlib as mp ...

  3. 【Python】使用 Matplotlib 绘制“三角函数”图像 || plt.subplot(2, 2, 3) 将图像分区 || plt.plot(x, y, “r-v“) 中第三个参数说明

    文章目录 一.绘制 三角函数图像 二.函数图像 如何带颜色?如何不带颜色 三. plt.subplot(2, 2, 3) 将图像分区(举例说明 一.绘制 三角函数图像 要求:使用 Python语言,运 ...

  4. matplotlib 绘制三角函数图像

    import matplotlib.pyplot as plt #导入matplotlib库 import numpy as np #导入numpy库 from matplotlib.font_man ...

  5. H5 Canvas绘制三角函数图像

    三角函数sin.cos.tan.sinh.cosh.tanh js 的Math库,自带了许多常见函数方法,其中关于 三角函数的求解还是很齐全的,于是想到,利用canvas 绘制一个比较准确的 sin. ...

  6. 008-绘制三角函数图像(二)

    本文我们再介绍一种 in-memory image 的类型,叫 Paletted,然后再使用这种类型的 in-memory 来绘制三角函数图像. 1. Paletted 定义如下: 图1 Palett ...

  7. Python笔记之用turtle库绘制三角函数和反三角函数的图像(考研党福利)

    文章目录 前言 程序源代码 函数图像 sin(x)图像 arcsin(x)图像 cos(x)图像 arccos(x)图像 tan(x)图像 arctan(x)图像 cot(x)图像 arccot(x) ...

  8. Matplotlib复习(1)——绘制三角函数曲线、正态分布曲线、圆锥曲线、极坐标方程(心形线、玫瑰线、阿基米德螺线)、3D图(球、马鞍面)

    文章目录 0 前置 1 基础API--绘制三角函数曲线 2 图例.注释.文本--绘制正态分布曲线 3 轮廓--绘制圆锥曲线 4 绘制极坐标方程(心形线.玫瑰线.阿基米德螺线) 5 3D图(球.马鞍面) ...

  9. R语言使用persp函数绘制三维图像实战(3D):自定义3D图、图像旋转、添加轴标签

    R语言使用persp函数绘制三维图像实战(3D):自定义3D图.图像旋转.添加轴标签 目录

  10. eeglab教程系列(10)-绘制ERP图像

    绘制ERP图像 eeglab 有一个绘制ERP image的功能,该功能可以对ERP 效应有一个更好理解.这个ERP image 是一个2-D image,其中的横轴是每个epoch 的时刻值,纵轴是 ...

最新文章

  1. JavaScript数组的API
  2. 脑子笨的人可以学计算机吗,脑子笨的人有什么特征 反应慢的人其实很聪明
  3. sdch: chrome支持的新HTTP传输压缩算法
  4. python模块安装路径
  5. IBASE text component
  6. 前端学习(988):jquery常见的api
  7. egg.js java 生产数据_eggjs中,自动从数据库直接生成model.
  8. 当前微型计算机的主存储器可分为,当前微型计算机的主存储器可分为
  9. 代码不是重点, 领悟OO思想(一)
  10. Git 报错:error: The requested URL returned error: 401 Unauthorized while accessing
  11. coco 数据集_PyTorch版YOLOv4更新了,适用于自定义数据集
  12. 新浪tcn短网址短链接在线生成器推荐
  13. 什么是PKI 体系(数字证书种类)
  14. 年度最高奖金【双百万】:2021年全国人工智能大赛开赛啦
  15. vs下活动解决方案管理器中x86 x64 win32 anycpu arm的区别
  16. C语言实现扫雷OvO
  17. UTONMOS数字藏品走红之后,为艺术打开了另一条路
  18. 代码随想录第十四天 二叉树基础 LeetCode 144、145、94
  19. 小米6刷android 8.0,小米6可以吃奥利奥了,抢先刷安卓8.0
  20. 无法打开内核设备“\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导? 模块“DevicePowerOn”启动失败。 未能启动虚拟机。

热门文章

  1. DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)
  2. 【机器学习系列】概率图模型第四讲:变量消除法和Belief Propagation算法
  3. 小学校计算机教室年度工作总结,小学计算机教师年度工作总结
  4. super-csv文档的部分翻译及基本使用
  5. 笔记本无线WiFi生成代码
  6. wordpress教程
  7. 手机python代码查询四六级准考证_四六级查准考证号的网站是什么
  8. 操作系统重要知识清单:操作系统的运行机制与体系结构
  9. win10安装php8.0
  10. Linux系统安装,教你安装一个属于自己的Linux系统