为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景


Posted in Python onJanuary 05, 2021

一场大雪,覆盖了华北、华东。天地连成一片,城市银装素裹,处处诗情画意、人人兴高采烈。朋友圈被雪景图和调侃路滑摔跤的段子刷屏,气氛比过年还要热烈几分。我也来凑个热闹,用python为2020年的第一场雪锦上添花。

绘制雪花图案,网上有很多文章介绍,但几乎都是用 Python 的内置模块 turtle 绘制的,这个模块适合用来引导孩子学习编程,很难真正用在项目开发上。也有用 pygame 实现的,不过 pygame 追求的是动画效果,雪花图案是随机生成的圆,效果很一般。

用 matplotlib 绘制雪花,重点是生成科赫曲线(Koch Curve)。科赫曲线是一种分形,其形态似雪花,又称科赫雪花、雪花曲线。给定线段pq,k阶科赫曲线可以由以下步骤生成:

  • 找出三等分点u、v
  • 以线段uv为底,向外(或内外)画等边三角形uwv
  • 将线段uv移除
  • 对pq之间的每一段重复上述操作k-1次

科赫雪花是以等边三角形三边生成的科赫曲线组成的。基于上述分析,我们可以很容易地写出科赫雪花的生成函数:给定一个等边三角形,和科赫曲线阶数k,返回科赫雪花图案中的所有点。

import numpy as np

plt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False #解决中文显示为方块的问题

def rotate(p, d):
  """返回点p绕原点逆时针旋转d度的坐标"""
  
  a = np.radians(d)
  m = np.array([[np.cos(a), np.sin(a)],[-np.sin(a), np.cos(a)]])
  return np.dot(p, m)

def koch_curve(p, q):
  """将线段pq生成科赫曲线,返回uvw三个点"""
  
  p, q = np.array(p), np.array(q)
  u = p + (q-p)/3 # 三等分点u的坐标
  v = q - (q-p)/3 # 三等分点V的坐标
  w = rotate(v-u, 60) + u # 线段uv绕u点逆时针旋转60°得到点w的坐标
  
  return u.tolist(), v.tolist(), w.tolist()
  
def snow(triangle, k):
  """给定三角形,生成封闭的科赫雪花"""
  
  for i in range(k):
    result = list()
    t_len = len(triangle)
    for j in range(t_len):
      p = triangle[j]
      q = triangle[(j+1)%t_len]
      u, v, w = koch_curve(p, q)
      result.extend([p, u, w, v])
    triangle = result.copy()
  
  triangle.append(triangle[0])
  return triangle

有了雪花图案的数据,接下来使用 matplotlib 绘图就非常轻松了:

import numpy as np
import matplotlib.pyplot as plt

def plot_snow(snow_list):
  """绘制雪花"""
  
  for triangle, k in snow_list:
    data = np.array(snow(triangle, k))
    x, y = np.split(data, 2, axis=1)
    plt.plot(x, y)
  
  plt.axis('equal') 
  plt.show()

snow_list = [
  ([(0,0), (0.5,0.8660254), (1,0)], 5),
  ([(1.1,0.4), (1.35,0.8330127), (1.6,0.4)], 4),
  ([(1.1,-0.1), (1.25,0.15980761), (1.4,-0.1)], 3)
]
plot_snow(snow_list)

来看看我们的雪花效果。从小到大,3片雪花分别对应的是3阶、4阶、5阶的科赫雪花。

为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景

更进一步,我们还可以把雪花画在背景图上,配合大小浓淡的变化,画出另一种韵味的雪景图。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

def draw_scenery():
  """绘制雪景图"""
  
  im = Image.open('brage.png')
  bg = np.array(im)
  plt.imshow(bg) # 绘制背景图
  
  for i in range(80):
    x = np.random.randint(80, im.size[0]-80)
    y = np.random.randint(30, im.size[1]-30)
    r = np.random.randint(5, 20)
    a = np.random.random()*0.6 + 0.2
    v = np.array((x-r/2, y))
    u = np.array((x+r/2, y))
    w = rotate(v-u, 60) + u
    
    data = np.array(snow([(u[0],u[1]),(w[0],w[1]),(v[0],v[1])], 5))
    x, y = np.split(data, 2, axis=1)
    plt.plot(x, y, c='#AABBCC', lw=1, ls='-', alpha=a)
  
  plt.axis('equal') 
  plt.show()

draw_scenery()

为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景

到此这篇关于为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景的文章就介绍到这了,更多相关matplotlib绘制雪花和雪景内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python针对excel的操作技巧
Mar 13 Python
Django后台获取前端post上传的文件方法
May 28 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
pandas DataFrame创建方法的方式
Aug 02 Python
Python实现不规则图形填充的思路
Feb 02 Python
python自动下载图片的方法示例
Mar 25 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
Matplotlib中rcParams使用方法
Jan 05 #Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 #Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 #Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 #Python
python实现三种随机请求头方式
Jan 05 #Python
scrapy实践之翻页爬取的实现
Jan 05 #Python
python里glob模块知识点总结
Jan 05 #Python
You might like
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
jQuery $.each的用法说明
2010/03/22 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
js轮播图代码分享
2016/07/14 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
python上selenium的弹框操作实现
2020/07/13 Python
python 如何将office文件转换为PDF
2020/09/22 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
广场舞大赛策划方案
2014/05/31 职场文书
授权委托书(完整版)
2014/09/10 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
导游词之湖州-太湖
2019/10/11 职场文书