当前位置:   article > 正文

Python爱心代码_爱心代码编程python

爱心代码编程python

效果图:

源代码:

  1. # Beating Heart
  2. # default input
  3. import random
  4. from math import sin, cos, pi, log
  5. from tkinter import *
  6.  
  7. CANVAS_WIDTH = 980  # frame_width    
  8. CANVAS_HEIGHT = 720  # frame_height
  9. CANVAS_CENTER_X = CANVAS_WIDTH / 2  # frame_center_x
  10. CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # center_y
  11. IMAGE_ENLARGE = 11  # ratio
  12. # color list
  13. HEART_COLOR_LIST = ["#d974ff", "#be77fa", "#a478f3", "#8b78ea", "#7377e0",
  14.                     "#4871c6", "#5c74d3", "#fa6ea9", "#dc6db1", "#ec2c2c",
  15.                     "#e91e41", "#8b4593", "#2bd3ec", "#00be93", "#2bec62"]
  16.  
  17.  
  18. def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
  19.     """
  20.     create a heart
  21.     :param shrink_ratio: ratio
  22.     :param t: parameter
  23.     :return: x, y
  24.     """
  25.     # basic function, size
  26.     x = 16 * (sin(t) ** 3)
  27.     y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
  28.  
  29.     # zoom
  30.     x *= shrink_ratio
  31.     y *= shrink_ratio
  32.  
  33.     # center
  34.     x += CANVAS_CENTER_X
  35.     y += CANVAS_CENTER_Y
  36.  
  37.     return int(x), int(y)
  38.  
  39.  
  40. def scatter_inside(x, y, beta=1.15):
  41.     """
  42.     random inner spreading
  43.     :param x: orig x
  44.     :param y: orig y
  45.     :param beta: strength
  46.     :return: new x, y
  47.     """
  48.     ratio_x = - beta * log(random.random())
  49.     ratio_y = - beta * log(random.random())
  50.  
  51.     dx = ratio_x * (x - CANVAS_CENTER_X)
  52.     dy = ratio_y * (y - CANVAS_CENTER_Y)
  53.  
  54.     return x - dx, y - dy
  55.  
  56.  
  57. def shrink(x, y, ratio):
  58.     """
  59.     shrink
  60.     :param x: orig x
  61.     :param y: orig y
  62.     :param ratio: ratio
  63.     :return: new x,y
  64.     """
  65.     force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6)  # 这个参数...
  66.     dx = ratio * force * (x - CANVAS_CENTER_X)
  67.     dy = ratio * force * (y - CANVAS_CENTER_Y)
  68.     return x - dx, y - dy
  69.  
  70.  
  71. def curve(p):
  72.     """
  73.     tune beating period
  74.     :param p: parameter
  75.     :return: sin
  76.     """
  77.     # alg
  78.     return 2 * (2 * sin(4 * p)) / (2 * pi)
  79.  
  80.  
  81. class Heart:
  82.     def __init__(self, generate_frame=20):
  83.         self._points = set()
  84.         self._edge_diffusion_points = set()
  85.         self._center_diffusion_points = set()
  86.         self.all_points = {}
  87.         self.build(2000)
  88.         self.random_halo = 1000
  89.         self.generate_frame = generate_frame
  90.         for frame in range(generate_frame):
  91.             self.calc(frame)
  92.  
  93.     def build(self, number):
  94.         # heart
  95.         for _ in range(number):
  96.             t = random.uniform(0, 2 * pi)
  97.             x, y = heart_function(t)
  98.             self._points.add((x, y))
  99.  
  100.         # inner heart 1
  101.         for _x, _y in list(self._points):
  102.             for _ in range(3):
  103.                 x, y = scatter_inside(_x, _y, 0.05)
  104.                 self._edge_diffusion_points.add((x, y))
  105.  
  106.         # inner heart 2
  107.         point_list = list(self._points)
  108.         for _ in range(6000):
  109.             x, y = random.choice(point_list)
  110.             x, y = scatter_inside(x, y, 0.17)
  111.             self._center_diffusion_points.add((x, y))
  112.  
  113.     @staticmethod
  114.     def calc_position(x, y, ratio):
  115.         # tune ratio
  116.         force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520)  # alg
  117.  
  118.         dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)
  119.         dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)
  120.  
  121.         return x - dx, y - dy
  122.  
  123.     def calc(self, generate_frame):
  124.         ratio = 10 * curve(generate_frame / 10 * pi)  # curve
  125.  
  126.         halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))
  127.         halo_number = int(3000 + 6000 * abs(curve(generate_frame / 10 * pi) ** 2))
  128.  
  129.         all_points = []
  130.  
  131.         # ring
  132.         heart_halo_point = set()  # x,y of ring pts
  133.         for _ in range(halo_number):
  134.             t = random.uniform(0, 2 * pi)
  135.             x, y = heart_function(t, shrink_ratio=11.6)  # alg
  136.             x, y = shrink(x, y, halo_radius)
  137.             if (x, y) not in heart_halo_point:
  138.                 # new pts
  139.                 heart_halo_point.add((x, y))
  140.                 x += random.randint(-14, 14)
  141.                 y += random.randint(-14, 14)
  142.                 size = random.choice((1, 2, 2))
  143.                 all_points.append((x, y, size))
  144.  
  145.         # appearance
  146.         for x, y in self._points:
  147.             x, y = self.calc_position(x, y, ratio)
  148.             size = random.randint(1, 3)
  149.             all_points.append((x, y, size))
  150.  
  151.         # content
  152.         for x, y in self._edge_diffusion_points:
  153.             x, y = self.calc_position(x, y, ratio)
  154.             size = random.randint(1, 2)
  155.             all_points.append((x, y, size))
  156.  
  157.         for x, y in self._center_diffusion_points:
  158.             x, y = self.calc_position(x, y, ratio)
  159.             size = random.randint(1, 2)
  160.             all_points.append((x, y, size))
  161.  
  162.         self.all_points[generate_frame] = all_points
  163.  
  164.     def render(self, render_canvas, render_frame):
  165.         for x, y, size in self.all_points[render_frame % self.generate_frame]:
  166.             render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=random.choice(HEART_COLOR_LIST))
  167.  
  168.  
  169. def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):
  170.     render_canvas.delete('all')
  171.     render_heart.render(render_canvas, render_frame)
  172.     main.after(70, draw, main, render_canvas, render_heart, render_frame + 1)
  173.  
  174.  
  175. if __name__ == '__main__':
  176.     root = Tk()  # Tk
  177.     canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
  178.     canvas.pack()
  179.     heart = Heart()
  180.     draw(root, canvas, heart)  # draw
  181.     text1 = Label(root, text="HXX", font=("Helvetica", 18), fg="#c12bec",bg = "black")
  182.     text1.place(x=650, y=500)
  183.  
  184.     text2 = Label(root, text="叉叉宝",font = ("Helvetica", 18), fg = "#c12bec" ,bg = "black") #
  185.     text2.place(x=460, y=350)
  186.  
  187.     root.mainloop()

修改注释:

红色框内text=“”修改效果图中右下角By xxx

蓝色框内text=“”修改效果图中爱心中间的文本内容

黄色橙色框内fg=“”修改效果图中的文字颜色

(这里为颜色的列表,可从中选择并填写至fg内)

绿色淡绿色框内bg=“”修改效果图中文字背景颜色(其实有瑕疵的因为文字是更上一层的图层会有覆盖)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/950011
推荐阅读
相关标签
  

闽ICP备14008679号