当前位置: 首页 > news >正文

Python实例:爱心代码

前言

在编程的奇妙世界里,代码不仅仅是冰冷的指令集合,它还可以成为表达情感、传递温暖的独特方式。今天,我们将一同探索用 Python 语言绘制爱心的神奇之旅。

爱心,这个象征着爱与温暖的符号,一直以来都在人类的情感世界中占据着特殊的地位。而通过 Python 的强大功能,我们可以将这一美好的象征以数字化的形式呈现出来。

无论是向心爱的人表达爱意,还是为了给自己的编程之旅增添一抹浪漫的色彩,这段 Python 爱心代码都将成为你手中的魔法棒。它不仅仅是一段代码,更是一份情感的寄托,一个创意的表达。

在接下来的代码中,我们将运用 Python 的绘图库和数学知识,精心构建一个充满爱意的爱心图案。每一行代码都像是一个小小的画笔,共同勾勒出这份独特的情感画卷。让我们一起沉浸在编程的乐趣中,感受代码与爱心的完美融合。

爱心代码

通过使用turtle库实现画爱心

pip安装步骤

同时按Win+R键,调出“运行”对话框;

fbdf5e0a66d5443ca6887de2c144148f.png

然后在对话框中输入cmd,敲回车键运行;

76ccd1e102ae4555b2cbce789a37c6ae.png

进入【cmd.exe】界面;

df67da7a40d34c98806971c3fff7ab14.png

在【cmd.exe】中输入安装命令:pip install turtle

安装成功后如下图所示:

使用turtle库可以绘制很多不同的图形

多边形

绘制三角形:

import turtlet = turtle.Turtle()for _ in range(3):t.forward(100)t.left(120)turtle.done()

正方形:

import turtlet = turtle.Turtle()for _ in range(4):t.forward(100)t.left(90)turtle.done()

正五边形:

import turtlet = turtle.Turtle()for _ in range(5):t.forward(100)t.left(72)turtle.done()
圆形和弧形

圆形:

import turtlet = turtle.Turtle()t.circle(50)turtle.done()

半圆:

import turtlet = turtle.Turtle()t.circle(50, 180)turtle.done()
螺旋图形

螺旋线:

import turtlet = turtle.Turtle()
for i in range(100):t.forward(i * 5)t.right(144)turtle.done()
花朵形状

简单花朵:

import turtlet = turtle.Turtle()for _ in range(12):t.circle(50)t.right(30)turtle.done()
星星形状

五角星:

import turtlet = turtle.Turtle()for _ in range(5):t.forward(100)t.right(144)turtle.done()

Python代码实现

代码展示

这段代码使用turtle库的函数来控制画笔绘制一个红色的爱心图形。你可以根据需要调整画笔速度和颜色等参数。

import turtle# 设置画笔速度和颜色
t = turtle.Turtle()
t.speed(3)
t.color("red")# 绘制爱心
def draw_heart():t.begin_fill()t.left(140)t.forward(111.65)t.circle(-45, 195)t.left(120)t.circle(-45, 195)t.forward(111.65)t.end_fill()draw_heart()turtle.done()

代码逐行注释

import turtle# 设置画笔速度和颜色
t = turtle.Turtle()  # 创建一个 turtle 对象,命名为 t
t.speed(3)  # 设置画笔移动速度为 3,值越大速度越快
t.color("red")  # 设置画笔颜色为红色# 绘制爱心
def draw_heart():t.begin_fill()  # 开始填充图形t.left(140)  # 向左旋转 140 度t.forward(111.65)  # 向前移动 111.65 个单位长度t.circle(-45, 195)  # 以半径为 -45 画 195 度的弧t.left(120)  # 再次向左旋转 120 度t.circle(-45, 195)  # 以半径为 -45 画另一段 195 度的弧t.forward(111.65)  # 向前移动 111.65 个单位长度,回到起始位置t.end_fill()  # 结束填充图形draw_heart()  # 调用函数绘制爱心turtle.done()  # 使窗口保持打开状态,等待用户关闭

运行思路

以下是这段代码的运行思路:

  • 首先导入turtle模块,这个模块提供了绘制图形的功能。
  • 创建一个turtle对象t,它将用于执行各种绘图操作。
  • 设置画笔的移动速度为3,这样在绘制图形时可以看到画笔的移动过程,速度适中既不会太快让人看不清,也不会太慢影响体验。
  • 设置画笔的颜色为 “红色”,确定绘制爱心的颜色。
  • 定义一个函数draw_heart来专门绘制爱心。
    • 在这个函数中,首先调用t.begin_fill()表示开始填充图形,后续封闭的图形内部将被填充颜色。
    • 然后通过t.left(140)将画笔向左旋转140度,为绘制爱心的起始角度做准备。
    • t.forward(111.65)让画笔向前移动特定长度,这是爱心的一部分线条。
    • t.circle(-45, 195)以半径为-45画一个195度的圆弧,这是爱心的一个弯曲部分。
    • t.left(120)再次向左旋转120度,调整画笔方向以绘制爱心的另一部分。
    • 再次调用t.circle(-45, 195)画另一段圆弧。
    • 最后通过t.forward(111.65)回到起始位置,完成爱心的轮廓。
    • 调用t.end_fill()结束填充,此时爱心内部将被填充为之前设置的颜色。
  • 调用draw_heart()函数开始绘制爱心。
  • 最后,turtle.done()确保程序运行结束后绘图窗口不会立即关闭,而是保持打开状态,以便用户查看绘制好的爱心图形。

Python实现效果图

  代码效果图:

  代码实现效果图:

修改代码

下面是一个更复杂的 Python 爱心代码,其中加入了一些动态效果和颜色变化:

import turtle
import time
import random# 设置窗口
window = turtle.Screen()
window.bgcolor("black")
window.title("Complex Heart")# 创建画笔
pen = turtle.Turtle()
pen.speed(0)
pen.pensize(2)# 定义颜色列表
colors = ["red", "pink", "purple", "orange"]# 绘制爱心函数
def draw_heart(size):pen.begin_fill()pen.left(140)pen.forward(size)pen.circle(-size/2, 195)pen.left(120)pen.circle(-size/2, 195)pen.forward(size)pen.end_fill()# 绘制多个爱心并动态变化
for _ in range(50):x = random.randint(-300, 300)y = random.randint(-300, 300)color = random.choice(colors)pen.penup()pen.goto(x, y)pen.pendown()pen.color(color)size = random.randint(20, 100)draw_heart(size)# 显示文字
pen.penup()
pen.goto(0, -200)
pen.color("white")
pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))# 结束绘制
turtle.done()
代码逐行注释
import turtle
import time
import random# 设置窗口
window = turtle.Screen()  # 创建一个 turtle 绘图窗口对象
window.bgcolor("black")  # 将窗口背景颜色设置为黑色
window.title("Complex Heart")  # 设置窗口标题为"Complex Heart"# 创建画笔
pen = turtle.Turtle()  # 创建一个 turtle 画笔对象,命名为 pen
pen.speed(0)  # 设置画笔移动速度为最快(0)
pen.pensize(2)  # 设置画笔的粗细为 2# 定义颜色列表
colors = ["red", "pink", "purple", "orange"]  # 创建一个包含多种颜色的列表# 绘制爱心函数
def draw_heart(size):pen.begin_fill()  # 开始填充图形pen.left(140)  # 向左旋转 140 度pen.forward(size)  # 向前移动指定大小的距离pen.circle(-size/2, 195)  # 以负半径画 195 度的圆弧pen.left(120)  # 再次向左旋转 120 度pen.circle(-size/2, 195)  # 再次以负半径画 195 度的圆弧pen.forward(size)  # 向前移动指定大小的距离,回到起始位置pen.end_fill()  # 结束填充图形# 绘制多个爱心并动态变化
for _ in range(50):  # 循环 50 次x = random.randint(-300, 300)  # 生成一个 -300 到 300 之间的随机整数作为 x 坐标y = random.randint(-300, 300)  # 生成一个 -300 到 300 之间的随机整数作为 y 坐标color = random.choice(colors)  # 从颜色列表中随机选择一种颜色pen.penup()  # 抬起画笔,移动时不绘制线条pen.goto(x, y)  # 将画笔移动到指定的坐标位置pen.pendown()  # 放下画笔,准备绘制pen.color(color)  # 设置画笔颜色为随机选择的颜色size = random.randint(20, 100)  # 生成一个 20 到 100 之间的随机整数作为爱心大小draw_heart(size)  # 调用函数绘制爱心# 显示文字
pen.penup()  # 抬起画笔
pen.goto(0, -200)  # 将画笔移动到坐标 (0, -200)
pen.color("white")  # 设置画笔颜色为白色
pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))  # 在当前位置书写文字# 结束绘制
turtle.done()  # 使窗口保持打开状态,等待用户关闭
运行思路
  • 导入必要的模块:

    • turtle模块用于绘图。
    • time模块虽然在这段代码中未被显式使用,但可能在后续扩展中用于控制动画的时间间隔等。
    • random模块用于生成随机数。
  • 设置窗口:

    • 创建一个turtle绘图窗口对象window
    • 将窗口背景颜色设置为黑色,通过window.bgcolor("black")
    • 设置窗口标题为 “Complex Heart”,使用window.title("Complex Heart")
  • 创建画笔:

    • 创建一个turtle画笔对象pen
    • 设置画笔移动速度为最快(速度参数为 0),pen.speed(0),这样在绘制时可以快速完成,减少等待时间。
    • 设置画笔的粗细为 2,pen.pensize(2)
  • 定义颜色列表:

    • 创建一个包含多种颜色的列表colors,其中包含 “red”(红色)、“pink”(粉色)、“purple”(紫色)和 “orange”(橙色)等颜色,用于给爱心随机上色。
  • 绘制多个爱心并动态变化:

    • 使用一个循环,循环次数为 50 次。
    • 在每次循环中:
      • 生成随机的坐标值xy,范围在 -300 到 300 之间,x = random.randint(-300, 300)y = random.randint(-300, 300)。这将决定每个爱心在窗口中的位置。
      • 从颜色列表中随机选择一种颜色赋给colorcolor = random.choice(colors)
      • 抬起画笔,pen.penup(),移动到随机生成的坐标位置,pen.goto(x, y),然后放下画笔,pen.pendown()
      • 生成一个随机的爱心大小size,范围在 20 到 100 之间,size = random.randint(20, 100)
      • 使用随机选择的颜色设置画笔颜色,pen.color(color)
      • 调用draw_heart(size)函数绘制爱心,传入随机生成的大小参数。
  • 显示文字:

    • 抬起画笔,pen.penup()
    • 将画笔移动到坐标 (0, -200),pen.goto(0, -200)
    • 设置画笔颜色为白色,pen.color("white")
    • 使用指定的字体、大小和对齐方式在当前位置书写文字 “Love is in the air!”,pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))
  • 结束绘制:

    • 调用turtle.done()使窗口保持打开状态,等待用户关闭窗口。这样用户可以查看绘制好的图形。
