今天我们将使用海龟绘图来画一个中国传统文化中的太极图。我们的太极形状主要是一个圆,中间一个S区分黑白两边,然后白色半区有一个黑色的圆,黑色半区有一个白色的圆,如上图这样。那如果我们要来画太极这样的图案的话,各位有没有思路?很多同学也能观察到,主要图形其实就是圆形,先画一个大圆,然后再画两个方向相反的半圆形成一个S型,再分别画两个小圆然后再涂上对应的颜色就好了。我们看一下下面这个动词,就是我们今天的太极画出来的整个流程。我们可以用拆解思维去把这个任务进行分析拆解,任务可以分为以下几个步骤:- 画一个比大圆小的半圆,再换一个方向,再画一个半圆,形成S形
接下来我们就可以按照这个任务流程开始程序的编写了。我们想使用海龟模块进行绘画,还是要像上节课一样导入海龟绘图(import turtle),但是这样写的话,每次写程序都要写“turtle.”比较麻烦,我们可以给这个海龟再起一个新的名字。就像很多小朋友都会有一个小名,比如皮皮、豆豆之类的,我们可以叫他的小名也代表是让这个小朋友过来。就像上图里的还是import turtle,然后要加上一个as t,这个as t就是给海龟模块起一个别的名字叫做“t”。后边我们的程序要让海龟进行绘画的时候就可以写 t点什么什么然后导入了海龟以后,我们就要开始画圆了,turtle里面有直接画圆的功能,就是t.circle()。圆这个图案很多同学也学过,一条固定长度的线段绕着一个点旋转一圈,形成的这么一个图案就是圆,所以圆有两个最重要的属性,一个是圆心,一个是半径。圆心就决定了圆在什么位置,半径就是控制了我们圆的大小,今天我们因为有画笔,所以圆的位置就是由画笔的起点决定的,但是大小我们是不是也要设置一下?下图的代码就是画圆的意思,然后里边的200意思就是圆的半径是200。然后这个括号里不光可以写正数,也可以写负数,那区别是什么呢?
比如我代码写“t.circle(100)”,我在括号里写100的话,这个圆是向箭头的左方旋转画圆的,就像如下图一样。
t.circle(-100)这段代码,就是我在小括号里写了-100,可以看到这个海龟是向着箭头的右方旋转画出来的圆形。
然后我一开始的话就直接写t.circle(200),然后会发现整个图形会偏上,所以我就要让我的海龟移动到偏下方的位置,然后才开始画下边这行代码就是让海龟移动到固定的位置上,那go to各位同学学校里可能也学过,就是去什么地方的意思,t.goto(0,-200)就是让海龟去什么地方,那小括号里写了两个数字,一个0,一个-200,中间用逗号隔开。这个0和-200就是海龟的坐标,逗号就代表间隔的意思。之前在scratch里我们也讲过,在这里给大家简单再讲一下。就像我们上学的时候,学校的桌子一般都是整整齐齐排列的,像我下面这个图一样那么我的这些桌子可以根据横着或者竖着进行排号比如说我红色的编号就是横着排的,就是第一列,第二列,第三列,绿色的编号就是竖着排的代表是第一行,第二行,第三行如果我要找到小明同学的话,就在第一列第一行,小红就在第三列第二行。像上图这样画的一条横线和一条竖线相交,然后我们可以通过这个坐标系找到平面上的任意一个点。像我们的这两条参考线相交的这个黑点就代表着整个画面的中心,也叫原点。在我们的坐标系中,如果这个黑点左右方向发生了移动,就是在x方向上移动的。那黑点的坐标是(0,0),也就是说它没有发生任何偏移,也就是说我们一进入海龟以后箭头出现的位置就是中心点的位置。比如说我红色那个点,相当于我们从黑点的位置先向右移动110步,再向上移动100步就到达了红点,那么它的坐标就是(110,100 )然后看这个绿点会发现x方向是向左移动50步,Y方向上是向上移动150的,那它的坐标是(-50,150),因为我们坐标系的规定,以原点(也就是中心黑点)向右是x轴的正方向,向左就是反方向,也就是说向右走x会不断增大,向左走x会不断减小,类似于我们数学里的数轴。对应到y轴上也是一样的道理,y轴向上是正方向,向下是反方向,所以一个点如果在0点向下移动了,那么就是y轴是个负数。那这个粉色的点,就让各位同学尝试自己去分析一下,他的坐标应该是多少?那坐标系各位有个大概的了解了,那接下来我们回到我们的任务,是想让我们的海龟往下移动一点,让我们的圆接近中心位置,所以我们的坐标设定为(0,-200),因为圆的半径是200,所以我从y轴-200的位置开始向上方画圆,刚好圆的中心就在画面的(0,0)位置。我们加上刚才写的那行代码以后圆到达中心了,但是有一条多余竖线。为什么会出现这种情况呢?因为我们的笔是一直在画面上没有离开过,所以你从中心点移动位置的时候,它也是有轨迹的,抬笔的功能是 t.penup(),pen是笔的意思,up是向上,所以其实我们写程序有没有点像英语的翻译呀?有抬笔就有落笔,因为不落笔就没有办法继续画了,落笔的功能是 t.pendown()所以我们的整个画大圆的任务就需要调整一下,代码如上图。把海龟模块导入进来 → 抬笔 → 角色移动位置 → 落笔 → 画半径200的圆。这样实现的效果就是箭头移动的过程没有轨迹,但是画圆的过程有轨迹。当然不要忘记加上“t.done()”让画面维持在我们的页面上。这一步其实就用到了我们逻辑思维里的顺序思维,因为只有按照这个顺序执行才是我们想要的效果,如果你抬笔放到移动之后,那效果就是完全不一样的了现在我们的大圆轮廓已经有了,我们的下一步是干什么来着?画半圆的时候有个注意事项,我们因为里边要放两个半圆一上一下,所以这个小圆的半径得是大圆的一半,这样两个合起来的高度正好是大圆的高度,不会有缝隙。这个其实还是circle这个功能,只是需要在后边加一个度数大小的数据,就可以控制你的圆弧画多大。写180的话就是画一个半圆,写90的话就是画直角对应的圆弧。画另外一半的圆,就要注意另一个问题了,还是半圆,所以括号里的度数还是写180,那么前边的半径这儿我们就要写-100了,因为他要往海龟的右侧画了。两个半圆画完以后,我们发现太极的轮廓其实已经出来了,那下一步呢?填充颜色,要有封闭图形,看下方的动图,我的两个图形右侧的是一个封闭的图形,就是能够完整闭合的,没有缺口的图形,而左侧很明显有一个缺口,就是未完全封闭的图形。我们同样用填充颜色的工具去填充,我们发现第一次填充右边图形时,只有图形内部是我们填充的黑色。而填充左边图形的时候,整个画面都变黑了,因为它没有封闭,这样的填充效果不是我们想要的。我们要给一个填充黑色的就是下图这样的形状,所以我们要再补全一个大的半圆,来形成一个封闭图形。那这个大圆接下来还是应该向箭头的右侧弯曲画,所以半径还是写负数,因为是大圆,所以半径应该写200,半圆的话,我们的度数大小还是写180。填充分两部分,一个是开始填充,一个是结束填充,就是在整个图形开始的时候,我要标记一下,从这里开始,然后图形画完以后再写上一行填充结束,开始和结束之间,我们画的图形就会被填充上颜色。开始填充的代码是 t.begin_fill(),begin在英语里也是开始的意思,fill就是填充,然后这根横线是下划线,就是在英文输入法的时候按下shift键的同时再按下键盘上“0键”右边的“-”键。结束填充的代码是 t.end_fill(),end就是结束的意思所以这两行代码我们应该加在什么地方呢?如上图,我们的开始填充应该加在第一个半圆开始画之前然后结束填充应该在大圆画完之后现在画完了,我们的太极也填充一半颜色了,下一个任务呢?下一个任务是画下方白色区里的黑色小圆,画小圆的逻辑就是先抬笔,然后移动到坐标(0,-80)的位置,然后落下笔开始画,然后就是标记一下,开始填充,然后画一个小圆,再然后就是结束填充,我们的小圆就出来了。这里我们这个小圆的起点坐标为什么是(0,-80)呢?因为我们想要让小圆在整个下半部分的中心,也就是圆心得在-100的位置,那我画圆不是从圆心开始画,而是从边上开始画,所以我就得再往上挪20格的位置,也就是-80的位置第二个小圆逻辑就和第一个小圆没有太大的区别了,只有坐标的位置不同,而且我们第二个圆应该是一个白色的,所以在开始填充以后要把画笔换一个颜色我们上节课学了设置颜色的方法是t.color(),我们在里边写上白色white就可以了。最后一个任务就是隐藏海龟了,这个我们上节课也学过,就是t.hideturtle()创意修改:
1.可以调节笔的粗细: t.pensize(8),括号里的数值越大,笔就越粗。
2.修改太极的半径大小,画出更大或者更小的太极图。
完整程序如下图所示: