所有代码均来源于网络,若侵犯到你的利益请联系删除
(资料图片仅供参考)
html +javascript
浏览地址 myy.alleniverrui.top/2
代码地址 https://gitee.com/alleniverrui/love
c++
所需环境 easyx
#include<graphics.h>
#include <conio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
//爱心点结构体
struct Point {
double x, y; //坐标
COLORREF color; //颜色
};
//颜色数组
COLORREF colors[7] = { RGB(255,32,83),RGB(252,222,250) ,RGB(255,0,0) ,RGB(255,0,0) ,RGB(255,2,2) ,RGB(255,0,8) ,RGB(255,5,5) };
//COLORREF colors[7] = { RGB(55,132,83),RGB(252,222,250) ,RGB(25,120,130) ,RGB(25,230,40) ,RGB(25,24,112) ,RGB(255,230,128) ,RGB(25,5,215) };
const int xScreen = 1200; //屏幕宽度
const int yScreen = 800; //屏幕高度
const double PI = 3.1426535159; //圆周率
const double e = 2.71828; //自然数e
const double averag_distance = 0.162; //弧度以0.01增长时,原始参数方程每个点的平均距离
const int quantity = 506; //一个完整爱心所需点的数量
const int circles = 210; //组成爱心主体的爱心个数(每个爱心会乘以不同系数)
const int frames = 20; //爱心扩张一次的帧数
Point origin_points[quantity]; //创建一个保存原始爱心数据的数组
Point points[circles * quantity]; //创建一个保存所有爱心数据的数组
IMAGE images[frames]; //创建图片数组
//坐标转换函数
double screen_x(double x)
{
x += xScreen / 2;
return x;
}
//坐标转换函数
double screen_y(double y)
{
y = -y + yScreen / 2;
return y;
}
//创建x1-x2的随机数的函数
int creat_random(int x1, int x2)
{
if (x2 > x1)
return rand() % (x2 - x1 + 1) + x1;
else
return 0;
}
//创建爱心扩张一次的全部数据,并绘制成20张图片保存
// 1 用参数方程计算出一个爱心的所有坐标并保存在 origin_points 中
// 2 重复对 origin_points 的所有坐标乘上不同的系数获得一个完整的爱心坐标数据,并保存在 points 中
// 3 通过一些数学逻辑计算 points 中所有点扩张后的坐标并绘制,并覆盖掉原来的数据(循环20次)
// 4 计算圆的外层那些闪动的点,不保存这些点的数据(循环20次)
void creat_data()
{
int index = 0;
//保存相邻的坐标信息以便用于计算距离
double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
for (double radian = 0.1; radian <= 2 * PI; radian += 0.005)
{
//爱心的参数方程
x2 = 16 * pow(sin(radian), 3);
y2 = 13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian);
//计算两点之间的距离 开根号((x1-x2)平方 + (y1-y1)平方)
double distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
//只有当两点之间的距离大于平均距离才保存这个点,否则跳过这个点
if (distance > averag_distance)
{
//x1和y1保留当前数据
//x2和y2将在下一次迭代获得下一个点的坐标
x1 = x2, y1 = y2;
origin_points[index].x = x2;
origin_points[index++].y = y2;
}
}
index = 0;
for (double size = 0.1; size <= 20; size += 0.1)
{
//用sigmoid函数计算当前系数的成功概率
//用个例子说明一下,假设有100个点成功概率为 90%,那么就可能会有90个点经过筛选保留下来
//假设有100个点成功概率为 20%,那么就可能会有20个点经过筛选保留下来
double success_p = 1 / (1 + pow(e, 8 - size / 2));
//遍历所有原始数据
for (int i = 0; i < quantity; ++i)
{
//用概率进行筛选
if (success_p > creat_random(0, 100) / 100.0)
{
//从颜色数组随机获得一个颜色
points[index].color = colors[creat_random(0, 6)];
//对原始数据乘上系数保存在points中
points[index].x = size * origin_points[i].x + creat_random(-4, 4);
points[index++].y = size * origin_points[i].y + creat_random(-4, 4);
}
}
}
//index当前值就是points中保存了结构体的数量
int points_size = index;
for (int frame = 0; frame < frames; ++frame)
{
//初始化每张图片宽xScreen,高yScreen
images[frame] = IMAGE(xScreen, yScreen);
//把第frame张图像设为当前工作图片
SetWorkingImage(&images[frame]);
//计算爱心跳动的坐标
for (index = 0; index < points_size; ++index)
{
double x = points[index].x, y = points[index].y; //把当前值赋值给x和y
double distance = sqrt(pow(x, 2) + pow(y, 2));//计算当前点与原点的距离
double diatance_increase = -0.0009 * distance * distance + 0.35714 * distance + 5;//把当前距离代入方程获得该点的增长距离
//根据增长距离计算x轴方向的增长距离 x_increase = diatance_increase * cos(当前角度)
//cos(当前角度)= x / distance
double x_increase = diatance_increase * x / distance / frames;
//根据增长距离计算x轴方向的增长距离 x_increase = diatance_increase * sin(当前角度)
//sin(当前角度)= y / distance
double y_increase = diatance_increase * y / distance / frames;
//因为以上计算得到的是一整个过程的增长距离,而整个过程持续20帧,因此要除20
//用新的数据覆盖原来的数据
points[index].x += x_increase;
points[index].y += y_increase;
//提取当前点的颜色设置为绘画颜色
setfillcolor(points[index].color);
//注意,因为以上所有坐标是基于数学坐标的
//因此绘制到屏幕是就要转换为屏幕坐标
solidcircle(screen_x(points[index].x), screen_y(points[index].y), 1);
}
//产生外围闪动的点
for (double size = 17; size < 23; size += 0.3)
{
for (index = 0; index < quantity; ++index)
{
//当系数大于等于20,通过概率为百分之四十,当系数小于20,通过概率为百分之五
//20作为关键值是因为爱心主体的最大系数就是20
if ((creat_random(0, 100) / 100.0 > 0.6 && size >= 20) || (size < 20 && creat_random(0, 100) / 100.0 > 0.95))
{
double x, y;
if (size >= 20)
{
//用frame的平方的正负值作为上下限并加减15产生随机数
//用frame的平方的好处是frame越大,外围闪动的点运动范围越大
x = origin_points[index].x * size + creat_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
y = origin_points[index].y * size + creat_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
}
else
{
//对于系数小于20的处理与爱心点一样
x = origin_points[index].x * size + creat_random(-5, 5);
y = origin_points[index].y * size + creat_random(-5, 5);
}
//随机获取颜色并设置为当前绘图颜色
setfillcolor(colors[creat_random(0, 6)]);
//把数学坐标转换为屏幕坐标再进行绘制
solidcircle(screen_x(x), screen_y(y), 1);
//需要注意的是,我并没有保存这些点,因为这些点不需要前一帧的坐标数据
//只需要当前系数就可绘制出来,因此没 必要保存
}
}
}
}
}
int main()
{
initgraph(xScreen, yScreen); //创建屏幕
BeginBatchDraw(); //开始批量绘图
srand(time(0)); //初始化随机种子
creat_data(); //调用函数产生20张图片
SetWorkingImage(); //调用函数把工作图像恢复为窗口,没有添加参数默认为窗口
//因为接下是用窗口播放图片,因此要把绘图效果设置为窗口
bool extend = true, shrink = false;
for (int frame = 0; !_kbhit();) //退出条件为检测到按键信息
{
putimage(0, 0, &images[frame]); //播放第frame张图片
FlushBatchDraw();//刷新批量绘图
Sleep(20);//延时20毫秒
cleardevice();//清除屏幕,用来播放下一帧图片
//注意 creat data 产生的只是爱心扩张的20张图片,并没有产生爱心收缩的图片
//但是把扩张的图片倒着播放就产生的收缩的效果
//所以下面这个 if else 语句就是决定图片是正常播放还是倒着播放
if (extend) //扩张时, ++frame,正常播放
frame == 19 ? (shrink = true, extend = false) : ++frame;
else //收缩时, --frame,倒着播放
frame == 0 ? (shrink = false, extend = true) : --frame;
}
EndBatchDraw(); //关闭批量绘图
closegraph();//关闭绘图窗口
return 0;//结束程序
}
python -1
import random
from math import sin, cos, pi, log
from tkinter import *
CANVAS_WIDTH = 640 # 画布的宽
CANVAS_HEIGHT = 480 # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2 # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 # 画布中心的Y轴坐标
IMAGE_ENLARGE = 11 # 放大比例
HEART_COLOR = "#ff6781" # 心的颜色,这个是粉红
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 * (2 * 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 _ 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))
@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)
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() # 一个Tk
canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
canvas.pack()
heart = Heart() # 心
draw(root, canvas, heart) # 开始画画~
root.mainloop()
python -2
所需环境 open cv
from tkinter import *
from matplotlib import pyplot as plt
from PIL import Image
import random
import math
import numpy as np
import os
import colorsys
import CV2
from scipy.ndimage.filters import gaussian_filter
from math import sin, cos, pi, log
canvas_width = 600
canvas_height = 600
world_width = 0.05
world_heigth = 0.05
# 中间心的参数
points = None
fixed_point_size = 20000
fixed_scale_range = (4, 4.3)
min_scale = np.array([1.0, 1.0, 1.0]) * 0.9
max_scale = np.array([1.0, 1.0, 1.0]) * 0.9
min_heart_scale = -15
max_heart_scale = 16
# 外围随机心参数
random_point_szie = 7000
random_scale_range = (3.5, 3.9)
random_point_maxvar = 0.2
# 心算法参数
mid_point_ignore = 0.95
# 相机参数
camera_close_plane = 0.1
camera_position = np.array([0.0, -2.0, 0.0])
# 点的颜色
hue = 0.92
color_strength = 255
# 常用向量缓存
zero_scale = np.array([0.0, 0.0, 0.0])
unit_scale = np.array([1.0, 1.0, 1.0])
color_white = np.array([255, 255, 255])
axis_y = np.array([0.0, 1.0, 0.0])
# 渲染缓存
render_buffer = np.empty((canvas_width, canvas_height, 3), dtype=int)
strength_buffer = np.empty((canvas_width, canvas_height), dtype=float)
# 随机点文件缓存
points_file = "temp.txt"
# 渲染结果
total_frames = 30
output_dir = "./output"
# 格式
image_fmt = "jpg"
def color(value):
digit = list(map(str, range(10))) + list("ABCDEF")
string = '#'
for i in value:
a1 = i // 16
a2 = i % 16
string += digit[a1] + digit[a2]
return string
def heart_func(x, y, z, scale):
bscale = scale
bscale_half = bscale / 2
x = x * bscale - bscale_half
y = y * bscale - bscale_half
z = z * bscale - bscale_half
return (x ** 2 + 9 / 4 * (y ** 2) + z ** 2 - 1) ** 3 - (x ** 2) * (z ** 3) - 9 / 200 * (y ** 2) * (z ** 3)
def lerp_vector(a, b, ratio):
result = a.copy()
for i in range(3):
result[i] = a[i] + (b[i] - a[i]) * ratio
return result
def lerp_int(a, b, ratio):
return (int)(a + (b - a) * ratio)
def lerp_float(a, b, ratio):
return (a + (b - a) * ratio)
def distance(point):
return (point[0] ** 2 + point[1] ** 2 + point[2] ** 2) ** 0.5
def dot(a, b):
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
def inside_rand(tense):
x = random.random()
y = -tense * math.log(x)
return y
# 生成中间心
def genPoints(pointCount, heartScales):
result = np.empty((pointCount, 3))
index = 0
while index < pointCount:
# 生成随机点
x = random.random()
y = random.random()
z = random.random()
# 扣掉心中间的点
mheartValue = heart_func(x, 0.5, z, heartScales[1])
mid_ignore = random.random()
if mheartValue < 0 and mid_ignore < mid_point_ignore:
continue
heartValue = heart_func(x, y, z, heartScales[0])
z_shrink = 0.01
sz = z - z_shrink
sheartValue = heart_func(x, y, sz, heartScales[1])
# 保留在心边上的点
if heartValue < 0 and sheartValue > 0:
result[index] = [x - 0.5, y - 0.5, z - 0.5]
# 向内扩散
len = 0.7
result[index] = result[index] * (1 - len * inside_rand(0.2))
# 重新赋予深度
newY = random.random() - 0.5
rheartValue = heart_func(result[index][0] + 0.5, newY + 0.5, result[index][2] + 0.5, heartScales[0])
if rheartValue > 0:
continue
result[index][1] = newY
# 删掉肚脐眼
dist = distance(result[index])
if dist < 0.12:
continue
index = index + 1
if index % 100 == 0:
print("{ind} generated {per}%".format(ind=index, per=((index / pointCount) * 100)))
return result
# 生成随机心
def genRandPoints(pointCount, heartScales, maxVar, ratio):
result = np.empty((pointCount, 3))
index = 0
while index < pointCount:
x = random.random()
y = random.random()
z = random.random()
mheartValue = heart_func(x, 0.5, z, heartScales[1])
mid_ignore = random.random()
if mheartValue < 0 and mid_ignore < mid_point_ignore:
continue
heartValue = heart_func(x, y, z, heartScales[0])
sheartValue = heart_func(x, y, z, heartScales[1])
if heartValue < 0 and sheartValue > 0:
result[index] = [x - 0.5, y - 0.5, z - 0.5]
dist = distance(result[index])
if dist < 0.12:
continue
len = 0.7
result[index] = result[index] * (1 - len * inside_rand(0.2))
index = index + 1
for i in range(pointCount):
var = maxVar * ratio
randScale = 1 + random.normalvariate(0, var)
result[i] = result[i] * randScale
return result
# 世界坐标到相机本地坐标
def world_2_cameraLocalSapce(world_point):
new_point = world_point.copy()
new_point[1] = new_point[1] + camera_position[1]
return new_point
# 相机本地坐标到相机空间坐标
def cameraLocal_2_cameraSpace(cameraLocalPoint):
depth = distance(cameraLocalPoint)
cx = cameraLocalPoint[0] * (camera_close_plane / cameraLocalPoint[1])
cz = -cameraLocalPoint[2] * (cx / cameraLocalPoint[0])
cameraLocalPoint[0] = cx
cameraLocalPoint[1] = cz
return cameraLocalPoint, depth
# 相机空间坐标到屏幕坐标
def camerSpace_2_screenSpace(cameraSpace):
x = cameraSpace[0]
y = cameraSpace[1]
# convert to view space
centerx = canvas_width / 2
centery = canvas_height / 2
ratiox = canvas_width / world_width
ratioy = canvas_height / world_heigth
viewx = centerx + x * ratiox
viewy = canvas_height - (centery + y * ratioy)
cameraSpace[0] = viewx
cameraSpace[1] = viewy
return cameraSpace.astype(int)
# 绘制世界坐标下的点
def draw_point(worldPoint):
cameraLocal = world_2_cameraLocalSapce(worldPoint)
cameraSpsace, depth = cameraLocal_2_cameraSpace(cameraLocal)
screeSpace = camerSpace_2_screenSpace(cameraSpsace)
draw_size = int(random.random() * 3 + 1)
draw_on_buffer(screeSpace, depth, draw_size)
# 绘制到缓存上
def draw_on_buffer(screenPos, depth, draw_size):
if draw_size == 0:
return
elif draw_size == 1:
draw_point_on_buffer(screenPos[0], screenPos[1], color_strength, depth)
elif draw_size == 2:
draw_point_on_buffer(screenPos[0], screenPos[1], color_strength, depth)
draw_point_on_buffer(screenPos[0] + 1, screenPos[1] + 1, color_strength, depth)
elif draw_size == 3:
draw_point_on_buffer(screenPos[0], screenPos[1], color_strength, depth)
draw_point_on_buffer(screenPos[0] + 1, screenPos[1] + 1, color_strength, depth)
draw_point_on_buffer(screenPos[0] + 1, screenPos[1], color_strength, depth)
elif draw_size == 4:
draw_point_on_buffer(screenPos[0], screenPos[1], color_strength, depth)
draw_point_on_buffer(screenPos[0] + 1, screenPos[1], color_strength, depth)
draw_point_on_buffer(screenPos[0], screenPos[1] + 1, color_strength, depth)
draw_point_on_buffer(screenPos[0] + 1, screenPos[1] + 1, color_strength, depth)
# 根据色调和颜色强度获取颜色
def get_color(strength):
result = None
if strength >= 1:
result = colorsys.hsv_to_rgb(hue, 2 - strength, 1)
else:
result = colorsys.hsv_to_rgb(hue, 1, strength)
r = min(result[0] * 256, 255)
g = min(result[1] * 256, 255)
b = min(result[2] * 256, 255)
return np.array((r, g, b), dtype=int)
# 可以根据深度做一些好玩的
def draw_point_on_buffer(x, y, color, depth):
if x < 0 or x >= canvas_width or y < 0 or y >= canvas_height:
return
# 混合
strength = float(color) / 255
strength_buffer[x, y] = strength_buffer[x, y] + strength
# 绘制缓存
def draw_buffer_on_canvas(output=None):
render_buffer.fill(0)
for i in range(render_buffer.shape[0]):
for j in range(render_buffer.shape[1]):
render_buffer[i, j] = get_color(strength_buffer[i, j])
im = Image.fromarray(np.uint8(render_buffer))
im = im.rotate(-90)
if output is None:
plt.imshow(im)
plt.show()
else:
im.save(output)
def paint_heart(ratio, randratio, outputFile=None):
global strength_buffer
global render_buffer
global points
# 清空缓存
strength_buffer.fill(0)
for i in range(fixed_point_size):
# 缩放
point = points[i] * lerp_vector(min_scale, max_scale, ratio)
# 球型场
dist = distance(point)
radius = 0.4
sphere_scale = radius / dist
point = point * lerp_float(0.9, sphere_scale, ratio * 0.3)
# 绘制
draw_point(point)
# 生成一组随机点
randPoints = genRandPoints(random_point_szie, random_scale_range, random_point_maxvar, randratio)
for i in range(random_point_szie):
# 绘制
draw_point(randPoints[i])
# 高斯模糊
for i in range(1):
strength_buffer = gaussian_filter(strength_buffer, sigma=0.8)
# 绘制缓存
draw_buffer_on_canvas(outputFile)
def show_images():
img = None
for i in range(total_frames):
save_name = "{name}.{fmt}".format(name=i, fmt=image_fmt)
save_path = os.path.join(output_dir, save_name)
img = CV2.imread(save_path, CV2.IMREAD_ANYCOLOR)
CV2.imshow("Img", img)
CV2.waitKey(25)
def gen_images():
global points
if not os.path.isdir(output_dir):
os.mkdir(output_dir)
# 尝试加载或生成中间心
if not os.path.exists(points_file):
print("未发现缓存点,重新生成中")
points = genPoints(fixed_point_size, fixed_scale_range)
np.savetxt(points_file, points)
else:
print("发现缓存文件,跳过生成")
points = np.loadtxt(points_file)
for i in range(total_frames):
print("正在处理图片... ", i)
frame_ratio = float(i) / (total_frames - 1)
frame_ratio = frame_ratio ** 2
ratio = math.sin(frame_ratio * math.pi) * 0.743144
randratio = math.sin(frame_ratio * math.pi * 2 + total_frames / 2)
save_name = "{name}.{fmt}".format(name=i, fmt=image_fmt)
save_path = os.path.join(output_dir, save_name)
paint_heart(ratio, randratio, save_path)
print("图片已保存至", save_path)
if __name__ == "__main__":
gen_images()
while True:
show_images()
关键词: DEPTH FORCE FRAME SIGMA INDEX SELF POINT CANVAS COLORS SIZE EXTEND QUANTITY RETURN DRAW RAND NONE TRUE WIDTH SLEEP COLOR 原始数据 IMAGE MAIN 高斯模糊 HEART NAME STRING FALSE LIST ROOT circles
-
【报资讯】爱心代码合集
所有代码均来源于网络,若侵犯到你的利益请联系删除html+javascript浏览地址myy alleniverrui top 2代码地址https: gitee com alleniverrui l
-
天天热点评!文艺论坛丨姜松荣、蔡婷:当代书法批评生态重建探究
当代书法批评生态重建探究文 姜松荣蔡婷摘 要:书法批评是伴随书法创作而来且古已有之的一种艺术活动,经过漫长的历史演绎,
-
兰州到敦煌多少公里飞机 兰州到敦煌多少公里
今天来聊聊关于兰州到敦煌多少公里飞机,兰州到敦煌多少公里的文章,现在就为大家来简单介绍下兰州到敦煌多少公里飞机,兰州到敦
-
山西陕西四川等地有大暴雨是怎么回事_山西陕西四川等地有大暴雨是什么情况 环球最资讯
立秋之后,由于“秋老虎”发威,很多地区依旧是高温天气,想必不少小伙伴都想来一场暴雨凉快一下,那么山西陕西四川等地的小伙伴
-
巨人网络董秘回复:《Super Sus》已经在印度开启测试
巨人网络(002558)01月28日在投资者关系平台上答复了投资者关心的问题。
-
上海华侨护照更换所需材料一览
现暂住在本市的华侨换发材料材料名称来源渠道来源渠道说明材料类型纸质材料份数材料形式材料必要性在出入境部门的社会服务照相点采集出入境证
-
【天天播资讯】兔年春节假期,河南旅游进账175.21亿元
兔年春节假期,河南旅游进账175 21亿元
-
Cowen & Co.:维持Comcast(CMCSA.US)优于大市评级
Cowen&Co :维持Comcast(CMCSA US)优于大市评级,目标价由49 00美元调整至46 00美元。
-
注意避开拥堵路段 河南高速交警春节假期返程预警 当前消息
注意避开拥堵路段河南高速交警春节假期返程预警,
-
啜饮品茗,燕居焚香
啜饮品茗,燕居焚香
-
全球热资讯!FUTURE DATA(08229)拟折让约18.52%配售最多合共8000万股 净筹约1720万港元
FUTUREDATA(08229)公布,于2023年1月26日,该公司拟透过配售
-
春节返程高峰来临,北京各大车站发布出行提示
出行服务方面,北京市重点站区管委会针对返程阶段客流高峰,将协调公交加密、地铁延时、出租保点、开辟网约车专用落客区、开行免费摆渡车等措
-
罗梅罗:若我能决定梅西未来,我会把他绑到美加墨 环球时讯
据阿根廷媒体Tyc援引ESPN报道,阿根廷中卫罗梅罗近日接受了ESPN的音频采访,他表示如果他能决定梅西的未来,他会将梅西绑到美加墨世界杯。罗梅
-
明日正月初六,讲究:吃3样、摆3果、做3事,送穷纳福,六六大顺
明日正月初六,讲究:吃3样、摆3果、做3事,送穷纳福,六六大顺
-
微速讯:惠州这条线路入选全国乡村旅游精品线路!
惠州这条线路入选全国乡村旅游精品线路!
-
世界时讯:羊角锤_关于羊角锤的基本详情介绍
1、羊角锤(clawhammer)是锤子的一种,一般羊角锤的一头是圆的,一头扁平向下弯曲并且开V口,目的是为了起钉子。
-
世界新消息丨大营门街领导开展节前安全检查及走访慰问工作
1月20日,在新春佳节即将到来之际,大营门街党政主要领导率领分管领导、相关科室、社区,深入富力中心、三义庄菜市场开展节前安全检查,并走访
-
司法部发布仲裁工作指导案例
新华社北京1月24日电(白阳、赵晴)近日,司法部发布3起仲裁工作指导案例,涉及货物买卖、房屋租赁和知识产权等与人民群众生产生活密切相关的
-
怎么找自己电脑的ip_怎么找自己电脑的ip地址
1、怎么查看自己电脑的IP地址?。本文到此分享完毕,希望对大家有所帮助。
-
环球观察:讳怎么读_关于讳怎么读的基本详情介绍
1、“讳”,现代汉语规范一级字(常用字),普通话读音为huì,最早见于金文时代,在六书中属于形声字。2、“讳”的基本含义