Python tkinter库之Canvas 根据函数解析式或参数方程画出图像

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Python tkinter库之Canvas 根据函数解析式或参数方程画出图像

Canvas没有画点的函数,我们就用某一点到其右下相邻点的连线来代替。然后自定义一个函数Graph(),把给定函数f(x)在指定区间里的点 (x, f(x)) 依次画出,步进间隔小到一定程度就会连成f(x)对应的曲线。


for ... in range()的步进值只能是整数,所以引入numpy库的arange(),其步进可以是小数,例: for i in numpy.arange(0,2,0.01) # 表示区间[0,1)上步进0.01,共循环200次。


函数解析式的图像

import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as np
def Window_Open(W, H):
    X, Y = ag.size()
    winSize = str(W)+"x"+str(H)
    winPos = winSize + "+" + str((X - W) // 2)
    winPos += "+" + str((Y - H) // 2)
    win.geometry(winPos)
    win.resizable(False, False)
    title = u'桌面分辨率:' + str(X) + "x" + str(Y)
    title += ' ' * 5 + u'窗体大小:' + winSize
    win.title(title)
    win.update()
def Graph(func,x0,y0,xmin,xmax,w,h,c='blue',step=0.001):
    'xmin,xmax 自变量的取值范围; c 图像颜色'
    'x0,y0 原点坐标  w,h 横纵轴半长 step 步进'
    coord = x0-w,y0,x0+w,y0
    tCanvas.create_line(coord,fill='black')
    coord = x0,y0-h,x0,y0+h
    tCanvas.create_line(coord,fill='black')
    w1,w2=100,120 # w1,w2为自变量和函数值在横纵轴上的放大倍数
    for x in np(xmin,xmax+step,step):
        y = func(x)
        coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1
        if abs(x*w1)<w and abs(y*w2)<h:
            tCanvas.create_line(coord,fill=c)
    tCanvas.update()
if __name__ == '__main__':
    win = tk.Tk()
    Window_Open(800,480)
    tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')
    tCanvas.pack(side="top")
    x0,y0=400,240   # 原点坐标
    xmax=pi*2       # 自变量最大值,超过横坐标最大值被截短
    w,h=380,220     # 横纵轴的正向最大值
    fx1 = lambda x : sin(x)+cos(x)
    fx2 = lambda x : sin(x)*cos(x)
    gx1 = lambda x : exp(abs(x/4))-2
    gx2 = lambda x : (x/2)**3-2*(x/2)**2+x/2-1
    Graph(sin,x0,y0,-xmax,xmax,w,h)
    Graph(cos,x0,y0,-xmax,xmax,w,h,'red')
    Graph(fx1,x0,y0,-xmax,xmax,w,h,'lime')
    Graph(fx2,x0,y0,-xmax,xmax,w,h,'orange')
    Graph(gx1,x0,y0,-xmax,xmax,w,h,'magenta')
    Graph(gx2,x0,y0,-xmax,xmax,w,h,'limegreen')
    win.mainloop()


效果图:

20210329211500258.png



心形曲线参数方程的图像

把Graph()函数稍作改进,就能画出参数方程对应的曲线图像,如下例:心形曲线的图像


import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as np
def Window_Open(W, H):
    X, Y = ag.size()
    winSize = str(W)+"x"+str(H)
    winPos = winSize + "+" + str((X - W) // 2)
    winPos += "+" + str((Y - H) // 2)
    win.geometry(winPos)
    win.resizable(False, False)
    title = u'桌面分辨率:' + str(X) + "x" + str(Y)
    title += ' ' * 5 + u'窗体大小:' + winSize
    win.title(title)
    win.update()
def Graph(funcx,funcy,x0,y0,tmin,tmax,w,h,c='blue',step=0.001):
    'xmin,xmax 自变量的取值范围; c 图像颜色'
    'x0,y0 原点坐标  w,h 横纵轴半长 step 步进'
    coord = x0-w,y0,x0+w,y0
    tCanvas.create_line(coord,fill='black')
    coord = x0,y0-h,x0,y0+h
    tCanvas.create_line(coord,fill='black')
    w1,w2=100,110 # w1,w2为自变量和函数值在横纵轴上的放大倍数
    for t in np(tmin,tmax+step,step):
        x = funcx(t)
        y = funcy(t)
        coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1
        if abs(x*w1)<w and abs(y*w2)<h:
            tCanvas.create_line(coord,fill=c)
    tCanvas.update()
if __name__ == '__main__':
    win = tk.Tk()
    Window_Open(480,480)
    tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')
    tCanvas.pack(side="top")
    x0,y0=240,240   # 原点坐标
    a = 0.7
    fx = lambda t : a*(2.0*sin(t)-sin(2*t))
    fy = lambda t : a*(1.6*cos(t)-cos(2*t))+0.5
    Graph(fx,fy,x0,y0,-pi,pi,220,200,c='red')
    win.mainloop()



效果图:

20210329221300107.png




椭圆、双曲线、抛物线的图像

import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as np
def Window_Open(W, H):
    X, Y = ag.size()
    winSize = str(W)+"x"+str(H)
    winPos = winSize + "+" + str((X - W) // 2)
    winPos += "+" + str((Y - H) // 2)
    win.geometry(winPos)
    win.resizable(False, False)
    title = u'桌面分辨率:' + str(X) + "x" + str(Y)
    title += ' ' * 5 + u'窗体大小:' + winSize
    win.title(title)
    win.update()
def Graph(funcx,funcy,x0,y0,tmin,tmax,w,h,c='blue',step=0.001):
    'xmin,xmax 自变量的取值范围; c 图像颜色'
    'x0,y0 原点坐标  w,h 横纵轴半长 step 步进'
    coord = x0-w,y0,x0+w,y0
    tCanvas.create_line(coord,fill='black')
    coord = x0,y0-h,x0,y0+h
    tCanvas.create_line(coord,fill='black')
    w1,w2=100,100 # w1,w2为自变量和函数值在横纵轴上的放大倍数
    for t in np(tmin,tmax+step,step):
        x = funcx(t)
        y = funcy(t)
        coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1
        if abs(x*w1)<w and abs(y*w2)<h:
            tCanvas.create_line(coord,fill=c)
    tCanvas.update()
if __name__ == '__main__':
    win = tk.Tk()
    Window_Open(480,480)
    tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')
    tCanvas.pack(side="top")
    x0,y0=240,240
    a,b = 1,1.2
    p = 0.5
    f1x = lambda t : a*cos(t)
    f1y = lambda t : b*sin(t)
    f2x = lambda t : a/cos(t)
    f2y = lambda t : b*tan(t)
    f3x = lambda t : 2*p*t**2
    f3y = lambda t : 2*p*t
    Graph(f1x,f1y,x0,y0,-pi,pi,220,200)
    Graph(f2x,f2y,x0,y0,-pi,pi,220,200,c='red')
    Graph(f3x,f3y,x0,y0,-pi,pi,220,200,c='green')
    win.mainloop()

效果图:


2021032922432790.png



附:圆锥曲线的参数方程

椭圆

x = a*cost

y = b*sint

双曲线

x = a*sect

y = b*tant

抛物线

x = 2*p*t²

y = 2*p*t

目录
相关文章
|
1月前
|
Python
【10月更文挑战第10天】「Mac上学Python 20」小学奥数篇6 - 一元一次方程求解
本篇将通过 Python 和 Cangjie 双语讲解如何求解一元一次方程。通过这道题,学生将掌握如何用编程实现方程求解,并体验基本的代数计算。
101 1
|
1月前
|
Python
【10月更文挑战第11天】「Mac上学Python 21」小学奥数篇7 - 二元一次方程组求解
本篇将通过 Python 和 Cangjie 双语讲解如何求解二元一次方程组。通过这道题,学生将学会如何使用代数方法和编程逻辑求解方程组中的未知数。
70 1
|
1月前
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
31 0
|
1月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
26 3
|
1月前
|
机器学习/深度学习 算法 C语言
【Python】Math--数学函数(详细附解析~)
【Python】Math--数学函数(详细附解析~)
|
1月前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
23 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
1月前
|
存储 C++ Python
[oeasy]python037_ print函数参数_sep分隔符_separator
本文介绍了Python中`print`函数的`sep`参数,即分隔符。通过回顾上文内容,解释了类型与`type`的概念,并强调了参数类型的重要性。文章详细探讨了`print`函数如何使用`sep`参数来分隔输出值,默认分隔符为空格(序号32)。还讨论了如何修改分隔符为其他字符,如冒号,并解释了为何反斜杠需要使用双反斜杠表示。最后,文章追溯了`sep`名称的由来,以及相关词汇的历史背景,如盎格鲁-萨克逊人的武器和语言。
25 0
|
1月前
|
存储 算法 API
Python学习五:函数、参数(必选、可选、可变)、变量、lambda表达式、内置函数总结、案例
这篇文章是关于Python函数、参数、变量、lambda表达式、内置函数的详细总结,包含了基础知识点和相关作业练习。
26 0
|
1月前
|
存储 缓存 并行计算
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
31 0
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2