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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内快速下载hugging face大模型的方法

由于众所周知的原因,从hugging face下载大模型比较困难,幸好国内有人做了镜像站,可以通过国内的镜像站进行快速下载,以下是配置方法。 我的系统是ubuntu 22,这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

民国漫画杂志《时代漫画》第14期.PDF

时代漫画14.PDF: https://url03.ctfile.com/f/1779803-1247458399-6732ac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

压摆率SR、增益带宽积GBP、开环增益Aol

运放的选型对运放电路的实际效果非常关键,一定要理解运放重要参数的概念。下面几天将对运放的选型进行系统学习并做实验 运放的压摆率(Slew Rate,简称SR)是指闭环放大器在输入为阶跃信号时,输出电压时间变化率的平均值…

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别(OCR) 2. 文字检测技术 2.1 CTPN(2016) 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network(基于连接文本提议网络的自然图像文本…

测试驱动编程(2)进阶单元测试(上)

文章目录 测试驱动编程(2)进阶单元测试(上)单元测试单元测试正确打开方式各类测试比较 TDD中的单元测试 测试驱动编程(2)进阶单元测试(上) 单元测试 要打造出出类拔萃的作品,你必须专注于最小的细节 单元测试正确打…

Vue3 实现共享数据三种方式

1. Vuex 1.1 安装vuex npm install vuexlatest 1.2 创建store文件夹,创建index.js文件 在vuex4.x中 创建vuex实例需要使用createStore方法 // store/index.js import { createStore } from vuex import useLoginStore from ./modules/loginexport default cre…

MySql--SQL语言

目录 SQl---DDL 结构定义 创建、删除 数据库 代码 运行 设计表 数据类型 整数 浮点数 主键 约束 主键自增长 默认值 字段注释 创建、删除 表 代码 运行 代码 代码 运行 SQL---DML 数据操纵 插入数据 代码 运行 代码 运行 代码 运行 代码 …

轻量音乐网站程序源码,在线音乐免费听歌

这是一个高品质的音乐共享和流媒体平台,用户可以在这个网站上免费在线听歌。这个轻量级的音乐网站程序源码,是您创建自己的音乐流媒体网站的最佳选择!它还支持制作插件,并且在更新后,您可以保留您的自定义设置。 下 载…

LeetCode刷题之HOT100之比特位计数

今天把仙剑三看完了,茂茂割肉让人无法释怀,眼泪止不住的流。长卿和紫萱的分离似乎也意味着重逢,这就是他们的宿命吧。怅然若失的感觉席卷全身,哎,做题吧。 1、题目描述 2、逻辑分析 题目要求将整数从0到此元素&#…

番外篇 | YOLOv5更换主干网络之Conformer:首个CNN + Transformer的backbone模型

前言:Hello大家好,我是小哥谈。Transformer和CNN在处理视觉表征方面都有着各自的优势以及一些不可避免的问题。因此,国科大、鹏城实验室和华为研究人员首次将二者进行了融合并提出全新的Conformer模型,其可以在不显著增加计算量的前提下显著提升了基网表征能力。论文已被IC…

“壕无人性”的沙特也要买量子计算机!巨头沙特阿美的合作方竟是它?

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:1200字丨5分钟阅读 摘要:石油巨头沙特阿美与 Pasqal 开启合作,计划于 2025 年部署一台 200 量子比特的量子计算机&#xff…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同,默认root开机不能登录。 1、输入一下命令创建root密码,根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件,将auth required pam_succeed_if.so user ! root quiet_success这行注释掉,这行就…

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候,希望有一个弹窗,进行相对应的内容添加操作。 一.在Views文件夹中,再创建一个Dialog 文件夹,用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…

ROS | 标准消息包std_msgs和common_msgs

std_msgs Duration:相对时间 可正可负 Time:绝对时间 一定大于0 Header:记录时间戳的结构体 MultiArrayDimension,MultiArrayLayout:描述数组的结构体 common_msgs visualization_msgs 图形显示包 几何消息包: 传感器消息包:

必应崩了?

目录 今天使用必应发现出现了不能搜索,弹出乱码的情况。 搜了一下,发现其他人也出现了同样的问题。 使用Edge浏览器的话,可以试着改一下DNS,有可能会恢复正常(等官方修复了记得改回来) 使用谷歌浏览器打开…

A股翻车现场

英伟达业绩炸裂,但今天A股这边不仅没喝着汤,还再度上演大型翻车现场,人家不仅股价大涨7个点还站上1000美元大关, 而咱A股里的英伟达,AI,TMT相关概念股,包括工业(富联)&am…

蓝牙Classic加密算法设计和实现,SAFER+,E0,E1,E2,E3(python)

概述 之前用python给大家实现了所有LE相关加密工具算法。bobwenstudy/BluetoothCryptographicToolbox: LE SMP加密算法设计和实现(python) (github.com),最近重温了下Classic加密,顺便将Classic所有加密算法给实现了一遍。 在蓝牙Classic Spec中&#…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录: 实物演示效果 目录: 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

IPA酒精清洁笔:打印机打印头、相机镜头等光学设备清洁的好帮手!

打印机打印头、相机镜头等光学设备在长期使用的过程中,会产生油脂、污渍和灰尘等污染物杂质,从而影响到打印质量、镜头清晰度等。通过IPA酒精清洁笔可以简便快捷、安全有效的清除这些污染物杂质,保持设备表面的清洁度,从而确保设备…

列举几个淘宝商品详情API接口测试示例

API名:item_get 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes…