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()">

Python在线运行

版本:

编辑于 2022-11-21 23:52 累计访问:2127
点击了解高性能代码运行API
运行结果
代码简介
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
菜品价格和库存 发布于:2026-10-06 14:34 学习代码阿巴巴 发布于:2026-10-05 11:21 十七的生日 发布于:2026-10-02 23:04 代码人工AI。 发布于:2026-09-26 16:51 python必修课内容 发布于:2026-09-22 20:58 一元二次方程 发布于:2026-09-19 21:05 Correct coding 发布于:2026-09-16 10:59 山东标准地址数据生成 发布于:2026-09-08 09:14 猜数字 哦耶~ 发布于:2026-09-07 00:32 Correct something 发布于:2026-09-02 19:24 我的第一个Python代码 发布于:2026-09-01 09:13 Trace 日期DOM代码计算 发布于:2026-08-28 16:47 地址库生成测试数据 发布于:2026-08-26 10:37 Extreme Point Method(Mixing Stacking) 发布于:2026-08-26 09:12 塔羅牌占卜 发布于:2026-08-18 19:38 自己的一个测试 发布于:2026-08-12 10:08 Kx Ky_v1_xxxting #20260803 发布于:2026-08-03 10:36 时深预测系统_v6_20260728_xxxting #埋深+ui 发布于:2026-07-28 10:10 导出网页内容 发布于:2026-07-27 20:30 时深预测系统_v5_20260727_xxxting #已钻井部分层段有声波 发布于:2026-07-27 17:32 时深预测系统_20260727_xxxting#增加UI界面 发布于:2026-07-27 17:19 时深预测系统_v4_20260716_xxxting#增加指定单井预测模式 发布于:2026-07-27 17:27 时深预测系统_v3_20260715_xxxting #多口已钻井优选 发布于:2026-07-16 14:59 时深预测系统_v2_20260713_xxxting#新增起始层位自动读取的功能 发布于:2026-07-13 11:46 原神寻渊探宝行动整理背包程序草稿 发布于:2026-07-11 11:52 时深预测系统_v1_20260710_xxxting 发布于:2026-07-13 11:46 二级出库数据填报 发布于:2026-07-08 10:26 羽毛球算球费 发布于:2026-07-04 14:28 胡哥用的算法 发布于:2026-07-01 22:08 显示现在的时间python 发布于:2026-06-27 21:39 一个试验品。 发布于:2026-06-26 15:59 数据库连接 发布于:2026-06-24 19:02 你好,世界! 发布于:2026-06-24 17:05 数据库连接成功 发布于:2026-06-24 19:55 实验报告代码 发布于:2026-06-23 11:05 乐白LM3机械臂运动规划客户端节点 发布于:2026-06-18 01:05 码上放心加密 发布于:2026-06-06 10:51 joytoserialport 授权码生成 发布于:2026-06-05 21:30 --- **> 计算杨氏模量** 发布于:2026-05-31 21:05 返工制费插件 发布于:2026-05-28 10:34 逻辑语句实例 发布于:2026-05-11 16:16 采购入库单下推应付单 ——单据转换 发布于:2026-05-08 13:26 本代码展示了python中的 加 减 乘 除,等 发布于:2026-05-07 21:50 A robot U can talk to 发布于:2026-04-29 23:12 就是简单的保存一下文件而已 发布于:2026-04-27 14:12 刚刚到好多好多个 发布于:2026-04-27 11:42 公交站信息 发布于:2026-04-26 21:19 一个数,创建列表 发布于:2026-04-26 16:31 函数嵌套调用与工程化核心思想 发布于:2026-04-23 18:26 函数的返回值体系 发布于:2026-04-23 18:26 [更多]

作者 旺仔牛奶(qwqawa)
编辑于:2022-11-21 23:52 VBsKp

爱心代码awa

提示:本站严禁涉政、违法等无关技术的内容
发送
学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场