2018-11-1 10:06:37 [显示全部楼层]
3254浏览
查看: 3254|回复: 0

[入门教程] 【掌控】mpython-20…画圈圈,一起画圈圈

[复制链接]

弯弯绕,绕弯弯,宝宝画圈圈,圈圈画的圆圆?

问问圈圈,问问圆圆。


【掌控】mpython-20…画圈圈,一起画圈圈图1

哈哈,一首绕口令送给大家。
前面的画过点,线,方形,今天一起画圈圈。

【小思考】
掌控有个小屏幕,用它就可以玩出好多花样。
在学python时,有学到海龟库,画图很方便,特别是可以画曲线,可以有左转,右转,前进,后退……
可是mpython的画图功能不够,我在群里给工程师提了建议,哈哈,谢作如老师也有这样的提议。

在没有出来之前,我还是想画圈圈。
怎么办。

【小启发】
启发来源于向金老师的一个程序,玫瑰曲线。
很荣幸大师的文章由我代发到DF论坛。
在试玩中,我发现有一个状态,可以画出圆来。
哈哈,借用其中的一段,改成今天的画圈圈。

【开始画一个圆】
【掌控】mpython-20…画圈圈,一起画圈圈图2

[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]

代码里有注解,不多讲了,至于向老师代码中的算法,自己理解吧(我也不懂啦)。

【内切圆?】
【掌控】mpython-20…画圈圈,一起画圈圈图3

[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]

【同心圆】
【掌控】mpython-20…画圈圈,一起画圈圈图4
[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的兴趣调动起来,也不错呢。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail