使用Python生成一束玫瑰花
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_ratioy *= shrink_ratio# 将爱心移到画布中央x += CANVAS_CENTER_Xy += CANVAS_CENTER_Yreturn 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 - dydef 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 - dydef 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 = 1000self.generate_frame = generate_framefor 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))@staticmethoddef 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 - dydef 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_pointsdef 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生成艺术作品是一个有趣且富有创造性的过程。通过简单的数学公式和编程技巧,我们可以创造出自然界中的美丽图案。
相关文章:

使用Python生成一束玫瑰花
520到了,没时间买花?我们来生成一个电子的。 Python不仅是一种强大的编程语言,用于开发应用程序和分析数据,它也可以用来创造美丽的艺术作品。在这篇博客中,我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…...

紫光同创PGL22G开发板|盘古22K开发板,国产FPGA开发板,接口丰富
盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板,全面实现国产化方案,板载资源丰富,高容量、高带宽,外围接口丰富,不仅适用于高校教学,还可以用于实验项目、项目开发,一板…...

大模型的实践应用24-LLaMA-Factory微调通义千问qwen1.5-1.8B模型的实例
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用24-LLaMA-Factory微调通义千问qwen1.5-1.8B模型的实例, LLaMA-Factory是一个专门用于大语言模型微调的框架,它支持多种微调方法,如LoRA、QLoRA等,并提供了丰富的数据集和预训练模型,便于用户进行模型微调。通义千问…...
力扣爆刷第142天之二叉树五连刷(构造树、搜索树)
力扣爆刷第142天之二叉树五连刷(构造树、搜索树) 文章目录 力扣爆刷第142天之二叉树五连刷(构造树、搜索树)一、106. 从中序与后序遍历序列构造二叉树二、654. 最大二叉树三、617. 合并二叉树四、700. 二叉搜索树中的搜索五、98. …...

0407放大电路的频率响应
放大电路的频率响应 单时间常数RC电路的频率响应中频响应高频响应低频响应全频域响应 放大电路频率响应概述1. 直接耦合放大电路频域响应阻容耦合放大电路频域响应 4.7.1 单时间常数RC电路的频率响应 4.7.2 放大电路频率响应概述 4.7.3 单级共射极放大电路的频率响应 4.7.4 单级…...
数据分析必备:一步步教你如何用Pandas做数据分析(6)
1、Pandas 函数应用 Pandas 重建索引操作实例 要将您自己或其他库的函数应用于Pandas对象,您应该了解三个重要的方法。方法如下所述。要使用的适当方法取决于您的函数是希望对整个数据帧进行操作,还是行操作还是按列操作,还是按元素操作。 表…...

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南
Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关? 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…...

创建一个python的Django项目文件
创建一个python的Django项目文件(内含conda) 文章目录 创建一个python的Django项目文件(内含conda)前言一、conda环境的下载二、配置conda的环境变量三、激活管理环境四、下载Django五、创建Django项目文件六、启动Django文件七、用pycharm直接创建Django文件 前言 大家好,今天…...
NB49 牛群的秘密通信
描述 在一个远离人类的世界中,有一群牛正在进行秘密通信。它们使用一种特殊的括号组合作为加密通信的形式。每一组加密信息均包括以下字符:(,{,[,),},]。 加密信息需要满足以下有效性规则: 每个左括号必须使用相同类型的右括号闭合。左括号…...

Git系列:git mv 高效的文件重命名与移动操作
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

美区TikTok小店又出潜力爆品!“痘痘贴”一周销售八万单!
保健品在美区小店“大杀四方”的同时,个别美妆个护单品也在悄悄上分。 据超店有数的「销量飙升榜」显示,一款由Zikoo推出的“痘痘贴”最近一周内销量正在飞速上升,环比增长高达209.29%,销量近8万件。 来源:超店有数「销…...
C++两种内置栈的使用
第一种:使用C内置栈数据类型 stack<int> q; //C内置栈数据类型 int x; q.push(x); //将x压入栈顶 q.top(); //返回栈顶的元素 q.pop(); //删除栈顶的元素 q.size(); //返回栈中元素的个数 q.empty(); //检查栈是否为空,若为空返回true,否则返回false第二…...
如何用电脑批量操作多部手机
如果你有很多手机,然后需要在这些手机上同时执行相同的操作,这个时候如果能有一种办法批量操作,将会大大提高效率,节省很多时间。本文将介绍基于uiautomator2实现的群控手机方案。 uiautomator2 是 一种 Android 自动化测试框架&…...

Delphi 程序例子(DPI变化自动感知及显示器相关功能演示)
目录 一、前言 二、Delphi 演示程序(D12版本,用D11也都可以) 1. 演示程序功能: 2. 程序界面: 3. 程序源代码下载(有偿): 一、前言 系列文章: 彻底搞懂 Windows 显示…...
mysql主从复制的步骤和使用到的操作命令有哪些?
步骤: 配置主服务器(Master): 启用二进制日志记录(binary logging)。配置主服务器的唯一标识(server-id)。创建用于复制的专用复制账户。 配置从服务器(Slave࿰…...
[AIGC] Java CompletableFuture:简介及示例
Java 8 引入了一个名为 CompletableFuture 的新库,正如其名称所示,该库提供了一种名为 “Completable Future” 的新 API,其主要目的是支持异步编程,并通过可搜索的操作将这些异步操作进行聚合管控。 文章目录 CompletableFuture …...

五步定位性能瓶颈
一、着手测试前的准备:优化数据流向与系统架构分析 在进行性能测试或系统优化之前,明确数据流向和系统架构的细节是至关重要的步骤。这不仅能够帮助识别潜在的瓶颈,还能确保测试用例设计的全面性与针对性。以下是关键步骤和方法:…...
currentTarget指向监听者Target:指向触发者
在JavaScript的事件处理中,currentTarget 和 target 是两个重要的属性,它们常常用于区分事件处理函数当前绑定的元素和实际触发事件的元素。这两个属性的意义可以用下面的方式解释: currentTarget 指向监听者:这意味着currentTa…...

OpenAI宫斗剧番外篇: “Ilya与Altman联手对抗微软大帝,扫除黑恶势力”,“余华”和“莫言”犀利点评
事情是这样的。 小编我是一个重度的智谱清言用户,最近智谱清言悄悄上线了一个“划词引用”功能后,我仿佛打开了新世界的大门。我甚至用这个小功能,玩出来了即将为你上映的《OpenAI宫斗剧番外篇》。 3.5研究测试:hujiaoai.cn 4研…...

网关路由SpringCloudGateway、nacos配置管理(热更新、动态路由)
文章目录 前言一、网关路由二、SpringCloudGateway1. 路由过滤2. 网关登录校验2.1 鉴权2.2 网关过滤器2.3 登录校验2.3.1 JWT2.3.2 登录校验过滤器 3. 微服务从网关获取用户4. 微服务之间用户信息传递 三、nacos配置管理问题引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...