2018-10-3 20:32:08 [显示全部楼层]
6593浏览
查看: 6593|回复: 6

[入门教程] 【数学之美】玫瑰曲线&正弦波

[复制链接]
本帖最后由 rzyzzxw 于 2018-10-3 20:32 编辑

数学美有别与其它的美,它没有鲜艳的色彩,没有美妙的声音,没有动感的画面,它却是一种独特的美。
当python与数学相遇,在esp32+12864OLED屏上刻画出眩目的美。

特别声明,程序由向金老师和祝良友老师合作完成。
我不生产程序,只负责显摆。

【数学之美】玫瑰曲线&正弦波图1
【数学之美】玫瑰曲线&正弦波图2
祝老师的视频效果晒在圈子里,惊艳了我们。


赶紧厚脸皮讨要程序来玩。
在掌控上运行一下。



【相关资料】
1、玫瑰曲线
平面内,围绕某一中心点平均分布整数个正弦花瓣的曲线.
在极坐标下可表示为ρ=a*sin(nθ),a为定长,n为整数.
在极坐标系中,以下方程表示的曲线称为玫瑰曲线:
r = sin ( k θ ) 或 r = cos ( k θ )
当 k 是奇数时,玫瑰曲线有 k 个花瓣;当 k 是偶数时,玫瑰曲线有 2k 个花瓣。执行效果如上图:
可以按 A-Z 和 a-z 调整参数,绘制不同的玫瑰曲线。例如,k = n / d = 2 / 1,就是四叶玫瑰曲线,k = n / d = 3 / 1,就是三叶玫瑰曲线。
2、正弦函数是数学领域的一个定义。正弦函数是三角函数的一种,在直角三角形ABC中,∠C=90°,AB是∠C的对边c,BC是∠A的对边a,AC是∠B的对边b,正弦函数就是sinA=a/c,即sinA=BC/AB。定义:对于任意一个实数x都对应着唯一的角(弧度制中等于这个实数),而这个角又对应着唯一确定的正弦值sin x,这样,对于任意一个实数x都有唯一确定的值sin x与它对应,按照这个对应法则所建立的函数,表示为f(x)=sin x,叫做正弦函数。正弦函数的定理:在一个三角形中,各边和它所对角的正弦的比相等,即a/sin A=b/sin B=c/sin C。

【数学之美】玫瑰曲线&正弦波图3
好吧,上面复制资料完毕,分享程序。
程序由向老师和祝老师授权,感谢两位大师。

[mw_shl_code=python,true]from mpython import *
import time,math
def DrawRoseCurve(a,n):
    for t in range(0,360):#循环次数,由于是画一圈,所以是360;可以自行设定
        x = math.floor(math.cos(t)*a*math.sin(n*t))#计算x坐标的值,注意:这里需要取整
        y = math.floor(math.sin(t)*a*math.sin(n*t))#计算y坐标的值,并且取整
        display.pixel(x+64,y+45,1) #显示坐标像素点,为什么要+64、+32,哪是因为要把中心坐标(64,32)作为起点
        display.show() #执行


def DrawSinCurve(a=25,n=1):#a表示正弦波的幅度,n表示几个波形
    if a>25 :
      a=25
    if n>5:
      n=5
      
    for t in range(0,127):#画横坐标
       y=25+14
       x=t
       display.pixel(x,y,1)
       if t%10 ==0 :
         display.show()

    for t in range(1,4):#画横坐标箭头
        display.pixel(127-t,39-t,1)
        display.pixel(127-t,39+t,1)
    display.show()

    for t in range(0,63):#画纵坐标
        y=63-t
        x=63
        display.pixel(x,y,1)
        if t%10 ==0 :
            display.show()

    for t in range(1,4):#画纵坐标箭头
        display.pixel(63-t,0+t,1)
        display.pixel(63+t,0+t,1)
    display.show()
   
    for t in range(1,5):#画横坐标刻度线
        display.pixel(63+t*12,38,1)
        display.pixel(63-t*12,37,1)
        display.pixel(63+t*12,36,1)
        display.pixel(63-t*12,35,1)
    display.show()
    for t in range(0,5):#画纵坐标刻度线
        display.pixel(63,63-12*t,1)
        display.pixel(64,63-12*t,1)
        display.pixel(65,63-12*t,1)
        display.pixel(66,63-12*t,1)
    display.show()
    time.sleep(1)
      
    for t in range(0,127):#画弦波图形
        y=25-int(math.sin((3.14/180)*(t*120/127)*3*n)*a)
        x=t
        display.pixel(x,y+14,1)
        display.show()

def main():
    display.fill(0)
    display.DispChar('玫瑰曲线',0, 0)
    DrawRoseCurve(30,3)
    display.fill(0)
    display.DispChar('正弦波',68, 0)
    DrawSinCurve(25,1)

main()[/mw_shl_code]

程序自己悟哈,不要问我,除了字母都认识,我也不懂。

俗人  初级技师

发表于 2018-10-4 15:02:08

厉害厉害666
回复

使用道具 举报

rzegkly  版主

发表于 2018-10-4 17:13:47

艺术之美 自然之美
回复

使用道具 举报

szjuliet  版主

发表于 2019-4-16 15:49:34

显示语法错误:“NameError: name 'display' is not defined”,是什么原因呢?另外一个立方体程序也是报是相同的错误。
回复

使用道具 举报

szjuliet  版主

发表于 2019-4-16 21:36:58

szjuliet 发表于 2019-4-16 15:49
显示语法错误:“NameError: name 'display' is not defined”,是什么原因呢?另外一个立方体程序也是报是 ...

知道了,应该是老版本,用display,新版本使用oled,把所有的display替换为oled就可以了
回复

使用道具 举报

rzyzzxw  版主
 楼主|

发表于 2019-4-17 10:16:59

szjuliet 发表于 2019-4-16 21:36
知道了,应该是老版本,用display,新版本使用oled,把所有的display替换为oled就可以了 ...

对啊,新版固件有很多新内容。
回复

使用道具 举报

xiaohe9527  高级技师

发表于 2019-4-23 15:11:23

程序自己悟,字母大家都懂的,这句666 
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail