4909| 0
|
[入门教程] 【掌控】mpython-20…画圈圈,一起画圈圈 |
弯弯绕,绕弯弯,宝宝画圈圈,圈圈画的圆圆? 问问圈圈,问问圆圆。 哈哈,一首绕口令送给大家。 前面的画过点,线,方形,今天一起画圈圈。 【小思考】 掌控有个小屏幕,用它就可以玩出好多花样。 在学python时,有学到海龟库,画图很方便,特别是可以画曲线,可以有左转,右转,前进,后退…… 可是mpython的画图功能不够,我在群里给工程师提了建议,哈哈,谢作如老师也有这样的提议。 在没有出来之前,我还是想画圈圈。 怎么办。 【小启发】 启发来源于向金老师的一个程序,玫瑰曲线。 很荣幸大师的文章由我代发到DF论坛。 在试玩中,我发现有一个状态,可以画出圆来。 哈哈,借用其中的一段,改成今天的画圈圈。 【开始画一个圆】 [mw_shl_code=python,true]from mpython import * import math # 引入数学库文件 # 输入圆起点坐标(圆最上面的点,不是圆心)和半径 x = 64 y = 0 r = 30 # 自定义函数,绘制一个圆 def DrawRoseCurve(a): for t in range(0,360): # 循环次数,由于是画一圈,所以是360;可以自行设定 X = math.floor(math.cos(t)*a*math.sin(t)) # 计算x坐标的值,注意:这里需要取整 Y = math.floor(math.sin(t)*a*math.sin(t)) # 计算y坐标的值,并且取整 display.pixel(X+x,Y+y,1) # 显示坐标像素点,为什么要+x、+y,哪是因为要把坐标(x,y)作为起点 display.show() # 执行 d = 2 * r # 直径d display.fill(0) DrawRoseCurve(d) [/mw_shl_code] 代码里有注解,不多讲了,至于向老师代码中的算法,自己理解吧(我也不懂啦)。 【内切圆?】 [mw_shl_code=python,true]from mpython import * import math # 引入数学库文件 # 输入圆起点坐标(圆最上面的点,不是圆心) x = 64 y = 0 # 自定义函数,绘制一个圆 def DrawRoseCurve(a): for t in range(0,360): # 循环次数,由于是画一圈,所以是360;可以自行设定 X = math.floor(math.cos(t)*a*math.sin(t)) # 计算x坐标的值,注意:这里需要取整 Y = math.floor(math.sin(t)*a*math.sin(t)) # 计算y坐标的值,并且取整 display.pixel(X+x,Y+y,1) # 显示坐标像素点,为什么要+x、+y,哪是因为要把坐标(x,y)作为起点 display.show() # 执行 display.fill(0) for i in range(1, 7): d = 2 * i * 5 # 直径d DrawRoseCurve(d) [/mw_shl_code] 【同心圆】 [mw_shl_code=python,true]from mpython import * import math # 引入数学库文件 # 自定义函数,绘制一个圆 def DrawRoseCurve(a): for t in range(0,360): # 循环次数,由于是画一圈,所以是360;可以自行设定 X = math.floor(math.cos(t)*a*math.sin(t)) # 计算x坐标的值,注意:这里需要取整 Y = math.floor(math.sin(t)*a*math.sin(t)) # 计算y坐标的值,并且取整 display.pixel(X+x,Y+y,1) # 显示坐标像素点,为什么要+x、+y,哪是因为要把坐标(x,y)作为起点 display.show() # 执行 display.fill(0) # 输入圆起点x坐标(圆最上面的点,不是圆心) x = 64 for i in range(1, 7): y = 32 - i * 5 # 圆起点y坐标 d = 2 * i * 5 # 直径d DrawRoseCurve(d) [/mw_shl_code] 【李时念老师的画圆代码】 大家可以研究下,获取更多的启发。 [mw_shl_code=python,true]# 画圆 代码作者 李时念老师 from mpython import * import math def drawcircle(x,y,r,color,full = 0) : if(full == 0) : for i in range(x-r,x+r+1): display.pixel(i,int(y-math.sqrt(r*r-(x-i)*(x-i))),color) display.pixel(i,int(y+math.sqrt(r*r-(x-i)*(x-i))),color) for i in range(y-r,y+r+1): display.pixel(int(x-math.sqrt(r*r-(y-i)*(y-i))),i,color) display.pixel(int(x+math.sqrt(r*r-(y-i)*(y-i))),i,color) else : for i in range(x-r,x+r+1): a = int(math.sqrt(r*r-(x-i)*(x-i))) display.vline(i, y - a, a * 2,color) for i in range(y-r,y+r+1): a = int(math.sqrt(r*r-(y-i)*(y-i))) display.hline(x - a, i, a * 2, color) display.fill(0) drawcircle(64, 32, 32, 1, 0) drawcircle(64, 32, 24, 1, 1) drawcircle(64, 32, 16, 0, 0) drawcircle(64, 32, 8, 0, 1) display.show()[/mw_shl_code] 【小结一下】 这个画圈圈只能做些静态的圆,要让它动起来,就不行了。 不过也很有趣了呢。 在还没有掌控版海龟库的时候,也胜过没有呢。 【小拓展】 结合加速度计,做个水平仪如何。 虽然慢点,在屏幕上画些有些变化圈圈,也有很多玩法呢。 掌控,为编程教育而生,如果就此,把孩子们学python的兴趣调动起来,也不错呢。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed