弧形的绘制
学习目标
- 学习circle函数的第二个参数的使用
- 绘制花瓣图形
告知学生本节课结束将要绘制的图形,激发学生学习兴趣。
内容分析
弧形在初中也是属于比较难的内容,所以我们不能从纯粹数学的角度来学习,需要引入运动的思想来看到turtle库中圆形和弧形的绘制:circle(100)除了可以是绘制半径为100的圆之外,还可以用运动的思想描述为距离某个点100像素转一圈,这样,弧形的绘制就是围绕特定的点转指定的度数,这个跟学生的日常经验相匹配,这样画圆和画弧形在思路上就是一致的,不过是读数的差别,而画圆360°可以省略。
可以通过 heading
方法让学生观察小乌龟的角度,从而理解画弧与角色旋转角度的关系。
from turtle import *
print(heading())
circle(200, 70)
left(110)
print(heading())
circle(200,70)
left(110)
done()
而且这种方式绘制花瓣的好处是,跟绘制三角形一样绘制完会回到初始状态,有利于花朵的绘制, 小乌龟绘制图像其实也是基于运动的思想,那么小乌龟绘制弧形对应的圆心角与旋转角度的关系通过 heading
方法来观察就是了,严格的证明对低年级来说是很困难的。
录播课的关卡设计,要么是驻点答题的形式,要么是code.org加上内嵌的视频,要么是讲解+练习+讲解+练习,个人倾向于最后一种。
关卡设计
L1:复习绘制圆
提示:图中月的半径是100,请你写出绘制这个圆的程序。观察乌龟是按顺时针运动还是逆时针运动。意图:带领学生复习用circle绘制圆。本关可以给学生必要的提示,可以是circle的描述,也可以是小视频或者动画。
L2:circle参数为负数
提示:这两个圆的半径都是100,请用两行代码画出上述图案。意图:考察circle第一个参数为负数的情况。学生成功后提示,circle函数的参数无论正负,都可以画一个圆,乌龟都是在半径为100的圆上走了一圈,区别是如果circle第一个参数是整数,那么就在乌龟的左边画圆;如果是负数,就在乌龟的右边画圆。
L3:考察对乌龟旋转的理解
提示:请用三行代码画出上面的图案,提示如下
circle(100)
left()
circle()
意图:三行代码,需要旋转乌龟。
L4:考察对于乌龟旋转的理解
提示:三个圆的半径都是100,你能够画出这个图形么?画完每个圆,乌龟旋转的角度是相同的,乌龟需要旋转多少度呢?意图:考察画完图形之后,旋转,为画滑板做准备。
L4:六个圆组成的图案
提示:图中6个圆的半径都是100,请用最少的代码画出来。意图:部分学生可能会用循环。
L5:再次回归cirlcle函数
讲解:circle可以画圆,第一个参数的正负决定了在乌龟当前朝向的左边画圆,还是右边画圆。如果正数和负数的数值相同,比如都是100,那么画出的圆大小是相同的。https://pic3.zhimg.com/v2-8fd2d47a20aaad898aa8ebdb8800b0ca_b.webp
我们知道 circle(100)
意味着在一个它左边的半径为100的圆上走了一圈,也就360°。如果乌龟不走一圈,只走90°的话,走出来的是什么图形呢?
![b78515de64addccaee15adf10c598b7e.png](https://i-blog.csdnimg.cn/blog_migrate/441c358a3854da02ad8fd52e6fcbc275.png)
L5:学习circle第二个参数
提示:如果乌龟只转90°而不是一圈,那么应该是画框的这个形状,我们知道一圈是360°,那么90°是1/4圈,所以应该是画框的图3。猜一下第二幅图是多少度?对了180°。
我们不仅可以命令小乌龟围着指定半径的圆转一圈,还可以让乌龟转指定的角度。其实我们如果只告诉乌龟圆的半径,乌龟就默认转一圈,我们也可以告诉他需要转多少度,怎么告诉呢?circle命令还可以接受第二个参数。circle(100,90)
我们知道circle是命令的名称,参数放到命令后边的括号里,在括号里如果需要提供两个参数,只需要把这两个参数都放到括号中,并用逗号分开就可以了。比如 circle(100,90)
就是告诉乌龟,围绕半径为100的圆转90度。试着写出围绕半径为100的圆转100°的命令。
L6:圆弧的概念
小乌龟围绕一个圆转特定角度形成的图形叫做弧形。乌龟的起始位置是弧形的起点,乌龟终止的位置是乌龟的终点。一段圆弧的终点可以是另外一段圆弧的终点。所以小乌龟从A点爬到B点形成的圆弧就是弧AB,从B点爬到A点形成的弧形就是弧BA。试着让乌龟连续三次围绕上面这个半径为100的圆转120°的命令,仔细观察小乌龟的运动。
circle(100, 120)
circle(100, 120)
circle(100, 120)
意图:让学生理解,画弧的起点可以是任意的。
L7:第二个参数为负
提示:圆弧AB是小乌龟从A点爬到B点,并且圆弧AB是小乌龟沿着圆转了80°。
那么让小乌龟错从B爬到A的命令应该怎么写呢?从A到B逆时针转了80°,从B到A其实转过的也是80°,区别在于方向相反,我们可以给度数加一个负号,-80°,表示,乌龟从B到A顺时针转了80°,命令就是
circle(100,-80)
注意作为参数,不需要写°。
L8:练习第二个参数的使用
提示:小乌龟从弧形的起点A爬到重点B爬了180°,你能写出让小乌龟从A爬到B,再从从B退回A的代码么?思考下小乌龟在B点朝向的角度是多少?(90°)
L9:练习第二个参数的使用
提示:小乌龟从弧形的起点A爬到重点B爬了180°,你能写出让小乌龟从A爬到B,再从从B退回A的代码么?思考下小乌龟在B点朝向的角度是多少?小乌龟开始的角度是0°,绕着圆转了180°后,朝向180°;转了90°后,朝向80°,是不是从水平方向开始,乌龟转了多少度,就朝向多少度呢?我们可以用
heading()
命令来查看小乌龟任意时刻朝向的角度。
circle(100,13)
print(heading())
# 输出13
你可以任意改变第二个参数的值,发现结论是成立的;如果是负数,比如-30,那么朝向就是330了,360°减去30就是330了。
L10:绘制单个花瓣
提示:观察上面的图形,这个图形关于直线AB对称,如何绘制这个图形呢?我们来分析下运动的过程,乌龟从A爬到B是顺时针,从B爬到A也是顺时针,所以弧AB和弧BA是沿着相同的方向转过了相同的度数形成了这个图形。
如果乌龟沿着直线从A开始,头朝B爬到B,在从B开始,头朝着A爬到A,那么只需要在B点乌龟需要旋转多少度呢?(演示动画)想象下,你从A走到B,如果想面向A从B走到A的话,需要向后转180度。
我们来观察上面这个图,实际上,蓝色的弧AB转180°就可以跟或弧AC重合了。换句话说,蓝色的弧AB是乌龟从水平向右开始,围绕半径为100的圆逆时针转了80度形成的。而弧AC是从水平向左开始,围着半径为100的圆逆时针转了80°形成的。如果小乌龟在B点也转到水平向左也就180°,那么沿着半径为100的圆转逆时针转80°也就画出跟弧AC一样的弧了。我们知道到了B点,小乌龟的朝向跟转过的角度相同,都是80°,想要转到水平朝右的180°,只需要转180-80度就可以了。
circle(100,80)
left(180-80)
circle(100,80)
运行上述代码,观察小乌龟的运动。尝试改变小乌龟转过的角度,观察绘制出的图形。不同角度绘制的图形可能如上图。
L11:乌龟转回原来的角度
提示:我们知道乌龟绘制正多边形的时候,都会转回原来的角度,我们也要转回去。用 heading()
方法查看下面代码执行后的朝向。
circle(100,80)
left(180-80)
circle(100,80)
print(heading()) # 260°
我们知道想要小乌龟转回元老的角度,只需要转一圈就可以了,画完的时候小乌龟转了260°,只需要再转360减去260°等于100°就可以转回初始位置了。
circle(100,80)
left(180-80)
circle(100,80)
print(heading()) # 260°
left(360-260)
print(heading()) # 260°
其实两次旋转的都是100°,加上小乌龟在圆弧上转的80°,相当于每次转了180°,跟从线段A到B再向后转走到B类似,我们知道,180°乘以2是360°,而画正三角形是每次转120°,乘以3是360°,画正四边形是每次转90°,乘以4是360°,以此类推,你能发现什么规律么?拓展:你能绘制这个图形么(选做),跟绘制正三角形有点类似哦,其实画每个弧都是转120°,只不过,小乌龟先转了一定的读数呢。
L12:画花瓣
提示:因为每次画完,单个花瓣,小乌龟都会回到原来的朝向,我们在画完再旋转一个角度,并再画一个花瓣,就可以画出有意思的图形了:
from turtle import *
speed(0)
circle(100, 70)
left(180 - 70)
circle(100, 70)
left(180 - 70)
left(120)
circle(100, 70)
left(180 - 70)
circle(100, 70)
left(180 - 70)
left(120)
circle(100, 70)
left(180 - 70)
circle(100, 70)
left(180 - 70)
left(120)
运行代码会得到下面的图案,尝试把70度改成其他角度,观察绘制的图案;尝试改变画每个花瓣画完后旋转的角度。可以先用复制代码的方式画出图案,然后试着用单个循环简化代码。
bonus
from turtle import *
speed(0)
def a(n,angle):
for i in range(n):
circle(20,angle)
left(360/n-angle)
a(10,270)
done()