小码农

趣味编程-面向每个人的创意编程

多个变量之间的关系如下图。只要改动一个变量b1,就会影响其他变量的值,所以只要任意输入变量b1的值,风车就会实现等比例缩放。写代码之前,可以先在纸上把风车简单地画出来。再推导出几个关键线条之间的关系。这样可以减少使用电脑的时长,有效保护视力。

第1步:画风车的一个叶片

# 案例1:画风车的一个叶片
import turtle              # 导入turtle库(模块)
turtle.bgcolor("#64c6fe")  # 设置背景颜色为#64c6f,一种蓝色
turtle.speed(1)            # 设置海龟的绘图速度,参数为1时最慢

### 变量初始化设置
# b1是大等腰直角三角形的斜边,a1是直角边
b1=200                     # 只要改变b1的值,风车的大小会等比例缩放
a1=2**0.5/2*b1             # 2**0.5 表示数学中的“根号2”
# b2是小等腰直角三角形的斜边,a2是直角边
a2=b1/2
b2=2**0.5 *a2

### 画风车的叶片
# 画小的等腰直角三角形
turtle.forward(a2)
turtle.left(90)
turtle.forward(a2)
turtle.left(135)
turtle.forward(b2)
# 画大的等腰直角三角形
turtle.backward(b2)
turtle.right(90)
turtle.forward(a1)
turtle.left(135)
turtle.forward(b1)

第2步:画4个叶片+单色填充

为了使风车的叶片有层次感,小等腰直角三角形可以用较深的颜色来填充,大等腰三角形用较浅的颜色填充。

# 案例2:绘制风车(画4个叶片+单色填充)
import turtle              # 导入turtle库(模块)
turtle.bgcolor("#64c6fe")  # 设置背景颜色为,一种蓝色#64c6fe
turtle.speed(4)            # 设置海龟的绘图速度

### 变量初始化设置
# b1是大等腰直角三角形的斜边,a1是直角边
b1=200                     # 只要改变b1的值,风车的大小会等比例缩放
a1=2**0.5/2*b1             # 2**0.5 表示数学中的“根号2”
# b2是小等腰直角三角形的斜边,a2是直角边
a2=b1/2
b2=2**0.5 *a2

### 画风车,并填充颜色
for i in range(4):          # 风车有4个叶片
    # 画小的等腰直角三角形
    turtle.color("#f2b11b") # 颜色较深
    turtle.begin_fill()
    turtle.forward(a2)
    turtle.left(90)
    turtle.forward(a2)
    turtle.left(135)
    turtle.forward(b2)
    turtle.end_fill()
    # 画大的等腰直角三角形
    turtle.color("#f3d727") # 颜色较浅
    turtle.begin_fill()
    turtle.backward(b2)
    turtle.right(90)
    turtle.forward(a1)
    turtle.left(135)
    turtle.forward(b1)
    turtle.end_fill()
    # 旋转180度后,开始画下一个风车叶片
    turtle.right(180)

### 绘图结束,隐藏海龟
turtle.hideturtle()

第3步:风车上移+后面加杆

风车杆的长度用变量length表示,宽度用变量width来表示,这两个变量也要与变量b1建立数学运算关系。如下:

length=1.7*b1

width=2/15*b1

# 案例3:绘制风车(风车上移+后面加杆)

### ①程序初始化设置
import turtle              # 导入turtle库(模块)
turtle.bgcolor("#64c6fe")  # 设置背景颜色为#64c6fe,一种浅蓝色
turtle.speed(6)            # 设置海龟的绘图速度,参数为0时最快

### ②变量初始化设置
# b1是大等腰直角三角形的斜边,a1是直角边
b1=200                     # 只要改变b1的值,风车的大小会等比例缩放
a1=2**0.5/2*b1             # 2**0.5 表示数学中的“根号2”
# b2是小等腰直角三角形的斜边,a2是直角边
a2=b1/2
b2=2**0.5 *a2
# 设置风车杆的长度和宽度
length=1.7*b1
width=2/15*b1

### ③起始坐标上移
turtle.penup()
turtle.goto(0,70)
turtle.pendown()

### ④风车后面加杆
# 当b1=150时,经过不断调试,turtle.pensize(20)的效果最好。所以可以推导出风车杆粗细和b1的关系。
turtle.setheading(-90)
turtle.pensize(width)
turtle.pencolor("#5f4a1d")
turtle.forward(length)
turtle.backward(length)
turtle.setheading(0)

### ⑤画风车的4个叶片
turtle.right(22)   # 向右旋转22度后再画风车,加一定的角度,风车比较有动感
turtle.pensize(1)  
for i in range(4):
    # 画小的等腰直角三角形
    turtle.color("#f2b11b")   # 颜色较深
    turtle.begin_fill()
    turtle.forward(a2)
    turtle.left(90)
    turtle.forward(a2)
    turtle.left(135)
    turtle.forward(b2)
    turtle.end_fill()
    # 画大的等腰直角三角形
    turtle.color("#f3d727")  # 颜色较浅
    turtle.begin_fill()
    turtle.backward(b2)
    turtle.right(90)
    turtle.forward(a1)
    turtle.left(135)
    turtle.forward(b1)
    turtle.end_fill()
    # 旋转一定角度,开始画另外的风车叶子
    turtle.right(180)

### ⑥绘图结束,隐藏海龟
turtle.hideturtle()

第4步:风车(多色填充)

风车的4个叶片,分别使用4种深浅的颜色来填充。可以通过遍历颜色列表来实现。

# 深色列表

dark_color=[“#267fb9″,”#f2b11b”,”#538a30″,”#ba62c1″]

#267fb9是一种深蓝色,#f2b11b是一种深黄色,#538a30是一种深绿色,#ba62c1是一种深紫色。

# 浅色列表

light_color=[“#2aaad1″,”#f3d727″,”#7fbc2b”,”#cc81d2″]

#2aaad19是一种浅蓝色,#f3d727是一种浅黄色,#7fbc2b是一种浅绿色,#cc81d2是一种浅紫色。

# 案例4:绘制风车(多色填充)

### ①程序初始化设置
import turtle              # 导入turtle库(模块)
turtle.speed(6)            # 设置海龟的绘图速度,参数为0时最快
turtle.bgcolor("#64c6fe")  # 设置背景颜色为#64c6fe,一种蓝色

### ②变量初始化设置
# 分别创建深色和浅色列表
dark_color=["#267fb9","#f2b11b","#538a30","#ba62c1"]   # 深色列表
light_color=["#2aaad1","#f3d727","#7fbc2b","#cc81d2"]  # 浅色列表
# b1是大等腰直角三角形的斜边,a1是直角边
b1=150                     # 只要改变b1的值,风车的大小会等比例缩放
a1=2**0.5/2*b1             # 2**0.5 表示数学中的“根号2”
# b2是小等腰直角三角形的斜边,a2是直角边
a2=b1/2
b2=2**0.5 *a2
# 设置风车杆的长度和宽度
length=1.7*b1
width=2/15*b1

### ③起始坐标上移
turtle.penup()
turtle.goto(0,70)
turtle.pendown()

### ④风车后面加杆
# 当b1=150时,经过不断调试,turtle.pensize(20)的效果最好。所以可以推导出风车杆粗细和b1的关系。
turtle.setheading(-90)
turtle.pensize(width)
turtle.pencolor("#5f4a1d")
turtle.forward(length)
turtle.backward(length)
turtle.setheading(0)

### ⑤画风车的4个叶片
turtle.right(22)   # 向右旋转22度后再画风车,加一定的角度,风车比较有动感
turtle.pensize(1)  
for i in range(4):
    # 画小的等腰直角三角形
    turtle.color(dark_color[i])  # 遍历深色列表dark_color
    turtle.begin_fill()
    turtle.forward(a2)
    turtle.left(90)
    turtle.forward(a2)
    turtle.left(135)
    turtle.forward(b2)
    turtle.end_fill()
    # 画大的等腰直角三角形
    turtle.color(light_color[i])  # 遍历浅色列表light_color
    turtle.begin_fill()
    turtle.backward(b2)
    turtle.right(90)
    turtle.forward(a1)
    turtle.left(135)
    turtle.forward(b1)
    turtle.end_fill()
    # 旋转一定角度,开始画另外的风车叶子
    turtle.right(180)

### ⑥绘图结束,隐藏海龟
turtle.hideturtle()

第5步:让直线旋转起来

1. 动画的基本原理

动画的基本原理就是以超过人眼可以分辨的频率播放图片。

举例:让直线动旋转起来需要4步

step 1:清屏

step 2:画一条直线

step 3:等待 t 秒(1/t 就是刷新频率)

step 4:重复step 1,2,3

2. ontimer(  )函数

语法:turtle.ontimer(fun, t=0)

作用:安装一个计时器,在 t 毫秒后调用 fun 函数。(1秒=1000毫秒)

参数:

fun   一个无参数的函数

t   一个数值 >= 0

# 案例5:旋转的直线
import turtle             
turtle.bgcolor("black")
turtle.pencolor('red')
turtle.pensize(3)
turtle.delay(0)
turtle.speed(0)

# 自定义函数draw_line()
def draw_line():
    turtle.left(1)         # 每次旋转1度后再画直线
    turtle.clear()         # 清屏
    turtle.forward(250)
    turtle.backward(250)

# 主程序
for j in range(400):                          # 画400次直线
   turtle.ontimer(draw_line, t=50 * (j + 1))  # 安装一个计时器,t毫秒后调用fun()函数

# 绘图结束,隐藏海龟
turtle.hideturtle()

第6步:让风车旋转起来

1. 设置背景颜色方法:
import turtle
turtle.bgcolor(“black”)
2.设置背景图片方法:

import turtle

turtle.bgpic(“1.gif”)

敲重点:

1.背景图片必须是gif格式

2.图片必须和代码文件在同一个文件夹里

3.图片名称一定要使用双引号括起来

# 案例6:绘制旋转的风车

### ①程序初始化设置
import turtle               # 导入turtle库(模块)
turtle.bgpic("1.gif")       # 导入一张gif图片做背景
turtle.tracer(0)            # 没有画图过程,图形会立马呈现出最终结果    

### ②变量初始化设置
# 分别创建深色和浅色列表
dark_color=["#267fb9","#f2b11b","#538a30","#ba62c1"]   # 深色列表
light_color=["#2aaad1","#f3d727","#7fbc2b","#cc81d2"]  # 浅色列表
# b1是大等腰直角三角形的斜边,a1是直角边
b1=150                     # 只要改变b1的值,风车的大小会等比例缩放
a1=2**0.5/2*b1             # 2**0.5 表示数学中的“根号2”
# b2是小等腰直角三角形的斜边,a2是直角边
a2=b1/2
b2=2**0.5 *a2
# 设置风车杆的长度和宽度
length=1.7*b1
width=2/15*b1

### ③起始坐标上移
turtle.penup()
turtle.goto(0,70)
turtle.pendown()

### ④自定义函数fun()
turtle.right(22)   # 向右旋转22度后再画风车,加一定的角度,风车比较有动感
def fun():
    """
    函数功能:每调用一次fun(),就会在旋转1度后的新方向出现风车 
    """
    turtle.clear()
    turtle.right(1)
    for i in range(4):
        # 画小的等腰直角三角形
        turtle.color(dark_color[i])  # 遍历深色列表dark_color
        turtle.begin_fill()
        turtle.forward(a2)
        turtle.left(90)
        turtle.forward(a2)
        turtle.left(135)
        turtle.forward(b2)
        turtle.end_fill()

        # 画大的等腰直角三角形
        turtle.color(light_color[i])  # 遍历浅色列表light_color
        turtle.begin_fill()
        turtle.backward(b2)
        turtle.right(90)
        turtle.forward(a1)
        turtle.left(135)
        turtle.forward(b1)
        turtle.end_fill()

        # 旋转180度后,开始画下一片风车叶片
        turtle.right(180)


### ⑤主程序
for j in range(360):                    # 让风车旋转80次
   turtle.ontimer(fun, t=50 * (j + 1))  # 安装一个计时器,t毫秒后调用fun()函数

### ⑥绘图结束,隐藏海龟
turtle.hideturtle()

 

发表评论