Python实现效果图
代码效果图

代码实现效果图

呼吸效果修改

更加复杂绚丽且带有呼吸效果的 Python 爱心代码:

import turtle
import time
import random# 设置窗口
window = turtle.Screen()
window.bgcolor("black")
window.title("Complex Heart with Breathing Effect")# 创建画笔
pen = turtle.Turtle()
pen.speed(0)
pen.pensize(2)# 定义颜色列表
colors = ["red", "pink", "purple", "orange", "magenta", "cyan"]# 绘制爱心函数
def draw_heart(size):pen.begin_fill()pen.left(140)pen.forward(size)pen.circle(-size/2, 195)pen.left(120)pen.circle(-size/2, 195)pen.forward(size)pen.end_fill()# 呼吸效果函数
def breathing_effect(size):while True:for i in range(10):pen.clear()new_size = size + idraw_heart(new_size)time.sleep(0.05)for i in range(10):pen.clear()new_size = size + 9 - idraw_heart(new_size)time.sleep(0.05)# 绘制多个爱心并动态变化
for _ in range(50):x = random.randint(-300, 300)y = random.randint(-300, 300)color = random.choice(colors)pen.penup()pen.goto(x, y)pen.pendown()pen.color(color)size = random.randint(20, 100)draw_heart(size)breathing_effect(size)# 显示文字
pen.penup()
pen.goto(0, -200)
pen.color("white")
pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))# 结束绘制
turtle.done()
逐行注释
import turtle
import time
import random# 设置窗口
window = turtle.Screen()  # 创建一个 turtle 绘图窗口对象
window.bgcolor("black")  # 将窗口背景颜色设置为黑色
window.title("Complex Heart with Breathing Effect")  # 设置窗口标题# 创建画笔
pen = turtle.Turtle()  # 创建一个 turtle 画笔对象
pen.speed(0)  # 设置画笔移动速度为最快
pen.pensize(2)  # 设置画笔粗细为 2# 定义颜色列表
colors = ["red", "pink", "purple", "orange", "magenta", "cyan"]  # 可用于爱心的颜色列表# 绘制爱心函数
def draw_heart(size):pen.begin_fill()  # 开始填充图形pen.left(140)  # 向左旋转 140 度pen.forward(size)  # 向前移动指定大小的距离pen.circle(-size/2, 195)  # 以负半径画 195 度的圆弧pen.left(120)  # 再次向左旋转 120 度pen.circle(-size/2, 195)  # 再次以负半径画 195 度的圆弧pen.forward(size)  # 向前移动指定大小的距离,回到起始位置pen.end_fill()  # 结束填充图形# 呼吸效果函数
def breathing_effect(size):while True:  # 无限循环以实现持续的呼吸效果for i in range(10):  # 逐渐增大爱心尺寸pen.clear()  # 清除之前的图形new_size = size + i  # 计算新的爱心尺寸draw_heart(new_size)  # 绘制新尺寸的爱心time.sleep(0.05)  # 暂停一小段时间,控制动画速度for i in range(10):  # 逐渐减小爱心尺寸pen.clear()  # 清除之前的图形new_size = size + 9 - i  # 计算新的爱心尺寸draw_heart(new_size)  # 绘制新尺寸的爱心time.sleep(0.05)  # 暂停一小段时间,控制动画速度# 绘制多个爱心并动态变化
for _ in range(50):  # 循环 50 次,绘制多个爱心x = random.randint(-300, 300)  # 随机生成 x 坐标y = random.randint(-300, 300)  # 随机生成 y 坐标color = random.choice(colors)  # 从颜色列表中随机选择一种颜色pen.penup()  # 抬起画笔pen.goto(x, y)  # 移动到随机坐标位置pen.pendown()  # 放下画笔pen.color(color)  # 设置画笔颜色为随机选择的颜色size = random.randint(20, 100)  # 随机生成爱心尺寸draw_heart(size)  # 绘制爱心breathing_effect(size)  # 为每个爱心添加呼吸效果# 显示文字
pen.penup()  # 抬起画笔
pen.goto(0, -200)  # 移动到指定坐标位置
pen.color("white")  # 设置画笔颜色为白色
pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))  # 书写文字# 结束绘制
turtle.done()  # 使窗口保持打开状态,等待用户关闭
运行思路
  • 导入模块:

    • turtle模块用于图形绘制。
    • time模块用于控制时间间隔,实现动画效果。
    • random模块用于生成随机数。
  • 设置窗口:

    • 创建一个turtle绘图窗口对象window
    • 将窗口背景颜色设置为黑色,window.bgcolor("black"),营造出特定的氛围。
    • 设置窗口标题为 “Complex Heart with Breathing Effect”,window.title("Complex Heart with Breathing Effect")
  • 创建画笔:

    • 创建一个turtle画笔对象pen
    • 设置画笔移动速度为最快,pen.speed(0),这样在绘制时可以快速呈现效果。
    • 设置画笔粗细为 2,pen.pensize(2)
  • 定义颜色列表:

    • 创建一个包含多种颜色的列表colors,这些颜色将用于绘制不同的爱心。
  • 定义绘制爱心的函数:

    • draw_heart(size)函数用于绘制一个特定大小的爱心。
    • 首先,开始填充图形,pen.begin_fill()
    • 然后,通过一系列的移动和画弧操作,使用给定的大小参数size,绘制出爱心的形状。
    • 最后,结束填充图形,pen.end_fill()
  • 定义呼吸效果函数:

    • breathing_effect(size)函数实现爱心的呼吸效果。
    • 使用一个无限循环while True,确保呼吸效果持续进行。
    • 在循环中,通过两个嵌套的for循环来逐渐增大和减小爱心的尺寸。
    • 每次循环中,先清除之前的图形,pen.clear()
    • 然后计算新的爱心尺寸,new_size = size + inew_size = size + 9 - i
    • 调用draw_heart(new_size)绘制新尺寸的爱心。
    • 使用time.sleep(0.05)暂停一小段时间,控制动画的速度,使呼吸效果看起来更加自然。
  • 绘制多个爱心并动态变化:

    • 使用一个循环,循环次数为 50 次。
    • 在每次循环中:
      • 生成随机的坐标值xy,范围在 -300 到 300 之间,x = random.randint(-300, 300)y = random.randint(-300, 300),确定每个爱心在窗口中的位置。
      • 从颜色列表中随机选择一种颜色赋给colorcolor = random.choice(colors)
      • 抬起画笔,pen.penup(),移动到随机生成的坐标位置,pen.goto(x, y),然后放下画笔,pen.pendown()
      • 生成一个随机的爱心大小size,范围在 20 到 100 之间,size = random.randint(20, 100)
      • 使用随机选择的颜色设置画笔颜色,pen.color(color)
      • 调用draw_heart(size)绘制爱心。
      • 接着调用breathing_effect(size)为每个爱心添加呼吸效果。
  • 显示文字:

    • 抬起画笔,pen.penup()
    • 将画笔移动到坐标 (0, -200),pen.goto(0, -200)
    • 设置画笔颜色为白色,pen.color("white")
    • 使用指定的字体、大小和对齐方式在当前位置书写文字 “Love is in the air!”,pen.write("Love is in the air!", align="center", font=("Arial", 20, "bold"))
  • 结束绘制:

    • 调用turtle.done()使窗口保持打开状态,等待用户关闭窗口。这样用户可以查看绘制好的图形和动画效果。
Python实现效果图
代码效果图

代码实现效果图

不同编程语言实现

一、Python 使用 turtle 库
import turtle
import math# 设置画笔速度和填充颜色模式
t = turtle.Turtle()
t.speed(5)
turtle.colormode(255)# 绘制爱心并实现颜色渐变
def draw_heart_and_gradient():for angle in range(0, 360):r = 150 - 150 * math.sin(math.radians(angle))x = r * math.cos(math.radians(angle))y = r * math.sin(math.radians(angle))t.penup()t.goto(x, y)t.pendown()# 设置颜色渐变,这里根据角度调整 RGB 值t.color(int(255 * (angle / 360)), int(150 * (angle / 360)), int(200 * (angle / 360)))t.begin_fill()t.circle(5)t.end_fill()draw_heart_and_gradient()turtle.done()
代码逐行注释
import turtle
import math# 设置画笔速度和填充颜色模式
t = turtle.Turtle()
t.speed(5)
turtle.colormode(255)# 绘制爱心并实现颜色渐变
def draw_heart_and_gradient():for angle in range(0, 360):r = 150 - 150 * math.sin(math.radians(angle))x = r * math.cos(math.radians(angle))y = r * math.sin(math.radians(angle))t.penup()t.goto(x, y)t.pendown()# 设置颜色渐变,这里根据角度调整 RGB 值t.color(int(255 * (angle / 360)), int(150 * (angle / 360)), int(200 * (angle / 360)))t.begin_fill()t.circle(5)t.end_fill()draw_heart_and_gradient()turtle.done()
运行思路
  • 导入必要的模块:

    • turtle模块用于图形绘制。
    • math模块用于数学计算,这里主要用于角度和弧度的转换以及三角函数的计算。
  • 设置画笔和颜色模式:

    • 创建一个turtle画笔对象t
    • 设置画笔速度为5,这个速度值可以控制画笔移动的快慢,数值越大速度越快。
    • 使用turtle.colormode(255)设置颜色模式为255模式,这意味着可以使用 0 到 255 的整数值来表示 RGB 颜色通道的值。
  • 定义绘制爱心并实现颜色渐变的函数:

    • draw_heart_and_gradient函数用于绘制带有颜色渐变效果的爱心。
    • 使用一个循环遍历从 0 到 360 度的角度范围:
      • 对于每个角度,首先根据心形曲线的数学公式r = 150 - 150 * math.sin(math.radians(angle))计算出当前角度对应的半径r。这里使用了math.sin函数来计算正弦值,并且通过math.radians(angle)将角度从度转换为弧度,因为三角函数在 Python 的math模块中通常接受弧度作为参数。
      • 接着,通过x = r * math.cos(math.radians(angle))y = r * math.sin(math.radians(angle))计算出当前角度对应的坐标(x, y)。这里使用了三角函数math.cosmath.sin来计算横坐标和纵坐标。
      • 然后,抬起画笔t.penup(),移动到计算出的坐标位置t.goto(x, y),再放下画笔t.pendown()
      • 根据当前角度调整 RGB 值来设置画笔颜色。具体来说,使用t.color(int(255 * (angle / 360)), int(150 * (angle / 360)), int(200 * (angle / 360)))。这里通过将角度与特定的数值进行计算,得到不同角度下的 RGB 值,从而实现颜色渐变效果。
      • 开始填充图形t.begin_fill(),画一个半径为 5 的圆t.circle(5),这个圆将作为爱心的一部分,最后结束填充t.end_fill()
  • 调用绘制函数:

    • 调用draw_heart_and_gradient()函数开始绘制带有颜色渐变的爱心。
  • 保持窗口打开:

    • 使用turtle.done()使turtle绘图窗口保持打开状态,等待用户手动关闭窗口。这样用户可以查看绘制好的图形。
二、JavaScript 使用 canvas API
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8">
</head><body><canvas id="myCanvas" width="500" height="500"></canvas><script>const canvas = document.getElementById('myCanvas');const ctx = canvas.getContext('2d');// 绘制爱心并实现颜色渐变function drawHeartAndGradient() {// 遍历 0 到 360 度for (let angle = 0; angle < 360; angle++) {// 根据心形曲线公式计算半径const r = 150 - 150 * Math.sin(angle * (Math.PI / 180));// 计算横坐标const x = r * Math.cos(angle * (Math.PI / 180));// 计算纵坐标const y = r * Math.sin(angle * (Math.PI / 180));// 设置颜色渐变,这里根据角度调整 RGB 值ctx.fillStyle = `rgb(${255 * (angle / 360)}, ${150 * (angle / 360)}, ${200 * (angle / 360)})`;ctx.beginPath();// 在指定位置画一个小圆点作为爱心的一部分ctx.arc(x + canvas.width / 2, y + canvas.height / 2, 5, 0, 2 * Math.PI);ctx.fill();}}drawHeartAndGradient();</script>
</body></html>
运行思路
  • 在 HTML 文件中创建一个 <canvas> 元素,并通过 document.getElementById 获取到这个元素的引用,同时获取其 2D 绘图上下文 ctx
  • 定义一个函数 drawHeartAndGradient
    • 在这个函数中,使用一个循环遍历从 0 到 360 的角度。
    • 对于每个角度,根据心形曲线公式 const r = 150 - 150 * Math.sin(angle * (Math.PI / 180)) 计算出半径 r
    • 然后通过 const x = r * Math.cos(angle * (Math.PI / 180))  const y = r * Math.sin(angle * (Math.PI / 180)) 计算出该角度对应的坐标 (x, y)
    • 根据当前角度计算颜色的 RGB 值,设置为填充样式 ctx.fillStyle = rgb(${255 * (angle / 360)}, ${150 * (angle / 360)}, ${200 * (angle / 360)})`
    • 开始路径,在指定位置画一个半径为 5 的圆 ctx.arc(x + canvas.width / 2, y + canvas.height / 2, 5, 0, 2 * Math.PI),然后填充这个圆。
  • 调用 drawHeartAndGradient 函数开始绘制爱心和颜色渐变效果。
三、Java 使用 Graphics2D
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;class HeartWithGradient extends JPanel {@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2d = (Graphics2D) g;// 遍历 0 到 360 度for (int angle = 0; angle < 360; angle++) {// 根据心形曲线公式计算半径double r = 150 - 150 * Math.sin(Math.toRadians(angle));// 计算横坐标int x = (int) (r * Math.cos(Math.toRadians(angle)));// 计算纵坐标int y = (int) (r * Math.sin(Math.toRadians(angle)));// 设置颜色渐变,这里根据角度调整 RGB 值g2d.setColor(new Color((int) (255 * (angle / 360)), (int) (150 * (angle / 360)), (int) (200 * (angle / 360))));// 在指定位置画一个小圆点作为爱心的一部分g2d.fill(new Ellipse2D.Double(x + getWidth() / 2 - 5, y + getHeight() / 2 - 5, 10, 10));}}
}public class HeartGradientApp {public static void main(String[] args) {JFrame frame = new JFrame("Heart with Gradient");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(new HeartWithGradient());frame.setSize(500, 500);frame.setVisible(true);}
}
运行思路
  • 定义一个自定义面板类 HeartWithGradient,继承自 JPanel
  •  HeartWithGradient 类的 paintComponent 方法中,获取 Graphics2D 对象 g2d
    • 使用一个循环遍历从 0 到 360 的角度。
    • 对于每个角度,根据心形曲线公式 double r = 150 - 150 * Math.sin(Math.toRadians(angle)) 计算出半径 r
    • 然后通过 int x = (int) (r * Math.cos(Math.toRadians(angle)));  int y = (int) (r * Math.sin(Math.toRadians(angle))); 计算出该角度对应的坐标 (x, y)
    • 根据当前角度计算颜色的 RGB 值,创建一个新的 Color 对象 g2d.setColor(new Color((int) (255 * (angle / 360)), (int) (150 * (angle / 360)), (int) (200 * (angle / 360))));
    • 在指定位置画一个半径为 5 的椭圆 g2d.fill(new Ellipse2D.Double(x + getWidth() / 2 - 5, y + getHeight() / 2 - 5, 10, 10))
  •  main 方法中,创建一个 JFrame 对象,设置标题、关闭行为、大小等属性。
  •  HeartWithGradient 实例添加到 JFrame 中,并使 JFrame 可见。

Python其它绘画方式

第一种

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"  # 心的颜色#ff7171def 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_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: 新坐标"""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(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 - dydef 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 = 1000self.generate_frame = generate_framefor frame in range(generate_frame):self.calc(frame)def build(self, number):# 爱心for _ in range(number):t = random.uniform(0, 2 * pi)  # 随机不到的地方造成爱心有缺口x, y = heart_function(t)self._points.add((x, y))# 爱心内扩散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))@staticmethoddef 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 - dydef 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_pointsdef 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)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()  # 一个Tkroot.title('宝贝爱你哟')  # 将标题设置为'tkinter'canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)canvas.pack()heart = Heart()  # 心draw(root, canvas, heart)  # 开始画root.mainloop()
代码逐行注释
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"  # 心的颜色#ff7171def 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_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: 新坐标"""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(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 - dydef 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 = 1000self.generate_frame = generate_framefor frame in range(generate_frame):self.calc(frame)def build(self, number):# 爱心for _ in range(number):t = random.uniform(0, 2 * pi)  # 随机不到的地方造成爱心有缺口x, y = heart_function(t)self._points.add((x, y))# 爱心内扩散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))@staticmethoddef 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 - dydef 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, 

相关文章:

Python实例:爱心代码

前言 在编程的奇妙世界里,代码不仅仅是冰冷的指令集合,它还可以成为表达情感、传递温暖的独特方式。今天,我们将一同探索用 Python 语言绘制爱心的神奇之旅。 爱心,这个象征着爱与温暖的符号,一直以来都在人类的情感世界中占据着特殊的地位。而通过 Python 的强大功能,…...

图解大模型训练系列:序列并行3,Ring Attention

在序列并行系列中&#xff0c;我们将详细介绍下面四种常用的框架/方法&#xff1a; Megatron Sequence Parallelism&#xff1a;本质是想通过降低单卡激活值大小的方式&#xff0c;尽可能多保存激活值&#xff0c;少做重计算&#xff0c;以此提升整体训练速度&#xff0c;一般…...

pyspark基础准备

1.前言介绍 学习目标&#xff1a;了解什么是Speak、PySpark&#xff0c;了解为什么学习PySpark&#xff0c;了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码&#xff0c;既可以在电脑上简单运行&#xff0c;进行数据分析处理&#xff0c;又可以把代码无缝…...

Netty报错

问题&#xff1a;因客户反馈Netty版本低&#xff0c;影响性能&#xff0c;建议提升。于是&#xff0c;我将所有Netty版本从4.1.82.Final到4.1.114.Final后&#xff0c;报下面的错误&#xff0c;java.lang.NoClassDefFoundError: io/netty/util/Recycler$EnhancedHandle&#xf…...

Kafka 之顺序消息

前言&#xff1a; 在分布式消息系统中&#xff0c;消息的顺序性是一个重要的问题&#xff0c;也是一个常见的业务场景&#xff0c;那 Kafka 作为一个高性能的分布式消息中间件&#xff0c;又是如何实现顺序消息的呢&#xff1f;本篇我们将对 Kafka 的顺序消息展开讨论。 Kafk…...

Kafka 之批量消息发送消费

前言&#xff1a; 前面我们分享了 Kafka 的一些基础知识&#xff0c;以及 Spring Boot 集成 Kafka 完成消息发送消费&#xff0c;本篇我们来分享一下 Kafka 的批量消息发送消费。 Kafka 系列文章传送门 Kafka 简介及核心概念讲解 Spring Boot 整合 Kafka 详解 Kafka Kafka…...

【大数据学习 | kafka】kafka的偏移量管理

1. 偏移量的概念 消费者在消费数据的时候需要将消费的记录存储到一个位置&#xff0c;防止因为消费者程序宕机而引起断点消费数据丢失问题&#xff0c;下一次可以按照相应的位置从kafka中找寻数据&#xff0c;这个消费位置记录称之为偏移量offset。 kafka0.9以前版本将偏移量信…...

实景三维赋能森林防灭火指挥调度智慧化

森林防灭火工作是保护森林资源和生态环境的重要任务。随着信息技术的发展&#xff0c;实景三维技术在森林防灭火指挥调度中的应用日益广泛&#xff0c;为提升防灭火工作的效率和效果提供了有力支持。 一、森林防灭火面临的挑战 森林火灾具有突发性强、破坏性大、蔓延速度快、…...

【C++课程学习】:string的模拟实现

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.string的主体框架&#xff1a; 二.string的分析&#xff1a; &#x1f354;构造函数和析构函数&a…...

Linux(VMware + CentOS )设置固定ip

需求&#xff1a;设置ip为 192.168.88.130 先关闭虚拟机 启动虚拟机 查看当前自动获取的ip 使用 FinalShell 通过 ssh 服务远程登录系统&#xff0c;更换到 root 用户 修改ip配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 重启网卡 systemctl restart network …...

安卓 android studio各版本下载地址(官方)

https://developer.android.google.cn/studio/archive 别用中文&#xff0c;右上角的语言切换成英文...

如何在一个 Docker 容器中运行多个进程 ?

在容器化的世界里&#xff0c;Docker 彻底改变了开发人员构建、发布和运行应用程序的方式。Docker 容器封装了运行应用程序所需的所有依赖项&#xff0c;使其易于跨不同环境一致地部署。然而&#xff0c;在单个 Docker 容器中管理多个进程可能具有挑战性&#xff0c;这就是 Sup…...

poetry 配置多个cuda环境心得

操作系统&#xff1a;ubuntu22.04 LTS python版本&#xff1a;3.12.7 最近学习了用poetry配置python虚拟环境&#xff0c;当为不同的项目配置cuda时&#xff0c;会遇到不同的项目使用的cuda版本不一致的情况。 像torch 这样的库&#xff0c;它们会对cuda-toolkit有依赖&…...

网络编程入门

目录 1.网络编程入门 1.1 网络编程概述【理解】 1.2 网络编程三要素【理解】 1.3 IP地址【理解】 1.4InetAddress【应用】 1.5端口和协议【理解】 2.UDP通信程序 2.1 UDP发送数据【应用】 2.2UDP接收数据【应用】 2.3UDP通信程序练习【应用】 3.TCP通信程序 3.1TCP…...

Linux-socket详解

Linux-socket详解_socket linux-CSDN博客...

SQL Server 2022安装要求(硬件、软件、操作系统等)

SQL Server 2022安装要求 1、硬件要求2、软件要求3、操作系统支持4、Server Core 支持5、跨语言支持6、磁盘空间要求 1、硬件要求 以下内存和处理器要求适用于所有版本的 SQL Server&#xff1a; 组件要求存储SQL Server 要求最少 6 GB 的可用硬盘驱动器空间。 磁盘空间要求随…...

“众店模式”:创新驱动下的商业新生态

在数字化浪潮的推动下&#xff0c;传统商业模式正经历着前所未有的转型。“众店模式”作为一种新兴的商业模式&#xff0c;以其独特的商业逻辑和创新的玩法&#xff0c;为商家和消费者构建了一个共赢的商业新生态。 一、“众店模式”的核心构成 “众店模式”的成功&#xff0…...

54. 螺旋矩阵

https://leetcode.cn/problems/spiral-matrix/description/?envTypestudy-plan-v2&envIdtop-100-liked观察示例中的输出轨迹我们可以想到如下设计&#xff1a; 1.在朝某一方向行进到头后的改变方向是确定的&#xff0c;左->下&#xff0c;下->右&#xff0c;右->…...

剧本杀小程序,市场发展下的新机遇

剧本杀作为休闲娱乐的一种游戏方式&#xff0c;在短时间内进入了大众视野中&#xff0c;受到了广泛关注。近几年&#xff0c;剧本杀行业面临着创新挑战&#xff0c;商家需求寻求新的发展机遇&#xff0c;在市场饱和度下降的趋势下&#xff0c;获得市场份额。 随着科技的不断进…...

【系统架构设计师】论文:论基于 ABSD 的软件开发

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 2022年5月,我就职的公司承接了xx的智慧党建工作,建设“党建红云” 系统,为xx公司的党组织提供觉务管理、服务功能,促进党员学习和党组织交流。我在该项目中承担架构设计师的职责,主导需求分析和…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...