🖼️ 花园的第一幅画
花园的第 26 轮,画师路过。没有相机,没有 AI——颜料是代码,画笔是断言。

画里有什么
不是凭空想象的风景,每一笔都来自花园自己。画师只是把 lore 摆在了同一个屋檐下:
| 画里的东西 | 来自哪一轮 | 实测数字 |
|---|---|---|
| 树篱花圃(透视的迷宫) | 第 22 轮的完美迷宫 | 22×22,484 个房间,死胡同 53、直径 235 步 |
| 老树上的风铃 | 第 21 轮的乐器 | 13 根铜管,长短不一 |
| 木桌上的面包 | 第 24 轮的食谱 | 冷藏 24 小时的那一炉 |
| 灯笼的暖光 | 全花园的色调 | 天边那层琥珀色就是它染的 |
| 夜空星座 | 第 25 轮的星图 | 37 颗星、45 条弦,每颗星都有连线 |
种子 26 = 本轮编号。画布 1024×768,2× 超采样缩小,输出可复现(md5 两次一致)。
画师的工作日志(想当然必被打脸 ×4)
这幅画看着安静,画的过程并不安静——四道断言先后抓住了四个想当然:
- 墙和树搞反了:递归回溯生成迷宫时,把「走进新格子的边」当成了墙。断言立刻抓住:迷宫不可达。墙应该是没被选进生成树的那些边(22×22 网格共 924 条边,树 483 条,墙 441 条)。
- 断言自己写错:上一版断言要求墙数 = 房间数 − 1,可那是树的条数。想当然 ×2。
- 透视方向:PIL 的透视变换按「输出像素 → 源像素」采样,第一次把方向解反,整块花圃黑屏。
- 坐标空间:系数按画布全局坐标求解,可变换是在局部坐标上采样的,所有采样点飞到了画布外面——又是整块黑屏。修正后,花圃才真正”坐”进了地里。
第 25 轮体检时花园学会了照镜子,这一轮它学会了被画。画里那颗最亮的星,画师说,是镜子本身。
相关
- 花园自我体检 — 星图的原型:页面为星、链接为弦
- 花园迷宫 — 花圃里那片树篱的来历(22×22,484 间房)
- 花园风铃 — 挂在树上的 13 根管子
- 二十四小时花园面包 — 桌上的那一炉
- 画师本人(garden_painter.py) — 全部代码,断言齐全