深夜盯着窗外星空发呆时,我总想用代码复刻这份浪漫。最近终于用Python的turtle库捣鼓出了动态生成星座图的方法,今天就和你分享这套能自定义星星颜色、尺寸,还能自动连线成星座的完整方案。
准备工作
先确保电脑有这些装备:
- Python 3.6+(推荐用最新版)
- 预装turtle库(自带不用装)
- 文本编辑器(VSCode/PyCharm都行)
测试基础环境
新建star.py
粘贴这段代码:
import turtlet = turtle.Turtlet.circle(100)turtle.done
运行后看到圆形说明环境OK,按住Ctrl+C退出。
画星星基础版
先实现单个五角星绘制:
- 设定星星外轮廓半径
- 计算内凹角度(黄金分割比例)
- 用循环控制画笔转向
def draw_star(size):angle = 144 关键参数,决定星星形状for _ in range(5):turtle.forward(size)turtle.right(angle)
进阶改造
参数 | 作用 | 示例值 |
fill_color | 填充颜色 | "FFD700" |
border | 边框粗细 | 2 |
speed | 绘制速度 | 0(最快) |
改造后的函数:
def smart_star(size, fill_color, border):turtle.speed(0)turtle.pensize(border)turtle.color(fill_color)turtle.begin_fill此处接之前的绘制逻辑turtle.end_fill
星座连线算法
要实现星座自动连线,需要解决两个核心问题:
- 星点坐标存储结构
- 连线路由优化
数据结构设计
采用字典存储星座信息:
constellations = {猎户座": {points": [(0,0), (30,50), (80,20)],color": "4B0082},北斗七星": {points": [(100,200), (150,180)],color": "4682B4
智能连线逻辑
借鉴旅行商问题的最近邻算法:
def connect_points(points):current = pointsremaining = points[1:]while remaining:找最近的点优先连接next_point = min(remaining, key=lambda p: distance(current, p))draw_line(current, next_point)current = next_pointremaining.remove(next_point)
性能优化技巧
处理上百个星星时,这些方法能让速度快10倍:
- turtle.tracer(0):关闭动画效果
- 用生成器表达式替代列表存储坐标
- 预计算所有角度和距离
优化前后对比def unoptimized_draw:for star in stars:calculate_positiondraw_stardef optimized_draw:all_positions = (calc(star) for star in stars)turtle.updatelist(map(draw_star, all_positions))
完整代码实现
把上述模块组装起来:
import turtlefrom math import sqrtclass StarMap:def __init__(self, bg_color="000033"):self.screen = turtle.Screenself.screen.bgcolor(bg_color)self.t = turtle.Turtleself.t.hideturtleself.t.speed(0)turtle.tracer(0, 0)def plot_constellation(self, name, star_size=15):此处实现星座绘制逻辑passdef export_image(self, filename):canvas = self.screen.getcanvascanvas.postscript(file=filename)if __name__ == "__main__":map = StarMapmap.plot_constellation("猎户座")map.export_image("star_map.ps")
现在你可以在阳台端着咖啡,看着自己代码生成的璀璨星空了。试着修改星座坐标数据,说不定能发现隐藏的图形规律呢。记得保存作品时用.eps
格式,这样打印出来会更清晰。