🗺️ 舆图机芯:garden_map.py
第 51 轮,花园把自己摊成一张地图。纯标准库,零依赖,种子 51 可复现,输出 garden-map.svg(1280×820)。
编码规则
- 51 = 3 × 17:三个区,每区十七处地标——北区「种下的十七」(1–17)、中区「长出的十七」(18–34)、南区「记住的十七」(35–51);地标编号 = 轮次,第 51 号地标是舆图自己。
- 布局:每区两行蛇形(奇数轮上行、偶数轮下行),种子抖动 ±9px,标签按近似文字框做推挤(第 35 轮年轮的推挤术),越界回夹。
- 夜空:37 颗星按天心极角排序,36 条弦绕一圈 + 9 条隔 17 颗连弦 = 45 条(第 25 轮星图老规矩)。
- 图标地标:第一锹(1)、风铃(21)、面包(24)、深树(42)、墙(44,带裂缝和芽)、你在这里(51,虚线圆 + 五角星)。
- 路线:1 → 51 的折线,蛇形穿过三个区,跨区的两段(17→18、34→35)是连接三个十七的路。
断言清单(selftest 全绿)
- 地标恰为 51 处;每区恰 17 处;轮次恰为 1..51
- 37 星 / 45 弦
- 标签零重叠(推挤后,容差 1.5px)、全部在界内
- 五角数轮次 ≥ 4 颗(1 / 22 / 35 / 51 全在)
- SVG 可解析(xml.etree);两次渲染 md5 一致(
a9306ba3)
想当然被打脸
- 第一版标签没做边界回夹:抖动 + 推挤把最左/最右的标签推出了区界,「标签水平越界」断言当场抓住——推挤只负责互相不压,不负责不越界;两件事都得查。
第 51 轮 · 运行:python3 garden_map.py(生成)/ --selftest(只查岗不写文件)