Python编出爱心

Python编出的爱心有:1、文字组成的爱心;2、黑色背景爱心;3、粉色爱心。文字组成的爱心可以通过心形函数编写,打印第一个词后运用两个for循环,一行一行打印,在函数内部打印文字,在函数外面的打印空格,最后可以把每一个对应的心形图案依次打印出来。

1、文字组成的爱心

首先打开代码编辑器,然后输入画爱心轮廓,文字组成的爱心可以通过心形函数编写,打印第一个词后运用两个for循环,一行一行打印,在函数内部打印文字,在函数外面的打印空格,最后可以把每一个对应的心形图案依次打印出来。

代码:

import time
sentence = "Dear, I love you forever!"
for char in sentence.split():
   allChar = []
   for y in range(12, -12, -1):
       lst = []
       lst_con = ''
       for x in range(-30, 30):
            formula = ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3
            if formula <= 0:
                lst_con += char[(x) % len(char)]
            else:
                lst_con += ' '
       lst.append(lst_con)
       allChar += lst
   print('\n'.join(allChar))
   time.sleep(1)

2、黑色背景爱心

首先设置画布的宽和画布的高,并给画布中心的X轴坐标和Y轴坐标赋值,之后放大比例并选定心的颜色,定义爱心函数,并把爱心移动到画布中央, 运用随机函数实现爱心内部扩散从而呈现动态效果。并自定义曲线函数,调整跳动周期。定义爱心类,赋值原始爱心坐标集合以及边缘扩散效果点坐标集合, 定义数组包含每帧动态点坐标。最后补充轮廓、光环等函数实现黑色背景爱心的代码编写。

代码:

import random
from math import sin, cos, pi, log
from tkinter import *
CANVAS_WIDTH = 640  # 画布的宽
CANVAS_HEIGHT = 640  # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
IMAGE_ENLARGE = 11  # 放大比例
HEART_COLOR = "#e77c8e"  # 心的颜色#ff7171
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))
# 放大
    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: 新坐标
    """
    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(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
def curve(p):
    :param p: 参数
    :return: 正弦
return 2 * (3 * sin(4 * p)) / (2 * pi)
class Heart:
    def __init__(self, generate_frame=20):
        self._points = set()  # 原始爱心坐标集合
        self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合
        self._center_diffusion_points = set()  # 中心扩散效果点坐标集合
        self.all_points = {}  # 每帧动态点坐标
        self.build(2000)
        self.random_halo = 1000
        self.generate_frame = generate_frame
        for frame in range(generate_frame):
            self.calc(frame)
 def build(self, number):
        for _x, _y in list(self._points):
            for _ in range(3):
                x, y = scatter_inside(_x, _y, 0.05)
                self._edge_diffusion_points.add((x, y))
        # 爱心内再次扩散
        point_list = list(self._points)
        for _ in range(4000):
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, 0.17)
            self._center_diffusion_points.add((x, y))
 
   @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
    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 = []
       # 光环
        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))
         # 轮廓
        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))
        # 内容
        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
        def render(self, render_canvas, render_frame):
        for x, y, size in self.all_points[render_frame % self.generate_frame]:
            render_canvas.create_rectangle(x, y, x + size, y + size, width=0,    fill=HEART_COLOR)
        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
        root.title('宝贝爱你哟')#将标题设置为'tkinter'
        canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
        canvas.pack()
        heart = Heart()  # 心
        draw(root, canvas, heart)  # 开始画
        root.mainloop()

3、粉色爱心

在 Python 中,我们可以使用 Turtle 模块来绘制简单的图形,包括爱心,我们需要导入 Turtle 模块并设置画面大小和背景颜色;接下来,我们需要定义一个函数来绘制爱心。我们可以使用 Turtle 模块的画图函数来绘制两个半圆和一个三角形。在这个函数中,我们首先设置填充颜色为红色,并开始填充。然后,我们向左旋转 45 度并向前移动 200 个像素,绘制第一个半圆。接着,我们向右旋转 90 度并继续绘制另一个半圆。最后,我们向前移动 200 个像素并结束填充。

代码:

from turtle import *
pensize(1)
pencolor('red')
fillcolor('pink')
speed(5)
up()
goto(-30,100)
down()
begin_fill()
left(90)
circle(120,180)
circle(360,70)
left(38)
circle(360,70)
circle(120,180)
end_fill()
up()
goto(-100,-100)
down()

延伸阅读

Python 简介

  • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节,类似于PHP和Perl语言。
  • Python 是交互式语言:这意味着,用户可以在一个 Python 提示符 >>> 后直接执行代码。
  • Python 是面向对象语言:这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
  • Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。

开发者生产力工具大全

从人工到自动化,从重复到创新,技术演进的历程中,都伴随着开发者工具类产品的发展,所以这里整理近几年口碑良好,使用广泛的22款程序员生产力工具。

1.研发项目管理与协作:PingCode

优点:让工作推进、进度/问题追踪、团队协作变得更简单,2021年研发项目管理榜单TOP1(36Kr)。

简介:覆盖研发全生命周期,广泛用于需求、版本、项目(敏捷/kanban/瀑布)、测试、缺陷、文档、效能等环节管理与协作。并且集成github、gitlab、jinkens等主流工具,支持私有部署、在线等多种部署使用方式。

教程/官网

2.任务管理/甘特图制作工具:Worktile

优点:功能成熟、性价比高、国内市场占有率最高的团队任务工具;

简介:在功能上Worktile 是一个工具集合,它具备OKR目标管理、项目管理、项目集管理、项目计划、项目风险、项目成本管理、企业网盘、审批、简报等能力。并且具备强大的自定义能力,能够配置出符合各种项目团队的流程、表单、字段、数据报表,以及具备丰富的模板市场。

官网/教程

3.分布式版本控制系统:Git

优点:分布式开发、速度快、灵活

简介:Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

教程/官网

4.数据库管理工具:Navicat

优点:高效、安全,最好用的数据库管理工具。

简介:“Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和 MongoDB 等不同类型的数据库,它与阿里云、腾讯云、华为云、Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud 和 MongoDB Atlas等云数据库兼容。

官网/教程

其余工具可通过《神级程序员都用什么工具?程序员生产力工具大全 》查看,以上均整理自该文章。

文章标题:Python编出爱心,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/47647

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月24日 下午1:06
下一篇 2023年3月24日 下午2:11

相关推荐

  • 人机界面和组态软件有什么区别

    区别有:一、功能区别;二、难度区别;三、适用范围区别;四、应用场景区别。人机界面编程软件主要用于编写人机界面的程序代码,可以进行图形化编辑、控件设计、逻辑编程等操作。而组态软件则主要是用于设备参数设置、数据存储等操作。 一、功能区别 人机界面编程软件主要用于编写人机界面的程序代码,可以进行图形化编辑…

    2023年5月23日
    1100
  • IP 地址安全风险有哪些

    IP 地址安全风险有:1、使用您的 IP 地址下载非法内容;2、追踪您的位置;3、直接攻击您的网络;4、入侵您的设备;网络罪犯可以使用各种技术来获取您的 IP 地址。最常见的两种方法是社会工程和在线跟踪。 一、网络罪犯获取IP 地址最常见的两种方法 网络罪犯可以使用各种技术来获取您的 IP 地址。最…

    2022年10月24日
    78700
  • 办公oa软件怎么下载

    办公oa软件下载步骤:一、选择和确认软件类型;二、打开软件下载页面;三、选择下载方式;四、开始下载软件;五、安装和配置软件;六、使用软件。首先,需要确定所需要的办公OA软件类型。不同类型的软件功能和使用方式可能会有所不同,因此需要根据自己的需求和实际情况选择适合自己的软件。 一、选择和确认软件类型 …

    2023年3月31日
    3700
  • 云信IM SDK接口设计实践

    IM (Instant Messaging) 是网络上最流行的通信方式,与日常生活息息相关。 IM 软件也层出不穷,例如:微信、 QQ 、易信等。通过多年深耕和技术沉淀,云信产出了一套成熟稳定的 IM SDK 架构。它提供了 IM 的主要功能,大大降低了第三方实现 IM 功能的难度。本文主要对 IM…

    2022年3月17日
    22000
  • 项目应急管理工作如何开展

    要做到:一、做好应急管理工作,关键要建立健全预警系统;二、做好应急管理工作,核心要健全决策机制;三、做好应急管理工作,中心要规范信息传播;四、做好应急管理工作,重心要保证物资供应;五、做好应急管理工作,基础要坚持依法行政。 一、做好应急管理工作,关键要建立健全预警系统 预警是公共突发事件处置工作的第…

    2023年3月21日
    4300
  • 比特流下载是否合法

    比特流是一种合法的文件传输协议,只要内容可以合法地下载或上传,其使用(称为流下载)也就合法。但是,如果使用它来下载受版权保护的材料(例如新出的电影),并且未得到版权所有者的许可,就是不合法的。 比特流下载是否合法 比特流是一种合法的文件传输协议,只要内容可以合法地下载或上传,其使用(称为流下载)也就…

    2022年11月7日
    4800
  • 产品开发包括哪些内容

    产品开发包括:1、相关记录;2、开发任务书;3、产品开发计划;4、首件产品确认书;5、设计更改申请书;6、新产品评审记录;7、样品制作单等。产品开发(Product Development)就是企业改进老产品或开发新产品,使其具有新的特征或用途,以满足市场的需求的流程。 一、产品开发包括哪些内容 1…

    2023年4月17日
    4400
  • 如何开展项目管理工作

    开展项目管理工作的技巧:1、定义项目范围;2、确定项目时间表;3、评估可用资源;4、创建项目计划;5、与团队沟通;6、根据可用资源委派工作;7、记录一切;8、监控项目进度等。定义项目范围在项目阶段开始时执行。在设计项目范围时,您应该从大处着手并缩小项目重点。 1、定义项目范围 这是在项目启动阶段出现…

    2023年2月24日
    5400
  • 编程语言的编程语言是什么

    编程语言可以简单的理解为一种计算机和人都能识别的语言,一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。编程语言处在不断的发展和变化中,从最初的机器语言发展到如今的2500种以上的高级语言。 编程语言(programming language)可以…

    2023年2月23日
    2600
  • 联通智网CTO李军:自我认知是成长基础,数字化转型难在共识

    文| babayage 编辑 | 笑 笑 “我对自己的人生有着明确规划,可规划并不完全与成就划等号,缺乏思辨能力和认知能力支撑的规划,也难免掉进坑里。” 2006~2011 PC互联网时期 授权,入门管理的第一个槛 早在大学时代李军便意识到,成长一定要与时代同频。他人生的前30年,一直走在一条“正确…

    2022年3月20日
    37100

发表回复

登录后才能评论
联系我们
站长微信
站长微信
分享本页
返回顶部