使用Python生成一束玫瑰花

news2025/1/17 8:52:27

520到了,没时间买花?我们来生成一个电子的。

Python不仅是一种强大的编程语言,用于开发应用程序和分析数据,它也可以用来创造美丽的艺术作品。在这篇博客中,我们将探索如何使用Python生成一束玫瑰花的图像。

准备工作

首先,确保你的环境中安装了以下库:

  • matplotlib:一个用于创建图表的库。
  • numpy:一个用于数值计算的库。

你可以使用pip来安装这些库:

pip install matplotlib numpy

绘制玫瑰花

我们将使用极坐标系中的玫瑰曲线(Rose Curve)公式来绘制玫瑰花。玫瑰曲线的公式是:

r=cos(kθ)

其中,( r ) 是半径,( \theta ) 是角度,( k ) 是一个常数,决定了花瓣的数量。

导入库

import matplotlib.pyplot as plt
import numpy as np

定义玫瑰曲线函数

def rose_curve(theta, k):
    r = np.cos(k * theta)
    return r

绘制函数

theta = np.linspace(0, 2 * np.pi, 1000)  # 定义theta的范围
k = 5  # 花瓣的数量

r = rose_curve(theta, k)
x = r * np.cos(theta)
y = r * np.sin(theta)

plt.figure(figsize=(6, 6))
plt.plot(x, y, 'r')  # 使用红色绘制玫瑰花
plt.axis('equal')  # 确保x轴和y轴的刻度相同
plt.title('A Rose in Python')
plt.show()

生成动态爱心代码

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_FACTOR = 11
HEART_COLOR = "#FF69B4"

def generate_heart_coordinate(t, shrink_ratio=IMAGE_ENLARGE_FACTOR):
    """
    生成爱心函数的坐标
    :param t: 参数,控制爱心的形状
    :param shrink_ratio: 爱心的缩放比例
    :return: 爱心的坐标 (x, y)
    """
    # 基础函数,生成爱心的基本形状
    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))

    # 放大爱心
    x *= shrink_ratio
    y *= shrink_ratio

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

    return int(x), int(y)

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

def shrink_coordinate(x, y, ratio):
    """
    抖动效果,用于调整爱心的跳动
    :param x: 原点的 x 坐标
    :param y: 原点的 y 坐标
    :param ratio: 抖动的比例
    :return: 新点的坐标 (x, y)
    """
    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

def custom_curve(p):
    """
    自定义曲线函数,调整跳动周期
    :param p: 参数,控制曲线的形状
    :return: 正弦值,用于调整爱心的跳动
    """
    # 可以尝试换其他的动态函数,达到更有力量的效果(如贝塞尔曲线)
    return 2 * (2 * sin(4 * p)) / (2 * pi)

class BeatingHeart:
    """
    跳动的爱心类
    """

    def __init__(self, generate_frame=20):
        self._original_points = set()  # 原始爱心的坐标集合
        self._edge_diffusion_points = set()  # 边缘扩散效果的点坐标集合
        self._center_diffusion_points = set()  # 中心扩散效果的点坐标集合
        self.all_frame_points = {}  # 每帧的动态点坐标
        self.build(2000)

        self.random_halo = 1000

        self.generate_frame = generate_frame
        for frame in range(generate_frame):
            self.calculate_frame(frame)

    def build(self, number_of_points):
        # 生成原始爱心的坐标
        for _ in range(number_of_points):
            t = random.uniform(0, 2 * pi)  # 随机参数,用于生成不完整的爱心
            x, y = generate_heart_coordinate(t)
            self._original_points.add((x, y))

        # 生成爱心内扩散的点
        for x, y in list(self._original_points):
            for _ in range(3):
                x, y = scatter_inside(x, y, 0.05)
                self._edge_diffusion_points.add((x, y))

        # 生成爱心内再次扩散的点
        point_list = list(self._original_points)
        for _ in range(6000):
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, 0.17)
            self._center_diffusion_points.add((x, y))

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

    def calculate_frame(self, frame_number):
        ratio = 10 * custom_curve(frame_number / 10 * pi)  # 圆滑的周期的缩放比例

        halo_radius = int(4 + 6 * (1 + custom_curve(frame_number / 10 * pi)))
        halo_number = int(3000 + 4000 * abs(custom_curve(frame_number / 10 * pi) ** 2))

        all_points = []

        # 生成光环的点
        heart_halo_points = set()
        for _ in range(halo_number):
            t = random.uniform(0, 4 * pi)
            x, y = generate_heart_coordinate(t, shrink_ratio=11.5)
            x, y = shrink_coordinate(x, y, halo_radius)
            if (x, y) not in heart_halo_points:
                # 处理新的点
                heart_halo_points.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._original_points:
            x, y = self.calculate_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.calculate_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.calculate_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))

        self.all_frame_points[frame_number] = all_points

    def render(self, render_canvas, render_frame):
        for x, y, size in self.all_frame_points[render_frame % self.generate_frame]:
            render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)

def draw(main_window, render_canvas, render_heart, render_frame=0):
    render_canvas.delete('all')
    render_heart.render(render_canvas, render_frame)
    main_window.after(160, draw, main_window, render_canvas, render_heart, render_frame + 1)

if __name__ == '__main__':
    root = Tk()
    root.title('Beating Heart')
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = BeatingHeart()
    draw(root, canvas, heart)
    Label(root, text="比心", bg="black", fg="#FF69B4", ).place(relx=.5, rely=.5, anchor=CENTER)
    # 在爱心中间加上字
    Label(root, text="爱你", bg="black", fg="#FF69B4", font=('宋体', 18)).place(relx=.50, rely=.1, anchor=CENTER)
    # 在爱心上面加上字
    root.mainloop()

结果

惊不惊喜,意不意外

通过改变变量k的值,你可以生成不同数量花瓣的玫瑰花。

结论

使用Python生成艺术作品是一个有趣且富有创造性的过程。通过简单的数学公式和编程技巧,我们可以创造出自然界中的美丽图案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绿联硬盘数据恢复方法:安全、高效找回珍贵数据

在数字化时代,硬盘承载着大量的个人和企业数据,一旦数据丢失或损坏,后果往往不堪设想。绿联硬盘以其稳定的性能和良好的口碑赢得了众多用户的信赖,但即便如此,数据恢复问题仍然是用户可能面临的一大挑战。本文将为您详…

【NOIP2013普及组复赛】题4:车站分级

题4:车站分级 【题目描述】 一条单向的铁路线上,依次有编号为 1 , 2 , … , n 1,2,…,n 1,2,…,n 的 n n n 个火车站。每个火车站都有一个级别,最低为 1 1 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求&#…

Snowy2.x 版本使用 Yaml

代码:https://gitee.com/xiaonuobase/snowy/tree/Snowy2.5.2/ 直接将 properties 转换成 yaml 那么你大概率会遇到下面报错: 然后你上网搜索,发现是 snakeyaml 版本的问题,1.x 版本的 snakeyaml 有安全隐患,要升级到…

C语言程序的编译

目录 一、预处理(预编译) 二、编译 三、汇编 四,链接 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和…

【paper】基于分布式采样的多机器人编队导航信念传播模型预测控制

Distributed Sampling-Based Model Predictive Control via Belief Propagation for Multi-Robot Formation NavigationRAL 2024.4Chao Jiang 美国 University of Wyoming 预备知识 马尔可夫随机场(Markov Random Field, MRF) 马尔可夫随机场&#xff…

【Makefile】Makefile 编译 Keil 工程(Linux 环境)

本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。 目录 一、软件下载 1、stm32 标准库 2、arm-none-eabi 工具链 3、烧录器 二、Keil 工程改造 1、Keil 工程 2、基本 Makefile 工程 3、添加启动文件 4、添加链接脚本 5、去掉 core_cm3.c 三…

AI整体架构设计4:理解AI云原生

泛AI架构设计这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计,包括业务数据治理、模型训练与管理、模型部署与调度。整体基于云原生技术,旨在通过开源领域的LLMOps或者MLOps技术,充分运用低代码平台构建高性能、高效率和敏捷…

Spring Cloud Gateway 网关

