rzyzzxw 发表于 2018-11-4 11:55:53

【掌控】mpython-21…这是一个有”水平“的掌控

一张图片,记录了地质年代的水平面。{:5_141:}


画了圈圈之后,大圣老师提了一个问题,这么有水平的掌控,能不能做个水平仪出来。这是个没有水平的问题。
深入一想,前面我从玫瑰曲线探索来的画圆方法不是实时画圆,不能用啊。
可是画方我会啊。
先用方形做个水平仪吧。

【小目标】
水平仪
学习加速度传感器使用及相关算法。
练习自定义函数等知识。

【画个实心方形】
实心方形,中心点在64,32。
因为方形的起点是在左上角点,所以,用方形中心点要进行些坐标换算。


from mpython import *

display.fill(0)

display.fill_rect(50, 20, 24, 24, 1)
display.show()


【水平仪:仔细看,有一个小点点】
http://v.youku.com/v_show/id_XMzkwMzEwNTA2NA==.html?spm=a2h3j.8428770.3416059.1
from mpython import *

rectx = 0
recty = 0
while True:
    display.fill(0)
    display.rect(56,24,17,16,1)
    display.rect(61,28,7,7,1)
    x = accelerometer.get_y()
    y = accelerometer.get_x()
    rectx = 128-int(x*64+64)
    recty = int(y*32+32)
    display.pixel(rectx, recty, 1)
    display.show()
【小点点太太太小,换个小方形】
http://v.youku.com/v_show/id_XMzkwMjk1MDc1Ng==.html?spm=a2h3j.8428770.3416059.1

这个代码是在上面基础上改了一下下。
变小点为方形,并转换了坐标位置。

from mpython import *

rectx = 0
recty = 0
while True:
    display.fill(0)
    display.rect(56,24,17,16,1)
    display.rect(61,28,7,7,1)
    x = accelerometer.get_y()
    y = accelerometer.get_x()
    rectx = 128-int(x*64+64)
    recty = int(y*32+32)
    display.fill_rect(rectx-3, recty-3, 5, 5, 1)
    display.show()
【换成圆圈圈】
http://v.youku.com/v_show/id_XMzkwMjk1MTM5Mg==.html?spm=a2h3j.8428770.3416059.1

谢谢李时念老师的画圆圈代码。

#水平仪 画圆代码作者李时念老师
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)


while True:
    display.fill(0)
    drawcircle(64, 32, 16, 1, 0)
    drawcircle(64, 32, 10, 1, 0)
    x = accelerometer.get_y()
    y = accelerometer.get_x()
    rectx = 128-int(x*64+64)
    recty = int(y*32+32)   
    # drawcircle(64, 32, 32, 1, 0)
    # drawcircle(64, 32, 24, 1, 1)
    # drawcircle(64, 32, 16, 0, 0)
    drawcircle(rectx, recty, 8, 1, 1)
    display.show()

【拓展一下】
1、当达到水平时,亮绿灯。
2、自己来个更好的创意。
http://v.youku.com/v_show/id_XMzkwMzE5MTc1Mg==.html?spm=a2h3j.8428770.3416059.1
#水平仪 画圆代码作者李时念老师
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)


while True:
    display.fill(0)
    drawcircle(64, 32, 16, 1, 0)
    drawcircle(64, 32, 10, 1, 0)
    x = accelerometer.get_y()
    y = accelerometer.get_x()
    rectx = 128-int(x*64+64)
    recty = int(y*32+32)   
    # drawcircle(64, 32, 32, 1, 0)
    # drawcircle(64, 32, 24, 1, 1)
    # drawcircle(64, 32, 16, 0, 0)
    drawcircle(rectx, recty, 8, 1, 1)
    display.show()
    if rectx == 64 and recty == 32:
      rgb.fill((0, 60, 0))
      rgb.write()
    else:
      rgb.fill((0, 0, 0))
      rgb.write()
我家小朋友说,气泡是向上走的,所以代码改下。

#水平仪 画圆代码作者李时念老师
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)


while True:
    display.fill(0)
    drawcircle(64, 32, 16, 1, 0)
    drawcircle(64, 32, 10, 1, 0)
    x = accelerometer.get_y()
    y = accelerometer.get_x()
    rectx = 128-int(x*64+64)
    recty = int(y*32+32)   
    # drawcircle(64, 32, 32, 1, 0)
    # drawcircle(64, 32, 24, 1, 1)
    # drawcircle(64, 32, 16, 0, 0)
    drawcircle(128-rectx, 64-recty, 8, 1, 1)
    display.show()
    if rectx == 64 and recty == 32:
      rgb.fill((0, 60, 0))
      rgb.write()
    else:
      rgb.fill((0, 0, 0))
      rgb.write()

改成中心圆点不动,圆环动。
http://v.youku.com/v_show/id_XMzkwMzQxMTUyMA==.html?spm=a2h3j.8428770.3416059.1%5B

哈哈,一起创造吧。
大圣老师,你这是写帖子吗,记录了一步步的思考过程罢了。

李时念老师说让我开阔思路,大家继续一起帮我想想呗。

页: [1]
查看完整版本: 【掌控】mpython-21…这是一个有”水平“的掌控