宜城龙山 发表于 2022-12-8 00:38

【行空板 Python编程学习主控板评测四】Turtle海龟绘图

<div class='showpostmsg'><p><a name="_Hlk119705700"></a><b>【行空板 Python编程学习主控板评测四】Turtle海龟绘制奥运五环和桃花树</b></p>

<p align="left" >&nbsp;</p>

<p align="left" ><b>一、Turtle简介</b></p>

<p >Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。</p>

<p >行空板提供了多种编程方式,可以在Mind+环境下使用积木拖拽方式,也可以在Thonny环境下使用python语言方式编程。本文将简要介绍两种环境下如何使用Turtle绘制自己喜欢的图形。</p>

<p >Turtle是通过一系列的绘图命令实现相关功能。操纵海龟绘图有多种命令,这些命令可以分为3中,分别是:画笔运动命令、画笔控制命令和全局控制命令。</p>

<p ><b>1、画笔运动的命令</b></p>

<p >turtle.forward(a)&nbsp;&nbsp; 向当前画笔方向移动a像素长度</p>

<p >turtle.backward(a)&nbsp; 向当前画笔相反方向移动a像素长度</p>

<p >turtle.right(a)&nbsp;&nbsp;&nbsp;&nbsp; 顺时针移动</p>

<p >aturtle.left(a)&nbsp;&nbsp;&nbsp;&nbsp; 逆时针移动</p>

<p >aturtle.pendown()&nbsp;&nbsp; 移动时绘制图形</p>

<p >turtle.goto(x,y)&nbsp;&nbsp;&nbsp; 将画笔移动到坐标为x,y的位置</p>

<p >turtle.penup()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移动时不绘制图形,提起笔</p>

<p >turtle.speed(a)&nbsp;&nbsp;&nbsp;&nbsp; 画笔绘制的速度范围</p>

<p >turtle.circle()&nbsp;&nbsp;&nbsp;&nbsp; 画图,半径为正,表示圆心在画笔的左边画圈</p>

<p ><b>2、画笔控制命令</b></p>

<p >turtle.pensize(width)&nbsp;&nbsp; 绘制图形的宽度</p>

<p >turtle.pencolor()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画笔的颜色</p>

<p >turtle.fillcolor(a)&nbsp;&nbsp;&nbsp;&nbsp; 绘制图形的填充颜色</p>

<p >turtle.color(a1,a2)&nbsp;&nbsp;&nbsp;&nbsp; 同时设置pencolor=a1,fillcolor=a2</p>

<p >turtle.filling()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回当前是否在填充状态</p>

<p >turtle.begin_fill()&nbsp;&nbsp;&nbsp;&nbsp; 准备开始填充图形</p>

<p >turtle.end_fill()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 填充完成</p>

<p >turtle.hideturtle()&nbsp;&nbsp;&nbsp;&nbsp; 隐藏箭头显示</p>

<p >turtle.showturtle()&nbsp;&nbsp;&nbsp;&nbsp; 显示箭头</p>

<p ><b>3、全局控制命令</b></p>

<p >turtle.clear()&nbsp;&nbsp; &nbsp;&nbsp;清空turtle窗口,但是turtle的位置和状态不会改变</p>

<p >turtle.reset()&nbsp;&nbsp; &nbsp;&nbsp;清空窗口,重置turtle状态为起始状态</p>

<p >turtle.undo()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;撤销上一个turtle动作</p>

<p >turtle.isvisible() 返回当前turtle是否可见</p>

<p >stamp()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复制当前图形</p>

<p ><b>4、turtle命令与mind+积木对应关系(部分)</b></p>

<table align="center">
        <thead>
                <tr>
                        <td >
                        <p align="center" ><b>命令</b></p>
                        </td>
                        <td >
                        <p align="center" ><b>Mind+</b><b>图形积木</b></p>
                        </td>
                </tr>
        </thead>
        <tbody>
                <tr>
                        <td >
                        <p align="left" >turtle.pensize(width)</p>
                        </td>
                        <td >
                        <p > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.pencolor()</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.clear()</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.forward(distance)</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.left(degree)</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.goto(x,y)</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.penup()</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.speed(speed)</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td >
                        <p >turtle.circle()</p>
                        </td>
                        <td >
                        <p align="left" > &nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p align="left" ><b>二、Mind+环境绘制奥运五环</b></p>

<p align="left" >绘制奥运五环主要使用到画圆、抬笔、落笔、移动、设置笔的颜色等积木,具体使用方法不做详细介绍,上图。</p>

<p align="center" > &nbsp;</p>

<p align="center" >&nbsp;视频</p>

<p align="center" >&nbsp;</p>

<p align="center" >&nbsp;</p>

<p align="left" ><b>三、Thonny环境编程</b></p>

<p align="left" >行空板在Turtle环境下编程使用方法见<a href="https://wiki.unihiker.com/thonny" style="color:blue; text-decoration:underline">行空板官方文档-Thonny使用教程 (unihiker.com)</a>,这里不做介绍,这里仅以画一幅樱花树为例给出行空板使用Turtle编程得到的效果。程序如下:</p>

<p align="left" >from turtle import *</p>

<p align="left" >from random import *</p>

<p align="left" >from math import *</p>

<p align="left" >&nbsp;</p>

<p align="left" >def tree(n, l):</p>

<p align="left" >&nbsp;&nbsp;&nbsp; pd() # 下笔</p>

<p align="left" >&nbsp;# 阴影效果</p>

<p align="left" >&nbsp;&nbsp;&nbsp; t = cos(radians(heading() + 45)) / 8 + 0.25</p>

<p align="left" >&nbsp;&nbsp;&nbsp; pencolor(t, t, t)</p>

<p align="left" >&nbsp;&nbsp;&nbsp; pensize(n/3)</p>

<p align="left" >&nbsp;&nbsp;&nbsp; forward(l) # 画树枝</p>

<p align="left" >&nbsp;&nbsp;&nbsp; if n &gt; 0:</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = random() * 15 + 10 # 右分支偏转角度10</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c = random() * 15 + 10&nbsp; # 左分支偏转角度10</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = l * (random() * 0.25 + 0.7) # 下一个分支的长度0.7</p>

<p align="left" >&nbsp;# 右转一定角度,画右分支</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right(b)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree(n - 1, d)</p>

<p align="left" >&nbsp;# 左转一定角度,画左分支</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left(b + c)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree(n - 1, d)</p>

<p align="left" >&nbsp;</p>

<p align="left" >&nbsp;# 转回来</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right(c)</p>

<p align="left" >&nbsp;&nbsp;&nbsp; else:</p>

<p align="left" >&nbsp;# 画叶子</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right(60)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = cos(radians(heading() - 45)) / 4 + 0.5</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pencolor(n, n*0.8, n*0.8)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle(3)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left(60)</p>

<p align="left" >&nbsp;&nbsp;&nbsp; if (random()&gt;0.7):</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pu()</p>

<p align="left" >&nbsp;# 飘落</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = heading()</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; an = -40 + random()*40</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setheading(an)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)&nbsp;&nbsp; #800,400,200</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; forward(dis)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setheading(t)</p>

<p align="left" >&nbsp;</p>

<p align="left" >&nbsp;# 画叶子</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pd()</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right(90)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = cos(radians(heading() - 45)) / 4 + 0.5</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pencolor(n*0.5+0.5, 0.4+n*0.4, 0.4+n*0.4)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle(2)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left(90)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pu()</p>

<p align="left" >&nbsp;</p>

<p align="left" >&nbsp;#返回</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = heading()</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setheading(an)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backward(dis)</p>

<p align="left" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setheading(t)</p>

<p align="left" >&nbsp;</p>

<p align="left" >&nbsp;&nbsp;&nbsp; pu()</p>

<p align="left" >&nbsp;&nbsp;&nbsp; backward(l)# 退回</p>

<p align="left" >bgcolor(0.5, 0.5, 0.5) # 背景色</p>

<p align="left" >ht() # 隐藏turtle</p>

<p align="left" >speed(0) # 速度,1-10渐进,0最快</p>

<p align="left" >tracer(0, 0)</p>

<p align="left" >pu() # 抬笔</p>

<p align="left" >backward(100)</p>

<p align="left" >left(90) # 左转90度</p>

<p align="left" >pu() # 抬笔</p>

<p align="left" >backward(200) # 后退200</p>

<p align="left" >tree(13, 80) # 递归7层</p>

<p align="left" >done()</p>

<p align="left" ></p>

<p align="left" >说明:程序中部分参数可以调整,显示效果会更好一些。&nbsp;</p>

<p align="left" >通过<b>四、总结</b></p>

<p align="left" >通过在两种不同编程环境使用行空板,能够体验行空板可以适应不同环境的使用,既适合初学者,也可以让有一定python基础者发挥个人的想象力,创作更多有创意的作品。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

dcexpert 发表于 2022-12-8 10:29

<p>有点像分形</p>

lugl4313820 发表于 2022-12-8 13:45

我记得很久以前有个logo语言,跟这个有关系吗?

piazini 发表于 2023-1-28 15:49

怎么感觉这个就是广告里说的儿童编程用的那套东西。
页: [1]
查看完整版本: 【行空板 Python编程学习主控板评测四】Turtle海龟绘图