一. 什么是网关(Gateway) 网关就是一个网络连接到另一个网络的关口。 在同一个项目或某一层级中,存在相似或重复的东西,我们就可以将这些相似重复的内容统一提取出来,向前或向后抽象成单独的一层。这个抽象的过程就是…

简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.有无预编译 优点 缺点 2.SQL执行的快慢 3.能否被SQL注入 4.参数输入方式 5.总结 1.有无预编译 #{}是有预编译的而${}是没有预编译的&…

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…

基础2 JAVA图形编程桌面:探索图形程序的抽象实现

嘿,大家好!我非常高兴又一次有机会与大家相聚,分享新的知识和经验。对于热爱编程和探索新技术的朋友们来说,今天的内容绝对不容错过。我为大家准备了一个详尽的视频教程:《基础2 JAVA 图形编程:主程序调用…

软件协作开发方法论

引言 作为程序员,你是否有过这样的经历?软件发版前,你需要把你的代码合并到主分支,拉取主分支代码后,发现有数十个文件冲突,你开始小心翼翼地解决冲突,有些其实你也不知道咋处理,几…

Spring Cloud Alibaba-08-SMS短信服务

Lison <dreamlison163.com>, v1.0.0, 2024.5.1 Spring Cloud Alibaba-08-SMS短信服务 短信服务介绍 短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。 产品优势:覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度 产品功能:短…

linux 排查java内存溢出(持续更新中)

场景 tone.jar 启动后内存溢出,假设pid 为48044 排查 1.确定java程序的pid(进程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆栈信息 jmap -heap 48044 3.查看对象的实例数量显示前30 jmap -histo:live 48044 | head -n 30 4.查看线程状态 jstack 48044

5.23 学习总结

一.项目优化&#xff08;语音通话&#xff09; 实现步骤&#xff1a; 1.用户发送通话申请&#xff0c;并处理通话请求&#xff0c;如果同意&#xff0c;为两个用户之间进行连接。 2.获取到电脑的麦克风和扬声器&#xff0c;将获取到的语音信息转换成以字节数组的形式传递。 …

宇宙“超级地球”系列,你知道几个?

在宇宙中&#xff0c;可能存在着类地行星&#xff0c;这样的行星可能同样也拥有适宜生命存在的条件。银河系大约有60亿颗类地行星。 开普勒442b 这是脱离太阳系以后&#xff0c;人类发现的第二颗离地球最近的类地行星。开普勒442b这颗类地行星位于天鹅座&#xff0c;离地球约有…

机器学习势系列教程(3):cp2k的安装

大家好&#xff0c;我是小马老师。 本文继续介绍机器学习势相关内容&#xff1a;cp2k的安装。 和abacus一样&#xff0c;cp2k也是一款开源的第一性原理模拟软件&#xff0c;模拟的数据也可作为机器学习势的训练数据集。 cp2k安装方法也很多&#xff0c;常见的有docker安装、…

数据可视化第十天(爬虫爬取某瓣星际穿越电影评论,并且用词云图找出关键词)

开头提醒 本次爬取的是用户评论&#xff0c;只供学习使用&#xff0c;不会进行数据的传播。希望大家合法利用爬虫。 获得数据 #总程序 import requests from fake_useragent import UserAgent import timefuUserAgent()headers{User-Agent:fu.random }page_listrange(0,10) …

AI绘画Stable diffusion小白入门:文生图精讲,超全干货一定要看!

大家好&#xff0c;我是设计师阿威 今天&#xff0c;我们将深入了解Stable diffusion的文生图功能&#xff0c;让你也能生成满意的图片&#xff01; 如上图&#xff0c;这是Stable diffusion的文生图界面&#xff0c;这个界面总体可以分为五个区域&#xff1a; 模型区&#xf…

NegativePrompt:利用心理学通过负面情绪刺激增强大型语言模型

【摘要】大型语言模型 (LLM) 已成为各种应用不可或缺的一部分&#xff0c;从传统的计算任务到高级人工智能 (AI) 应用。这种广泛的应用促使社会科学等各个学科对 LLM 进行了广泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通过积极的情绪刺激进一步…