网站设计建设合同,怎样做 云知梦 网站 付费网站,资源seo网站优化排名,阿里巴巴运营思路作者简介#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭#xff1a;低头赶路#xff0c;敬事如仪 个人主页#xff1a;网络豆的主页 目录 前言
一.所用库
1.random简介
2.math 简介
3.tkinter库的简介
二.实际图 三.… 作者简介一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭低头赶路敬事如仪 个人主页网络豆的主页 目录 前言
一.所用库
1.random简介
2.math 简介
3.tkinter库的简介
二.实际图 三.代码部分
1.调用库
2.调整画布
3.爱心生成
4.随机内部扩散
5.抖动
6.自定义曲线函数调整跳动周期
7.爱心类
8.classmethod 装饰的类方法
四.全部源代码 前言
本章将会使用Python实现动态的爱心效果
一.所用库
1.random简介
random库是用于产生并运用随机数的标准库。Python中的主要使用是让其掌握在程序中运用随机数的能力。
random常见随机函数有9个:seed()、random()、randint()、getrandbits()、randrange()uniform()、choice()、shuffle()、sample(). 2.math 简介 math 库是 Python 提供的内置数学类函数库因为复数类型常用于科学计算一般计算并不常用因此 math 库不支持复数类型仅支持整数和浮点数运算。math 库一共提供了 4 个数学常数和 44 个函数。44 个函数分为 4 类包括 16 个数值表示函数、8 个幂对数函数、16 个三角对数函数和 4 个高等特殊函数。 3.tkinter库的简介 Tkinter 是 Python 自带的图形界面库库中包含众多图形界面控件包括 Lable 标签、Button按钮、Radiobutton单选框、Checkbutton复选框、Entry文本框等。借助 Tkinter 库中的各种图形界面控件我们就可以设计出实用的图形界面程序。 二.实际图 三.代码部分
1.调用库
import random
from math import sin, cos, pi, log
from tkinter import *
2.调整画布
CANVAS_WIDTH 640#画布的宽
CANVAS_HEIGHT 480#画布的宽
CANVAS_CENTER_X CANVAS_WIDTH / 2
CANVAS_CENTER_Y CANVAS_HEIGHT / 2
IMAGE_ENLARGE 11
HEART_COLOR #FFC0CB #ff2121 #引号内修改颜色
3.爱心生成
def heart_function(t, shrink_ratio: float IMAGE_ENLARGE):x 16 * (sin(t) ** 3)y -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x * shrink_ratioy * shrink_ratiox CANVAS_CENTER_Xy CANVAS_CENTER_Yreturn int(x), int(y)4.随机内部扩散
def scatter_inside(x, y, beta0.15):ratio_x - beta * log(random.random())ratio_y - beta * log(random.random())dx ratio_x * (x - CANVAS_CENTER_X)dy ratio_y * (y - CANVAS_CENTER_Y)return x - dx, y - dy
5.抖动
def shrink(x, y, ratio):force -1 / (((x - CANVAS_CENTER_X) ** 2 (y - CANVAS_CENTER_Y) ** 2) ** 0.6) # 这个参数...dx ratio * force * (x - CANVAS_CENTER_X)dy ratio * force * (y - CANVAS_CENTER_Y)return x - dx, y - dy
6.自定义曲线函数调整跳动周期
def curve(p):return 2 * (2 * sin(4 * p)) / (2 * pi)
7.爱心类
class Heart:def __init__(self, generate_frame20):self._points set() # 原始爱心坐标集合self._edge_diffusion_points set() # 边缘扩散效果点坐标集合self._center_diffusion_points set() # 中心扩散效果点坐标集合self.all_points {} # 每帧动态点坐标self.build(2000)self.random_halo 1000self.generate_frame generate_framefor frame in range(generate_frame):self.calc(frame)def build(self, number):for _ in range(number):t random.uniform(0, 2 * pi)x, y heart_function(t)self._points.add((x, y))for _x, _y in list(self._points):for _ in range(3):x, y scatter_inside(_x, _y, 0.05)self._edge_diffusion_points.add((x, y))point_list list(self._points)for _ in range(4000):x, y random.choice(point_list)x, y scatter_inside(x, y, 0.17)self._center_diffusion_points.add((x, y))8.classmethod 装饰的类方法 staticmethoddef calc_position(x, y, ratio):force 1 / (((x - CANVAS_CENTER_X) ** 2 (y - CANVAS_CENTER_Y) ** 2) ** 0.520) # 魔法参数dx ratio * force * (x - CANVAS_CENTER_X) random.randint(-1, 1)dy ratio * force * (y - CANVAS_CENTER_Y) random.randint(-1, 1)return x - dx, y - dydef calc(self, generate_frame):ratio 10 * curve(generate_frame / 10 * pi) # 圆滑的周期的缩放比例halo_radius int(4 6 * (1 curve(generate_frame / 10 * pi)))halo_number int(3000 4000 * abs(curve(generate_frame / 10 * pi) ** 2))all_points []heart_halo_point set()for _ in range(halo_number):t random.uniform(0, 2 * pi)x, y heart_function(t, shrink_ratio11.6)x, y shrink(x, y, halo_radius)if (x, y) not in heart_halo_point:heart_halo_point.add((x, y))x random.randint(-14, 14)y random.randint(-14, 14)size random.choice((1, 2, 2))all_points.append((x, y, size))for x, y in self._points:x, y self.calc_position(x, y, ratio)size random.randint(1, 3)all_points.append((x, y, size))for x, y in self._edge_diffusion_points:x, y self.calc_position(x, y, ratio)size random.randint(1, 2)all_points.append((x, y, size))for x, y in self._center_diffusion_points:x, y self.calc_position(x, y, ratio)size random.randint(1, 2)all_points.append((x, y, size))self.all_points[generate_frame] all_pointsdef render(self, render_canvas, render_frame):for x, y, size in self.all_points[render_frame % self.generate_frame]:render_canvas.create_rectangle(x, y, x size, y size, width0, fillHEART_COLOR)def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame0):render_canvas.delete(all)render_heart.render(render_canvas, render_frame)main.after(160, draw, main, render_canvas, render_heart, render_frame 1)if __name__ __main__:root Tk() # 一个Tkcanvas Canvas(root, bgblack, heightCANVAS_HEIGHT, widthCANVAS_WIDTH)canvas.pack()heart Heart()draw(root, canvas, heart)root.mainloop()四.全部源代码
import random
from math import sin, cos, pi, log
from tkinter import *CANVAS_WIDTH 640
CANVAS_HEIGHT 480
CANVAS_CENTER_X CANVAS_WIDTH / 2
CANVAS_CENTER_Y CANVAS_HEIGHT / 2
IMAGE_ENLARGE 11
HEART_COLOR #FFC0CB #ff2121def heart_function(t, shrink_ratio: float IMAGE_ENLARGE):x 16 * (sin(t) ** 3)y -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x * shrink_ratioy * shrink_ratiox CANVAS_CENTER_Xy CANVAS_CENTER_Yreturn int(x), int(y)def scatter_inside(x, y, beta0.15):ratio_x - beta * log(random.random())ratio_y - beta * log(random.random())dx ratio_x * (x - CANVAS_CENTER_X)dy ratio_y * (y - CANVAS_CENTER_Y)return x - dx, y - dydef shrink(x, y, ratio):force -1 / (((x - CANVAS_CENTER_X) ** 2 (y - CANVAS_CENTER_Y) ** 2) ** 0.6) # 这个参数...dx ratio * force * (x - CANVAS_CENTER_X)dy ratio * force * (y - CANVAS_CENTER_Y)return x - dx, y - dydef curve(p):return 2 * (2 * sin(4 * p)) / (2 * pi)class Heart:def __init__(self, generate_frame20):self._points set() # 原始爱心坐标集合self._edge_diffusion_points set() # 边缘扩散效果点坐标集合self._center_diffusion_points set() # 中心扩散效果点坐标集合self.all_points {} # 每帧动态点坐标self.build(2000)self.random_halo 1000self.generate_frame generate_framefor frame in range(generate_frame):self.calc(frame)def build(self, number):for _ in range(number):t random.uniform(0, 2 * pi)x, y heart_function(t)self._points.add((x, y))for _x, _y in list(self._points):for _ in range(3):x, y scatter_inside(_x, _y, 0.05)self._edge_diffusion_points.add((x, y))point_list list(self._points)for _ in range(4000):x, y random.choice(point_list)x, y scatter_inside(x, y, 0.17)self._center_diffusion_points.add((x, y))staticmethoddef calc_position(x, y, ratio):force 1 / (((x - CANVAS_CENTER_X) ** 2 (y - CANVAS_CENTER_Y) ** 2) ** 0.520) # 魔法参数dx ratio * force * (x - CANVAS_CENTER_X) random.randint(-1, 1)dy ratio * force * (y - CANVAS_CENTER_Y) random.randint(-1, 1)return x - dx, y - dydef calc(self, generate_frame):ratio 10 * curve(generate_frame / 10 * pi) # 圆滑的周期的缩放比例halo_radius int(4 6 * (1 curve(generate_frame / 10 * pi)))halo_number int(3000 4000 * abs(curve(generate_frame / 10 * pi) ** 2))all_points []heart_halo_point set()for _ in range(halo_number):t random.uniform(0, 2 * pi)x, y heart_function(t, shrink_ratio11.6)x, y shrink(x, y, halo_radius)if (x, y) not in heart_halo_point:heart_halo_point.add((x, y))x random.randint(-14, 14)y random.randint(-14, 14)size random.choice((1, 2, 2))all_points.append((x, y, size))for x, y in self._points:x, y self.calc_position(x, y, ratio)size random.randint(1, 3)all_points.append((x, y, size))for x, y in self._edge_diffusion_points:x, y self.calc_position(x, y, ratio)size random.randint(1, 2)all_points.append((x, y, size))for x, y in self._center_diffusion_points:x, y self.calc_position(x, y, ratio)size random.randint(1, 2)all_points.append((x, y, size))self.all_points[generate_frame] all_pointsdef render(self, render_canvas, render_frame):for x, y, size in self.all_points[render_frame % self.generate_frame]:render_canvas.create_rectangle(x, y, x size, y size, width0, fillHEART_COLOR)def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame0):render_canvas.delete(all)render_heart.render(render_canvas, render_frame)main.after(160, draw, main, render_canvas, render_heart, render_frame 1)if __name__ __main__:root Tk() # 一个Tkcanvas Canvas(root, bgblack, heightCANVAS_HEIGHT, widthCANVAS_WIDTH)canvas.pack()heart Heart()draw(root, canvas, heart)root.mainloop()创作不易求关注点赞收藏谢谢~