You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现五边形收敛效果的平滑放大动画GIF?

解决五边形收敛动画开发的三个核心问题

1. Decimal类型转绘图可用格式

绘图库(如matplotlib、pygame)仅支持float或numpy数值类型,直接转换Decimal对象即可,注意迭代后期的精度控制:

  • 常规转换用float(),若Decimal精度超过float有效范围(约15-17位),会自动转为科学计数,不影响绘图显示:
from decimal import Decimal
vertices_float = [(float(x), float(y)) for x, y in decimal_vertices]
  • 高迭代场景用numpy.longdouble保留更多精度(约18-19位有效数字):
import numpy as np
vertices_ld = [(np.longdouble(x), np.longdouble(y)) for x, y in decimal_vertices]

2. 生成15+可循环的区分色

  • 直接复用matplotlib内置高区分度配色,比如tab20(含20种颜色):
import matplotlib.cm as cm
color_cycle = cm.tab20.colors
# 第n个多边形取色:color_cycle[n % len(color_cycle)]
  • 自定义HSV渐变色系,保证颜色区分度:
import colorsys

def generate_color_cycle(n_colors):
    colors = []
    for i in range(n_colors):
        rgb = colorsys.hsv_to_rgb(i/n_colors, 0.7, 0.9)
        colors.append(rgb)
    return colors

color_cycle = generate_color_cycle(15)

3. 实现平滑放大动画(无需手动录制)

用matplotlib的animation模块自动生成GIF/视频,核心是逐帧更新绘图范围并绘制多边形:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
ax.set_aspect('equal')  # 保持图形比例不变
polygons = []
# all_vertices为所有迭代次数的顶点列表,all_vertices[0]对应第一个五边形

def init():
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    return []

def update(frame):
    # 清除上一帧多边形(可选,保留则展示所有迭代过程)
    for poly in polygons:
        poly.remove()
    polygons.clear()

    # 绘制前frame+1个五边形
    for i in range(frame+1):
        verts = [(float(x), float(y)) for x, y in all_vertices[i]]
        poly = ax.fill(*zip(*verts), color=color_cycle[i%len(color_cycle)], alpha=0.7)
        polygons.extend(poly)

    # 计算中心并放大,zoom_factor可调整放大速率
    center_x = sum(v[0] for v in verts)/5
    center_y = sum(v[1] for v in verts)/5
    zoom_factor = 1.5 ** frame
    ax.set_xlim(center_x - 1/zoom_factor, center_x + 1/zoom_factor)
    ax.set_ylim(center_y - 1/zoom_factor, center_y + 1/zoom_factor)

    return polygons

# 生成动画,frames为迭代次数,interval为帧间隔(毫秒)
ani = animation.FuncAnimation(fig, update, frames=50, init_func=init, interval=200, blit=True)
# 保存为GIF,需提前安装pillow
ani.save('pentagon_convergence.gif', writer='pillow', dpi=150)

优化提示:提前将所有Decimal顶点转换为float/longdouble保存,避免帧更新时重复转换,提升渲染速度。

内容的提问来源于stack exchange,提问作者pie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:08:22