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

一场大雪,覆盖了华北、华东。天地连成一片,城市银装素裹,处处诗情画意、人人兴高采烈。朋友圈被雪景图和调侃路滑摔跤的段子刷屏,气氛比过年还要热烈几分。我也来凑个热闹,用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阶的科赫雪花。

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

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绘制雪花和雪景的文章就介绍到这了,更多相关matplotlib绘制雪花和雪景内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中Matplotlib实现绘制3D图的示例代码

    Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现.但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三维图像时,同样需要载入 pyplot 模块. mplot3d 模块下主要包含 4 个大类,分别是: mpl_toolkits.mplot3d.axes3d() mpl_toolkits.mplot3d.axis3d() mpl_toolkits.mplot3d.art3d() mpl_toolkit

  • python使用matplotlib绘制柱状图教程

    Matplotlib的概念这里就不多介绍了,关于绘图库Matplotlib的安装方法:点击这里 小编之前也和大家分享过python使用matplotlib实现的折线图和制饼图效果,感兴趣的朋友们也可以点击查看,下面来看看python使用matplotlib绘制柱状图的方法吧,具体如下: 1. 基本的柱状图 import matplotlib.pyplot as plt data = [5, 20, 15, 25, 10] plt.bar(range(len(data)), data) plt.s

  • python使用matplotlib绘制折线图教程

    matplotlib简介 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. 在Linux下比较著名的数据图工具还有gnuplot,这个是免费的,Python有一个包可以调用gnuplot,但是语法比较不

  • python绘图库Matplotlib的安装

    本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地 进行制图.Matplotlib的安装可以参见:官网链接 http://matplotlib.org/users/installing.html 安装总结步骤如下: windows 平台上下载.exe格式 直接安装. 1.python下载安装 下载地址:http://www.python.org/download/

  • Python实现matplotlib显示中文的方法详解

    本文实例讲述了Python实现matplotlib显示中文的方法.分享给大家供大家参考,具体如下: [注意] 可能与本文主题无关,不过我还是想指出来:使用matplotlib库时,下面两种导入方式是等价的(我指的是等效,当然这个说法可以商榷:) import matplotlib.pyplot as plt import pylab as plt [效果图] [方式一]FontProperties import matplotlib.pyplot as plt from matplotlib.f

  • python matplotlib坐标轴设置的方法

    在使用matplotlib模块时画坐标图时,往往需要对坐标轴设置很多参数,这些参数包括横纵坐标轴范围.坐标轴刻度大小.坐标轴名称等 在matplotlib中包含了很多函数,用来对这些参数进行设置. 我们可以对坐标轴进行设置,设置坐标轴的范围,设置坐标轴上的文字描述等. 基本用法 例如: import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成x轴上的数据:从-3到3,总共有50个点 x = np.lin

  • 用matplotlib画等高线图详解

    等高线图是在地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中. 因为等高线的图有三个信息:x,y以及x,y所对应的高度值. 这个高度值的计算我们用一个函数来表述: 计算x,y坐标对应的高度值 def f(x, y): return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 这个函数看起来挺复杂的,但我们这里只是为了能够获得一个高度值,因此其中函数代表什么意义不用关心,只要知道输入一个x,y,输出一个高度值就可以了. 要画出等高线

  • Python数据分析matplotlib设置多个子图的间距方法

    注意,要看懂这里,必须具备简单的Python数据分析知识,必须知道matplotlib的简单使用! 例1: plt.subplot(221) # 第一行的左图 plt.subplot(222) # 第一行的右图 plt.subplot(212) # 第二整行 plt.title('xxx') plt.tight_layout() #设置默认的间距 例2: for i in range(25): plt.subplot(5,5,i+1) plt.tight_layout() 例3: # 设定画图板

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

    一场大雪,覆盖了华北.华东.天地连成一片,城市银装素裹,处处诗情画意.人人兴高采烈.朋友圈被雪景图和调侃路滑摔跤的段子刷屏,气氛比过年还要热烈几分.我也来凑个热闹,用python为2020年的第一场雪锦上添花. 绘制雪花图案,网上有很多文章介绍,但几乎都是用 Python 的内置模块 turtle 绘制的,这个模块适合用来引导孩子学习编程,很难真正用在项目开发上.也有用 pygame 实现的,不过 pygame 追求的是动画效果,雪花图案是随机生成的圆,效果很一般. 用 matplotlib 绘

  • python 根据正则表达式提取指定的内容实例详解

    python 根据正则表达式提取指定的内容 正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事. 下面演示了在python里,通过正则表达式来提取符合要求的内容. 实例代码: import re # 正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事. # 下面演示了在python里,通过正则表达式来提取符合要求的内容.有几个要注意 # 的地方就是: # [1] 要用()将需要的内容包含起来 # [2] 编号为0的group是整个符合正则表达式的内容,编号为1的是

  • Adapter模式实战之重构鸿洋集团的Android圆形菜单建行

    对于很多开发人员来说,炫酷的UI效果是最吸引他们注意力的,很多人也因为这些炫酷的效果而去学习一些比较知名的UI库.而做出炫酷效果的前提是你必须对自定义View有所理解,作为90的小民自然也不例外.特别对于刚处在开发初期的小民,对于自定义View这件事觉得又神秘又帅气,于是小民决定深入研究自定义View以及相关的知识点. 在此之前我们先来看看洋神的原版效果图: 记得那是2014年的第一场雪,比以往时候来得稍晚一些.小民的同事洋叔是一位资深的研发人员,擅长写UI特效,在开发领域知名度颇高.最近洋叔刚

  • Python实现圣诞树的多种方法

    目录 1.极简版 2.彩色版 3.海龟版 4.海龟分形版 5.炫彩版 总结   马上就是圣诞节了,先提前祝大家圣诞快乐!:christmas_tree::christmas_tree::christmas_tree: 有人要说了,圣诞节是耶稣诞生的日子,我又不信基督教,有啥好庆祝的.这你就有所不知了,Python 的诞生也跟圣诞节有关:1989 年,那是一个冬天,那年的第一场雪来得比以往时候来得更早一些,有一位程序员,在圣诞期间的阿姆斯特丹感觉特别闲,就决定开发一个新的脚本语言.他一边开发一边刷

  • 2014春节祝福语大全 2014新年祝福短信

    1.新年新开端,首选是元旦.立志好人缘,天天露笑脸.健康常相伴,饮食加锻炼.好运在马年,快乐过元旦.祝:元旦快乐! 2.距离的遥远无法阻挡,思念的帆船早已起航,异乡的你是否安康?元旦的祝福真诚送上:愿你沐浴幸福的朝阳,快乐的歌声时刻嘹亮,2014实现所有梦想! 3.2014年第一天,许下第一份愿望吧,闭上眼睛,双手合十,心中默念,梦想成真.有期待的生活是快乐的,有憧憬的日子是惊喜的.元旦快乐! 4.文字短,情意长,元旦问候传思念;虽然远,亦惦念,愿你开怀在元旦;喜连连,乐翩翩,幸福陪在你身边;好

  • python实例小练习之Turtle绘制南方的雪花

    导语 又到了裹紧被子,穿起秋裤的季节! 这些天,我们这边开始下雨了,温度瞬间降了10几度. 遭受了秋天第一场寒潮的"侵袭",我是真的冷,一大早穿上了长裙. 寒风呼啸,大雪飘飘,咳咳咳......说的严重了点儿,还没飘雪呢,思维有点儿远了! 唯一的愿望就是: 我们公司的冷空调能不能稍微收住一点儿,话说还有的同事穿着短衣短裤是怎么熬过来的, 咋没感觉冷呢?后面我还加了一件外套来着!后来想了想:估计是男孩子皮比较厚一点点.[开个玩笑.jpg] 哼唧唧,独冷冷不如众冷冷,木木子来帮你了~大家一

  • Python实现为图像添加下雪特效

    目录 导语 正文 一.故宫下雪了:界面小程序 1)附主程序 2)效果展示 二.故宫下雪了:手绘素描 1)主程序 2)效果展示 导语 也许是为了和音,在立冬这一天的人间里 北方多个城市,悄然降下冬天的第一场初雪,组成了一段旋律 一天过两季,黄叶转飞花--从天而降落,昼夜不停,一夜醒来,阁檐染白,故宫完成秋冬交接, 来自北方的故事纷纷踏雪而来. 琼楼银装,粉饰玉砌,不觉恍入天上仙境,宫墙内宾客如云,宫墙外车水马龙,若把故宫作天宫, 整夜冬天不觉冷.(可以穿秋裤了.jpg) (本文的部分素材是在北京故

  • 如何用angularjs制作一个完整的表格

    由于本人也是边学边写,因此整理的比较乱,下面放出我例子的完整代码,方便大家交流测试,如有问题欢迎评论 首先,表格采用的是BootStrap样式编辑的,主要使用的是angularjs,为了方便也有jQuery的方法,在测试时需自行引入bootstrap,angularjs和jq的文件. 整体代码预览: HTML: <!DOCTYPE html> <html lang="en" ng-app="myModule"> <head> //

  • 使用angularjs创建简单表格

    初步接手人生的第一个项目,需要用angularjs制作表格和实现各种功能,因此遇到了各种问题和以前不熟悉的知识点,在此记录下来,以供大家学习交流,解决方式可能并不完善或符合规范,如果大家有更好的方式欢迎指出,由于这个表格功能的制作是一点点添加上去的,因此我也分成几个部分介绍,日后如增加了新的功能也会不时更新的 首先,表格采用的是BootStrap样式编辑的,主要使用的是angularjs,为了方便也有jQuery的方法,在测试时需自行引入bootstrap,angularjs和jq的文件. 正文

  • 利用jQuery实现一个简单的表格上下翻页效果

    前言 本文主要介绍的是利用jQuery实现一个简单的表格上下翻页效果,注:实现原理与轮播图相似.下面话不多说,来看看详细的 实现方法吧. html: <div class="popup day02-popup04"> <div class="group-caption"> <span>日期</span><span>参与团购场次</span><span class="result&

随机推荐