本模块任务:
1.方法论:Python语言及海龟绘图体系
2.实践能力:初步学会使用Python绘制简单图形
2.1深入理解Python语言
1.计算机技术的演进
(1)1964-1981年:计算机系统结构时代(35年)——计算能力的问题
(2)1981-2008年:网络和视图时代(27年)——交互问题
(3)2008-2016年:复杂信息系统时代(8年)——数据问题
(4)2016-至今:人工智能时代——人类的问题
从复杂信息系统时代到人工智能时代,这个过渡是新计算时代。
2.编程语言的多样初心
各编程语言所处历史时期和使命不同,Python是计算时代演进的选择!
不同编程语言的初心和适用对象
3.Python语言的特点
(1)Python是脚本语言,开源语言,跨平台语言,多模块语言。
(2)Python特点与优势:
①语法简洁:是C代码量的10%,强制可读性,较少的底层语法元素,
多种编程方式和支持中文字符。
②生态高产:有>15万第三方库,快速增长的计算生态,避免重复造轮子,开放共享,跨操作系统平台。
让我们看个例子,如何用21行代码将图1变成素描图?
(1)21行代码:
#文件名:Sketching.py
from PIL import Image
import numpy as np
import tkinter.filedialog
root = tkinter.Tk().withdraw()
filename = tkinter.filedialog.askopenfilename() # 打开选择文件对话框
try:
depth = 30 # 0-100,越高,颜色越深
picture_grad = np.gradient(np.asarray(Image.open("E://photo//1.jpg").convert('L')).astype('int')) # 取图像灰度的梯度值
grad_x, grad_y = picture_grad[0] * depth / 100., picture_grad[1] * depth / 100. # 将获取的维度梯度值进行深度处理
base = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.) # 降噪基
_x, _y, _z = grad_x / base, grad_y / base, 1. / base
sce_z, sce_x = np.pi / 2.1, np.pi / 3 # 光源的俯视角度值和方位角度值
# 光源对x,y,z 轴的影响
dx, dy, dz = np.cos(sce_z) * np.cos(sce_x), np.cos(sce_z) * np.sin(sce_x), np.sin(sce_z)
Normalized = 255 * (dx * _x + dy * _y + dz * _z).clip(0, 255) # 光源归一化
im = Image.fromarray(Normalized.astype('uint8')) # 重构图像
im.save('转换后的素描图.jpg') # 保存转换后的图片到当前.py文件的目录下
im.show() # 展示转换后的图片
except Exception:
print('转换失败!')
(2)第二种代码实现:
#文件名:Sketching2.py
# 创建根窗口
root = tkinter.Tk().withdraw()
# 文件选择对话窗口,返回文件对象
file_ = tkinter.filedialog.askopenfilename()
# 将图像以灰度图的方式打开并将数据转为float存入np中
a = np.asarray(Image.open(file_).convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) # 取图像灰度的梯度值
grad_x, grad_y = grad # 分别取横纵图像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
# 建立一个位于图像斜上方的虚拟光源
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
dx = np.cos(vec_el)*np.cos(vec_az) # 光源对x 轴的影响
dy = np.cos(vec_el)*np.sin(vec_az) # 光源对y 轴的影响
dz = np.sin(vec_el) # 光源对z 轴的影响
# 计算各点新的像素值
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)
b = b.clip(0, 255)
im = Image.fromarray(b.astype('uint8')) # 重构图像
im.save('素描.png') # 图片输出路径到当前.py文件的目录下
(3)如何看待Python语言?
①C/C++:Python归Python,C归C
②Java:针对特定开发和岗位需求
③HTML/CSS/JS:不可替代的前端技术,全栈能力
④其他语言:R/GO/Matlab等,特定领域。
Python是最高产的程序设计语言,是掌握抽象并求解计算问题综合能力的语言,是了解产业界解决复杂计算问题方法的语言,是享受利用编程将创新变为实现乐趣的语言。
工具决定思维:关注工具变革的力量!
4.“超级语言”的诞生
(1)编程语言的种类:
①机器语言:
a.一种二进制语言,直接使用二进制代码表达指令。
b.计算机硬件(CPU)可以直接执行,与具体CPU型号有关。
c.完成2+3功能的机器语言:11010010 00111011
②汇编语言:
a.一种将二进制代码直接对应助记符的编程语言
b.汇编语言与CPU型号有关,程序不通用,需要汇编器转换。
c.完成2+3功能的汇编语言:add 2,3,result
③高级语言:
a.更接近自然语言,同时更容易描述计算问题
b.高级语言代码与具体CPU型号无关,需要编译器编译后运行
c.完成2+3功能的高级语言:result=2+3
④超级语言:Python是唯一的超级语言!
a.粘性整合已有程序:编程思维不再是刀耕火种,而是集成开发
b.具有庞大计算生态:可以很容易利用已有代码功能
c.完成2+3功能的超级语言:result=sum(2,3)
2.2实例2:Python蟒蛇绘制
1.问题分析
(1)设计蟒蛇的基本形状:
(2)问题一:计算机绘图是什么原理?
任何复杂的几何图形都是由基本图形元素(如点、线等)组成的,基本图形生成的关键是如何用算法及数学公式进行描述并在图形设备上显示出来。为此,计算机绘图程序必须首先对图形元素进行定位,然后按照各点连接关系及指定属性参数来绘制完成图形。
①一段程序为何能够产生窗体?
②为何能在窗体上绘制图形?
(3)问题二:Python蟒蛇绘制从哪里开始呢?
①如何绘制一条线?解:turtle.fd():画笔前进
②如何绘制一个弧形?解:turtle.circle(r,angle):画笔画圆
③如何绘制一个蟒蛇?解:画笔行走的轨迹
2.实例编写
#Python蟒蛇绘制
#文件名:PythonDraw.py
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
tuttle.penclor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
运行结果
3.举一反三
(1)Python语法元素理解:
①掌握Python基本绘图方法
(2)程序参数的改变:
①蟒蛇颜色:七彩色!
②蟒蛇的长度:1节,……解:for循环的次数
③蟒蛇的方向:向左走,斜着走……解:turtle.seth()函数用来改变画笔的角度
(3)计算问题的扩展:
①圆形绘制、五角星绘制、国旗绘制、机器猫绘制……
#文件名:樱花纷飞.py
import turtle as T
import random
import time
#画樱花的躯干(60,t)
def Tree(branch,t):
time.sleep(0.0005)
if branch > 3:
if 8<=branch <=12:
if random.randint(0,2) ==0:
t.color('snow') #白
else:
t.color('lightcoral') #淡珊瑚色
t.pensize(branch / 3)
elif branch <8:
if random.randint(0,1) == 0:
t.color('snow')
else:
t.color('lightcoral')
t.pensize(branch / 2)
else:
t.color('sienna') #赭色
t.pensize(branch / 10)
t.forward(branch)
a = 1.5*random.random()
t.right(20*a)
b=1.5*random.random()
Tree(branch-10*b,t)
t.left(40*a)
Tree(branch-10*b,t)
t.right(20*a)
t.up()
t.backward(branch)
t.down()
#掉落的花瓣
def Petal(m,t):
for i in range(m):
a = 200-400*random.random()
b = 10-20*random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral')
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
#绘图区域
t = T.Turtle()
#画布大小
w = T.Screen()
t.hideturtle() #隐藏画笔
t.getscreen().tracer(5,0)
w.screensize(bg = 'wheat')
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
#画樱花的躯干
Tree(60,t)
#掉落的花瓣
Petal(200,t)
w.exitonclick()
程序“樱花纷飞”的运行效果
2.3模块1:turtle库的使用
1.turtle库基本介绍
(1)概述:海龟库(turtle库)是turtle绘图体系的Python实现,是Python语言的标准库之一,是入门级的图形绘制函数库。
turtle绘图体系:1969年诞生,主要用于程序设计入门。
Python计算生态 = 标准库 + 第三方库
①标准库:随解释器直接安装到操作系统中的功能模块。
②第三方库:需要经过安装才能使用的功能模块。
模块:库Library,包Package,模块Module统称为模块
(2)turtle的原理:turtle是真实的存在。
有一只海龟,在窗体的正中心,在画布上游走,走过的轨迹形成了绘制的图形。海龟由程序控制,可以变成颜色,改变宽度等。
2.turtle绘图窗体布局
turtle的绘图窗体
3.turtle空间坐标体系
(1)绝对坐标
#文件名:绝对坐标的使用
import turtle
turtle.goto(100,100)
turtle.goto(100,-100)
turtle.goto(-100,-100)
turtle.goto(-100,100)
turtle.goto(0,0)
程序运行结果
turtle的绝对坐标
(2)海龟坐标
4.turtle角度坐标体系
turtle的绝对角度:turtle.seth(angle)
#海龟角度
import turtle
turtle.left(45)
turtle.fd(150)
turtle.right(135)
turtle.fd(300)
turtle.left(135)
turtle.fd(150)
程序“海龟角度”的运行结果
海龟角度
5.RGB色彩体系
RGB指红蓝绿三个通道的颜色组合,覆盖视力所能感知的所有颜色,由三种颜色构成的万物色。RGB每色取值范围0~255整数或0~1小数。默认采用小数值,可切换为整数值,语法如下:turtle.colormode(mode),其中1.0表示RGB小数模式,255表示RGB整数值模式。
常用RGB色彩
英文名称 | RGB整数值 | RGB小数值 | 中文名称 |
white | 255,255,255 | 1,1,1 | 白色 |
yellow | 255,255,0 | 1,1,0 | 黄色 |
magenta | 255,0,255 | 1,0,1 | 洋红色 |
cyan | 0,255,255 | 0,1,1 | 青色 |
blue | 0,0,255 | 0,0,1 | 蓝色 |
black | 0,0,0 | 0,0,0 | 黑色 |
seashell | 255,245,238 | 1,0.96,0.93 | 海贝色 |
gold | 255,215,0 | 1,0.84,0 | 金色 |
pink | 255,192,203 | 1,0.75,0.80 | 粉红色 |
brown | 165,42,42 | 0.65,0.16,0.16 | 棕色 |
purple | 160,32,240 | 0.63,0.13,0.94 | 紫色 |
tomato | 255,99,71 | 1,0.39,0.28 | 番茄色 |
2.4turtle程序语法元素分析
1.库引用与import
(1)库引用:扩充Python程序功能的方式。使用import保留字完成,采用<a>.<b>()编码风格。格式如下:
import <库名>
<库名>.<函数名>(<函数参数>)
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
tuttle.penclor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
(2)使用from和import保留字共同完成库引用,格式如下:
from <库名> import <函数名>
from <库名> import * #引用该库中的所有函数
<函数名>(<函数参数>) #缺点:易出现与自定义函数重名问题
from turtle import *
setup(650,350,200,200)
penup()
fd(-250)
pendown()
pensize(25)
penclor("purple")
seth(-40)
for i in range(4):
circle(40,80)
circle(-40,80)
circle(40,80/2)
fd(40)
circle(16,180)
fd(40*2/3)
done()
(3)使用import和as保留字共同完成,格式如下:
import <库名> as <库别名> #给调用的外部库关联一个更短,更适合自己的名字
<库别名>.<函数名>(<函数参数>)
import turtle as t
t.setup(650,350,200,200)
t.penup()
t.fd(-250)
t.pendown()
t.pensize(25)
t.penclor("purple")
t.seth(-40)
for i in range(4):
t.circle(40,80)
t.circle(-40,80)
t.circle(40,80/2)
t.fd(40)
t.circle(16,180)
t.fd(40*2/3)
t.done()
2.turtle画笔控制函数
(1)抬起画笔,海龟在飞行:turtle.penup(),别名:turtle.pu()
(2)落下画笔,海龟在爬行:turtle.pendown(),别名:turtle.pd()
(3)画笔宽度,海龟的腰围:turtle.pensize(width),别名:turtle.width(width)
(4)画笔颜色,海龟在涂装:turtle.pencolor(color),color为颜色字符串或rgb值
例:turtle.pencolor("purple") 或 turtle.pencolor(0.63,0.13,0.94) 或 turtle.pencolor((0.63,0.13,0.94))
3.turtle运动控制函数:控制海龟走直线还是曲线
(1)向前行进,海归走直线:turtle.forward(d),别名:turtle.fd(d),d为行进距离,可以为负数
(2)根据半径r绘制extent角度的弧形:turtle.circle(r,extent=None),r为默认圆心在海龟左侧r距离的位置,extent为绘制角度,默认是360°整圆。
4.turtle方向控制函数:控制海龟面对方向
改变行进方向,海龟走角度
(1)turtle.setheading(angle),别名:turtle.seth(angle),angle为行进方向的绝对角度。
(2)turtle.left(angle)海龟向左转 和 turtle.right(angle)海龟向右转,angle为在海龟当前行进方向上旋转的角度,即海龟角度。
5.基本循环语句
(1)循环语句:按照一定次数循环执行一组语句,格式如下:
for <变量> in range(<次数>): #<变量>表示每次循环的计数,0到<次数>-1
<被循环执行的语句>
(2)range()函数:产生循环计数序列
①range(N):产生0到N-1的整数序列,共N个。
②range(M,N):产生M到N-1的整数序列,共N-M个。
6.“Python蟒蛇绘制”代码分析
#Python蟒蛇绘制
#文件名:PythonDraw.py
import turtle
#设置窗体大小和相对位置
turtle.setup(650,350,200,200)
#移动笔的位置
turtle.penup()
turtle.fd(-250)
turtle.pendown()
#改变画笔的宽度
turtle.pensize(25)
#改变画笔的颜色
tuttle.penclor("purple")
#改变画笔的角度
turtle.seth(-40)
#绘制蟒蛇身体4节
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
#绘制蟒蛇脖子
turtle.circle(40,80/2)
turtle.fd(40)
#绘制蟒蛇头部
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
后面会出①关于图片素描化的详细分析②计算机绘图原理!
小任务:做一个自己的turtle作品,创意不限,精彩不限,回忆无限!