当前位置: 首页 > news >正文

先睹为快_Mandelbrot集

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

先睹为快_Mandelbrot集

简易版本的Mandelbrot集

"""
Draw mandelbrot set with matplotlib.
Matrix generated by Pure Python code.
chenbo@cqu.edu.cn,   Dec 2018.

Usage:
    key-up, key-down:  switch color map
"""



from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np

def getEscapeTime(c):
    "计算参数c的逃逸时间,该逃逸速度将用作点的颜色"
    z = 0
    for i in range(100):
        if abs(z) > 2:
            return i
        z = z*z + c
    return i

def computeMandelbrot(xCenter,yCenter,semiWidth,N):
    xFrom,xTo,yFrom,yTo = xCenter-semiWidth,xCenter+semiWidth,\
                          yCenter-semiWidth,yCenter+semiWidth
    y,x = np.ogrid[yFrom:yTo:N*1j,xFrom:xTo:N*1j]
    c = x + y*1j
    print("c.shape:",c.shape,"x.shape:",x.shape,"y.shape:",y.shape)
    return np.frompyfunc(getEscapeTime,1,1)(c).astype(np.float)

def drawMandelbrot(ax,xCenter,yCenter,semiWidth,N,cmap):
    "(xCenter,yCenter)-中心点,semiWidth-矩形半宽,N*N像素."
    ax.set_axis_off()
    ds = computeMandelbrot(xCenter,yCenter,semiWidth,N)
    ax.imshow(ds,cmap=cmap)

def refresh():
    c = cm.get_cmap(para.cmaps[para.idxColorMap%len(para.cmaps)])
    drawMandelbrot(para.ax0, para.x, para.y,
                   semiWidth=0.2, N=600,cmap=c)
    drawMandelbrot(para.ax1, para.x, para.y,
                   semiWidth=0.2 ** 3, N=600,cmap=c)
    para.fig.canvas.draw()

def on_key_release(event):
    if event.key == 'up':
        para.idxColorMap+=1
    elif event.key == 'down':
        para.idxColorMap-=1
    else:
        return
    refresh()

class Para:
    pass

para = Para()
para.x, para.y = 0.27322626, 0.595153338
para.idxColorMap = 0
para.cmaps = ['rainbow', 'jet', 'nipy_spectral', 'gist_ncar','flag',
              'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern',
              'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg',
              'gist_rainbow']
para.fig = plt.figure(figsize=(12,6),dpi=100)
para.fig.canvas.mpl_connect('key_release_event',on_key_release)
plt.subplots_adjust(0,0,1,1,0.0,0)
para.ax0 = plt.subplot(121)
para.ax1 = plt.subplot(122)
refresh()
plt.show()


在这里插入图片描述

交互版本的Mandelbrot集

"""
Draw mandelbrot set with matplotlib.
Escape time computed by Cython.
chenbo@cqu.edu.cn,   Dec 2018.

Usage:
    left-click mouse: Zoom in
    right-click mouse: Zoom out
    key escape:  Reset
    key up,key down: Switch color map.
"""

from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from MandelbrotComp import getEscapeTime

def computeMandelbrot(xCenter,yCenter,semiWidth,N):
    xFrom,xTo,yFrom,yTo = xCenter-semiWidth,xCenter+semiWidth,\
                          yCenter-semiWidth,yCenter+semiWidth
    y,x = np.ogrid[yFrom:yTo:N*1j,xFrom:xTo:N*1j]
    c = x + y*1j
    print("c.shape:",c.shape,"x.shape:",x.shape,"y.shape:",y.shape)
    return np.frompyfunc(getEscapeTime,1,1)(c).astype(np.float)

def drawMandelbrot(ax,xCenter,yCenter,semiWidth,N,cmap):
    "(xCenter,yCenter)-中心点,semiWidth-矩形半宽,N*N像素."
    ax.set_axis_off()
    ds = computeMandelbrot(xCenter,yCenter,semiWidth,N)
    ax.imshow(ds,cmap=cmap)

def refresh():
    print("x,y =",para.x,para.y,"semiWidth =", para.semiWidth)
    c = cm.get_cmap(para.cmaps[para.idxColorMap%len(para.cmaps)])
    drawMandelbrot(para.ax, para.x, para.y,
                   para.semiWidth, N=700,cmap=c)
    para.fig.canvas.draw()

def on_key_release(event):
    if event.key == 'up':
        para.idxColorMap+=1
    elif event.key == 'down':
        para.idxColorMap-=1
    elif event.key == 'escape':
        para.x, para.y = -0.5, 0.0
        para.semiWidth = 1.5
    else:
        return
    refresh()

def on_button_release(event):
    para.x = (para.x - para.semiWidth) + \
             2*para.semiWidth*event.xdata/para.figWidth
    para.y = (para.y - para.semiWidth) + \
             2*para.semiWidth*event.ydata/para.figHeight
    if event.button == 1:
        para.semiWidth /= 3.0
    elif event.button == 3:
        para.semiWidth *= 3.0
    refresh()

class Para:
    pass

para = Para()
para.x, para.y = -0.5, 0.0
para.semiWidth = 1.5
para.idxColorMap = 0
para.cmaps = ['rainbow', 'jet', 'nipy_spectral', 'gist_ncar','flag',
              'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern',
              'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg',
              'gist_rainbow']
para.fig = plt.figure(figsize=(7,7),dpi=100)
para.figWidth,para.figHeight = 700,700
para.fig.canvas.mpl_connect('key_release_event',on_key_release)
para.fig.canvas.mpl_connect('button_release_event',on_button_release)
plt.subplots_adjust(0,0,1,1,0.0,0)
para.ax = plt.subplot(111)
refresh()
plt.show()

这个需要Cython的支持,使用Cython语言编写一个核心函数,然后将其编译成Python模块(MandelbrotComp )来调用。

def getEscapeTime(complex c):
    "计算参数c的逃逸时间,该逃逸速度将用作点的颜色"
    cdef complex z = 0
    cdef int i
    for i in range(100):
        if z.real * z.real + z.imag*z.imag > 4:
            return i
        z = z*z + c
    return i

上面这个代码跟普通的Python不一样,里面的变量是有类型声明的,Cython可以将其编译成.c文件,然后再编译成Python模块。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

相关文章:

  • centos 7 安装mysql 8.0.30
  • TR5521设计资料|TR5521替代方案|DP转VGA设计参考
  • javaweb教师招聘管理系统ssm
  • spring boot —— Spring Security定制权限管理
  • Python从入门到实践:包的使用
  • kubernetes二进制安装教程单master
  • LeetCode-998. 最大二叉树 II【最大二叉树】
  • 如何快速使用proteus【硬件课程设计】
  • 从零开始手写一个Transformer
  • java基于springboot+Vue图片分享社区网站
  • Appium环境搭建及元素定位
  • 神经网络算法处理器设计,神经网络是机器算法吗
  • 爱上开源之golang入门至实战第四章函数(Func)(九)
  • Ubuntu安装可视化界面ElasticSearch-head插件
  • 【数论:组合数学】排列组合
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 4个实用的微服务测试策略
  • avalon2.2的VM生成过程
  • Fundebug计费标准解释:事件数是如何定义的?
  • java 多线程基础, 我觉得还是有必要看看的
  • java正则表式的使用
  • Js基础知识(一) - 变量
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MySQL用户中的%到底包不包括localhost?
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • 构建二叉树进行数值数组的去重及优化
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 使用putty远程连接linux
  • No resource identifier found for attribute,RxJava之zip操作符
  • 你对linux中grep命令知道多少?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #NOIP 2014# day.2 T2 寻找道路
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (31)对象的克隆
  • (二)Linux——Linux常用指令
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core中Emit的使用
  • .net FrameWork简介,数组,枚举
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net操作Excel出错解决
  • :“Failed to access IIS metabase”解决方法
  • :如何用SQL脚本保存存储过程返回的结果集
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [Assignment] C++1
  • [BUUCTF]-Reverse:reverse3解析
  • [C#基础知识系列]专题十七:深入理解动态类型