[Python] "Ignite Me, Warm You", ven y obtén el código de amor del mismo estilo de Li Xun

prefacio

Hola a todos.
Recientemente, hay un drama muy popular llamado "Ignite Me, Warm You". Escuché
que es muy popular recientemente. Como programador, el editor del luchador en Python, ¿puedes dárselo a todos? Arreglar ¡una ola!
¿Cómo debería decirlo? Está bien usar esta confesión, ¿y si ella también ve este drama? ¿Y si todo está bien? Jaja

Vamos chicos

Documentos relacionados

Si encuentra problemas que no entiende, también puede enviar un mensaje privado al editor o ↓ ↓ ↓

Código fuente Haga clic aquí para recibirlo (Nota: Su)

Hay un montón de recursos que se pueden prostituir por nada, ¡y actualizaré los pocos conocimientos de Python de vez en cuando! !

Mostrar resultados

Por favor agregue una descripción de la imagen

el código

importación de módulos

import random
from math import sin, cos, pi, log
from tkinter import *

Alto y ancho del lienzo

Algunos valores pueden ser ajustados por nosotros mismos. Aquí configuro la altura y el ancho a 480:640

CANVAS_WIDTH = 640  # 画布的宽
CANVAS_HEIGHT = 480  # 画布的高

coordenadas del eje x, y

CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标

Acercarse

IMAGE_ENLARGE = 11  # 放大比例

color del corazón

Puedes cambiarlo tú mismo, puedes cambiarlo al color que quieras.

HEART_COLOR = "#ff8181"  # 心的颜色,芜湖我喜欢的粉色

generador de funciones

python学习交流Q群:465688591### 源码领取
def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
    """
    “爱心函数生成器”
    :param shrink_ratio: 放大比例
    :param t: 参数
    :return: 坐标
    """
    # 基础函数
    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))

agrandar

# 放大
    x *= shrink_ratio
    y *= shrink_ratio

mover al centro del lienzo

Operación básica, necesito publicar más texto jaja, de lo contrario mi calidad no es buena

# 移到画布中央
x += CANVAS_CENTER_X
y += CANVAS_CENTER_Y

return int(x), int(y)

difusión interna aleatoria

def scatter_inside(x, y, beta=0.15):
    """
    随机内部扩散
    :param x: 原x
    :param y: 原y
    :param beta: 强度
    :return: 新坐标
    """
    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

estar nervioso

Este paso es crítico, lo que estamos haciendo es el código de amor palpitante, por lo que este paso es el más importante.


def shrink(x, y, ratio):
    """
    抖动
    :param x: 原x
    :param y: 原y
    :param ratio: 比例
    :return: 新坐标
    """
    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

Ajustar la relación de zoom

Básicamente, puedes ajustarlo a tu gusto.

@staticmethod
    def 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 - dy

Escalado periódico suave

    def 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 = []

aureola

 # 光环
        heart_halo_point = set()  # 光环的点坐标集合
        for _ in range(halo_number):
            t = random.uniform(0, 2 * pi)  # 随机不到的地方造成爱心有缺口
            x, y = heart_function(t, shrink_ratio=11.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))

contorno

# 轮廓
        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))

contenido

# 内容
        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_points

último paso

Se hará pronto, la persistencia es la victoria.

def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):
    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()  # 一个Tk
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = Heart()  # 心
    draw(root, canvas, heart)  # 开始画画~
    root.mainloop()

código completo

Click para recibir (Nota: Su)

inserte la descripción de la imagen aquí

por fin

De hecho, también podemos usar nuestro cerebro, ajustar el tamaño del lienzo y luego agregar algunos otros elementos.

Como nombres, qué fechas... montones y montones

Depende de cómo operes

Bueno, el compartir de hoy es por aquí.

Si tiene alguna pregunta sobre el artículo, o tiene otras preguntas sobre python, puede dejar un mensaje en el área de comentarios o enviarme un mensaje privado. Si cree que el
artículo que compartí es bueno, puede seguirme o darle un pulgar al artículo. arriba (/≧▽≦)/

Supongo que te gusta

Origin blog.csdn.net/weixin_72934044/article/details/128249775
Recomendado
Clasificación