上一篇我们介绍了一种手绘玫瑰的方法,你当然也可以用类似的方法画一朵或者几朵樱花 咯,看你的艺术底子了。

不过今天我们用优美的数学方法来画樱花,也会很漂亮的。

先画朵太阳花暖暖身吧。

import turtle                           # 导入海龟作图函数库
from mylib.myflowers import *           # 导入自定义的画花函数库tt = turtle.Turtle()                    # 产生一个海龟,名叫tt
sunflower(tt,"orange")                  # 调用自定义的画太阳花的函数
tt.hideturtle()                         # 隐藏海龟箭头turtle.done()                           # 画画结束

画出来的效果是这样的:

哇,这么有格局的太阳花,也只要五六行代码么?哦哦,没那么简单,我们只是把画花的部分自定义了一个函数sunflower( ),并且把它放到了另外一个文件里而已。注意到这句话了吗:

from mylib.myflowers import *          

它的意思就是从mylib.myflowers模块里,导入自定义的画花函数库。这个模块是一个名为myflowers.py文件,放在mylib目录下,如下图所示:

这是在Pycharm里面的项目目录结构,其它平台上可能有所不同。并且,myflowers.py还用到了mymath.py,后者定义了最大公约数和最小公倍数怎么算(不要觉得脑壳疼,这是小学数学的内容而已喔)。这两个文件的源代码,请见本文附录,里面的数学公式看不懂略过亦无妨。

为什么要用到这些数学知识呢?因为我们是用一种叫做hypotrochoid(内转轨迹线)的方法在画图。名字很拗口,其实就是用一个小圈套在大圈里滚动作图而已。若有兴趣探究一下可以看看这个网站(Hypotrochoid)。

通过调整公式和参数,可以得到不同的轨迹线,也就可以组合出各种“花”来了。

下面我们画樱花,也是用到这种线中的一类,叫“玫瑰线”,名字好听一点吧?主程序如下:

import turtle
from random import *
from mylib.myflowers import *                               # 导入自定义的画花的函数库win = turtle.Screen()
win.bgcolor('#8A5370')                                      # 背景设为深紫色
tt = turtle.Turtle()
color_table = ['#EBD6D9', '#C46C98', '#DB91B2']
size_table = [1, 1, 1, 1, 2, 2, 2, 3, 4]N = 25                                                      # 一共画N朵樱花
for i in range(N):size = size_table[randint(0,len(size_table)-1)]         # 随机选择一种花瓣大小color = color_table[randint(0,len(color_table)-1)]      # 随机选择一种花瓣颜色angle = pi * random()                                   # 随机选择花瓣方向x0 = randint(0, 600) - 300                              # 随机选择位置横坐标y0 = randint(0, 600) - 300                              # 随机位置纵坐标sakura(tt, size, x0, y0, angle, color, 'fastest')       # 调用自定义画花函数库中的"樱花"函数tt.hideturtle()                                             # 隐藏海龟箭头
turtle.done()

同样,我们用到了自定义画花函数模块中的一个函数,叫sakura( ),使用了很多参数,因为我们要画好多樱花,每一朵的位置、大小、方向、颜色都是随机产生的。这样更真实嘛!

Python落樱图https://www.zhihu.com/video/1239311228306190336

好了,这就是我们今天画的“落樱图”。哈哈,我的艺术水平就止步于此了,看看你有没有更好的创意吧?

动手练习:

  1. 拷贝或到下面的github网址下载源代码,放到你的编程平台上,注意两个函数库模块文件,要保持原来的目录结构。调试运行无误。
  2. 随意调节myflowers.py文件中sunflower( )函数中的r、R、d三个参数,看看你会得到什么样不同的“花”。
  3. 自己写代码,画一个五角星,并填上金色。(提示:​你可以Google搜索“Python五角星”找现成的代码加以改造,或者完全自己写——例如画五条线段,每次转弯144度,或者严谨一点,画十条线段,转弯方法你得琢磨一下。)

Python自然学习法全部源代码网址:

  • https://github.com/globien/easy-python
  • https://gitee.com/globien/easy-python

相关阅读:用Python画樱花?想得美就能画得美(上)

这里是《简单又好玩的Python》,欢迎关注。


附录一:myflowers.py源代码

from math import *
from mylib.mymath import *              # 导入自定义的数学函数库# 自定义太阳花函数
def sunflower(tt, color = 'orange'):r = 25R = 120d = 50tt.penup()tt.color(color)tt.pensize("2")tt.begin_fill()theta = 0while theta <= 2 * pi * least_common_multiple(r, R)/R + 0.01:  # 多画0.01弧度避免有缺陷x = (R-r) * cos(theta) + d * cos((R - r) / r * theta)y = (R-r) * sin(theta) - d * sin((R - r) / r * theta)tt.goto(x, y)tt.pendown()theta += pi/100tt.end_fill()# 自定义樱花函数
def sakura(tt, size = 3, x0 = 0, y0 = 0, angle = 0, color ='#EBD6D9', speed = 'fastest'):# 画花瓣p = 5q = 3R = size * 15tt.penup()tt.color(color)tt.pensize("2")tt.begin_fill()tt.speed(speed)theta = 0while theta <= pi * q + 0.01:       # 多画0.01弧度避免缺陷x = R * cos(p / q * theta + angle) * cos(theta + angle) + x0y = R * cos(p / q * theta + angle) * sin(theta + angle) + y0tt.goto(x, y)tt.pendown()theta += pi/Rtt.penup()tt.end_fill()# 画花蕊tt.color('#B17085')tt.begin_fill()r = sizeR = size * 5d = r * 1.3angle = angle * pi/5theta = 0while theta <= 2 * pi * least_common_multiple(r, R) / R + 0.01:  # 多画0.01弧度避免有缺陷x = (R - r) * cos(theta + angle) + d * cos((R - r) / r * theta + angle) + x0y = (R - r) * sin(theta + angle) - d * sin((R - r) / r * theta + angle) + y0tt.goto(x, y)tt.pendown()theta += pi / Rtt.end_fill()tt.penup()if __name__ == '__main__':                          # 测试用,仅在本文件为主程序时,才会执行下面的代码import turtlett = turtle.Turtle()sunflower(tt,'orange')win = turtle.Screen()win.bgcolor('#8A5370')sakura(tt, 3, 0, 0, 0, "pink", 'fastest')tt.hideturtle()turtle.done()

附录二:mymath.py源代码

def greatest_common_divisor(m,n):while m!=n:if m > n :m = m - nelse:n = n - mreturn mdef least_common_multiple(m,n):return m * n // greatest_common_divisor(m,n)if __name__ == "__main__" :m,n = eval(input('请输入两个正整数(逗号隔开):'))print('m =',m, ', n =',n)print('它们的最大公约数是:', greatest_common_divisor(m,n))print('它们的最小公倍数是:', least_common_multiple(m,n))

python canvas画弧度_用Python画樱花?想得美就能画得美(下)相关推荐

  1. python canvas画弧度_只要十分钟,python绘图神器turtle了解一下?

    python的强大在于它有许多的强大的库,turtle就是其中之一. 利用turtle,你可以进行交互式的绘画,作为一个艺术白痴,想要画一幅画可能很困难,但是利用python的turtle库,只需要几 ...

  2. python canvas画弧度_「万圣节教程」不给糖就捣乱,用Python绘制有趣的万圣节南瓜怪...

    关于万圣节 万圣节又叫诸圣节,在每年的11月1日,是西方的传统节日;而万圣节前夜的10月31日是这个节日最热闹的时刻.在中文里,常常把万圣节前夜(Halloween)讹译为万圣节(All Saints ...

  3. python canvas画弧度_趣玩 Python 之绘制基本图形

    Python中的类库极其丰富,数据科学中经常会用到可视化技术.今天我们来一学习一下Python中基本图形的绘制方法,本文我们将主要基于turtle(小乌龟)库来画图~ 为了方便后面进行交互性演示,这里 ...

  4. 用python画明星_用python画一只可爱的皮卡丘实例

    效果图片# !\/usr\/bin\/env python # - * -编码:utf - 8 - *\u2014\u2014从龟进口*\u201C画皮卡丘的头\u201Cdef的脸(x, y):\u ...

  5. python画图皮卡丘_用python画一只可爱的皮卡丘

    #!/usr/bin/env python # -*- coding:utf-8 -*- from turtle import * ''' 绘制皮卡丘头部 ''' def face(x,y): &qu ...

  6. python画抛物线_在python中利用最小二乘拟合二次抛物线函数的方法

    1.最小二乘也可以拟合二次函数 我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的.下面我们就来试试用最小二乘来拟合抛物线形状的的图像. 对于二次函数 ...

  7. python画樱桃小丸子_学python画图最快的方式——turtle小海龟画图

    原标题:学python画图最快的方式--turtle小海龟画图 python中的画图方式主要有三种:turtle.tkinter.pygame,我们先从最简单的turtle开始. 学python画图最 ...

  8. 利用python画曲线_利用Python绘制血药浓度-时间曲线——口服吸收一室模型

    血药浓度-时间曲线一般是通过拟合所测定的血药浓度点而画出来的,但是在某些时候,如阅读文献时,我们需要根据别人报道的PK参数来画出药时曲线.Python语法简单,拥有丰富的开源库,下面尝试通过Pytho ...

  9. python画简笔画病毒_用Python做一个可以自动转换JPG格式图片成简笔画的软件

    在吾爱有两年多的时间了,一直以来都是向大神们学习,第一次有机会将自己的学习成果与大家分享 ------------------------------------------------------- ...

最新文章

  1. jQuery与CSS3的选择器
  2. Linux升级OpenSSH完整手册
  3. poj 1729 Jack and Jill (搜索,bfs)
  4. win10安装windows live writer 错误:OnCatalogResult:0x80190194
  5. Android 起调系统功能,打开系统浏览器,拨打电话,发送短信,手机震动,跳转到设置通知开关页面
  6. 标致雪铁龙与菲亚特克莱斯勒宣布完成合并 新股1月19日纽交所上市
  7. MongoDB聚合(aggregate)常用操作及示例
  8. Context.getDir
  9. 多传感器融合用卡尔曼滤波的话也逃不开状态方程观测方程
  10. 马克思主义基本原理【0163】
  11. OverLeaf(LaTeX在线编辑器)使用简介
  12. Discuz模板制作教程
  13. APICloud入门初体验
  14. 技能分享 | 麦肯锡教给我的写作武器:连接词是文章通顺的灵魂
  15. 交通安全精华主题汇总(至2023年01月29日)
  16. html和requests得基本用法
  17. Android OnDeviceAppPrediction 优化
  18. MongoDB热备方案
  19. Java程序员工作一年之后的感想
  20. 大数定理与中心极限定理

热门文章

  1. Excel宏(VBA)密码破解
  2. 基于maplefetion的飞信客户端v1.0
  3. C语言%s格式符的使用!
  4. 句柄(handle)是什么
  5. Prometheus-查询-常用函数
  6. 历史上的两大投机泡沫
  7. RK3399平台开发系列讲解(内核驱动外设篇)6.21、RK LCD显示驱动分析(fb和screen 部分程序)
  8. 【科技、商业和管理】看剧学创业:《硅谷》第五季第7-8集
  9. 电脑如何通过usb共享手机网络 Linux安装wifi 无线网络 811AC usb网卡驱动
  10. 2021前端学习路径书单—自我成长之路