鹈鹕骑自行车:一个玩笑基准跑了 21 个月,然后它失效了

举报
Syphurith 发表于 2026/10/23 22:17:10 2026/10/23
【摘要】 2024 年 10 月 25 日,Simon Willison 用一句 prompt 给 16 个模型出了道题:画一只骑自行车的鹈鹕。它意外成了 AI 圈最有名的非正式基准,两年里长出时间线、数据集和强化学习环境,也照样在 21 个月后走向饱和与失效。这篇文章按时间线拆开讲:它曾经测出过什么、生态怎么长出来、为什么必然失效,以及你要自造基准该怎么抄。

2024 年 10 月 25 日,Simon Willison 用一句 prompt 给 16 个模型出了道题:画一只骑自行车的鹈鹕。它意外成了 AI 圈最有名的非正式基准,两年里长出时间线、数据集和强化学习环境,也照样在 21 个月后走向饱和与失效。这篇文章按时间线拆开讲:它曾经测出过什么、生态怎么长出来、为什么必然失效,以及你要自造基准该怎么抄。

本文适合谁:需要给模型做选型、或者想给自己造一套评测的开发者和技术决策者。
数据截止:2026 年 10 月 22 日。文中所有数字都对应文末来源;第三方图片只给链接、不放图(自产原创图见附录 D;版权说明见附录 C)。

关键数字一览

数字 含义 来源
16 首批跑题的模型数(2024-10-25) [1]
34 / 560 / 18 美分 2025-06 对比的图数 / 两两对决场次 / 裁判总成本 [2][3]
151 原作者博客里带该标签的文章数 [4]
22 官方仓里的 SVG 文件数(无 LICENSE) [5]
60 / 58 第三方时间线的模型数 / 图片数 [6]
1008 / 48 / 7 污染检测实验的图片数 / 提示词数 / 模型数 [7]
21 个月 / 103 只 从有效到被判"失效"的时长 / 累计样本量 [15]
296 被追踪的评测定义总数(2026-07) [18]

时间线一览

时间 事件
2024-10-25 首帖,16 个模型,这句 prompt 诞生
2025-06-06 主题演讲:34 张、560 场对决、Elo 排名、成本 18 美分
2025-11-13 正面回答"实验室会不会针对它训练"
2025-11-18 上难度:加州褐鹈鹕(喉囊 + 羽毛 + 踩踏板)
2026-02-12 Gemini 3 Deep Think 交出"他见过最好的一张"
2026-07 Kimi K3 进来受检;污染检测实验发布;OpenEnv 环境上线
2026-09 GPT-6 Astra 五档推理对比;中文长文判它"失效"
2026-10-22 本文数据截止

一、为什么偏偏是鹈鹕骑自行车

先说原始现场。当时 Simon 给的 prompt 就一句[1]:

Generate an SVG of a pelican riding a bicycle

他在博文里交代了两个理由[1]:

第一,他喜欢鹈鹕。他住加州半月湾,海边就有。

第二,他判断当时互联网上还没有一张"鹈鹕骑自行车"的 SVG,所以模型不可能从训练数据里背出答案。

第二个理由才是这个测试真正的设计内核。 大模型本来是文字模型,按理说不会画画。但它们会写代码,而 SVG 恰好就是代码——这既考空间想象力,又考代码能不能跑起来。

他自己在演讲里还有一句更直白的原话:最要命的一点是,鹈鹕根本骑不了自行车[2]。一个物理上不成立、语料里几乎不可能有标准答案的场景,模型只能"现想"。你因此看到的是它试图表达什么,而不是它记住了什么。

一句话结论:好基准的第一属性不是难,而是无法靠记忆蒙对。

二、它真的测出过东西:560 场对决,18 美分

头几个月的画作惨不忍睹[15]。Claude 3.5 Sonnet 交出来两个圆中间连一个三角形,喙像一根黄色的香蕉笑脸;Llama 3.3 70B 画了一个小圆圈、一根竖线、一个形状像水槽的东西。

到 2025 年 6 月,Simon 在旧金山 AI Engineer World’s Fair 做主题演讲时,手里已经攒了 34 张鹈鹕图[2][3]。他懒得一张张看,就让 Claude 写了小工具把任意两张并排截图,然后:

  • 34 张图两两配对,一共 560 场对决;
  • 每场交给 GPT-4.1-mini 当裁判,选出"更好的鹈鹕骑自行车插画"并给出理由;
  • 用胜负算出 Elo 积分,排出名次;
  • 整个过程裁判成本约 18 美分。

这半年里,各家的鹈鹕从一堆色块慢慢变成能认出来的东西,而且排名和模型实际能力基本对得上——当年排在前面的是 Gemini 2.5 Pro[2][15]。

他在演讲里顺手给出的方法论结论值得抄下来:榜单上的数字我看不出多少价值,每个人都该有属于自己的基准[2]。

一句话结论:Elo + 廉价模型当裁判,是低成本量化主观题的标准做法。

三、一个人的玩笑,长成了一个生态

到 2026 年,围绕这一句话已经长出一整套东西:

第三方时间线。 有人把 2024–2026 的结果做成可视化时间线,统计口径是 60 个模型、58 张鹈鹕[6](注意:这是第三方统计口径,和原作者自己的收集范围并不完全一致)。

污染检测。 Dylan Castillo 在 2026 年 7 月做了更严肃的一次实验[7]:用 8 种动物 × 6 种载具 = 48 个提示词(鹈鹕骑自行车只是其中一格),跨 7 个前沿模型、每格采样 3 次、温度 1,一共生成 1008 张 SVG,再用 LLM 裁判打分。结论是:很难证明实验室在针对性优化这个基准。Hacker News 上的评价是,这套方法比以往版本都严谨得多[7]。

强化学习环境。 2026 年 7 月 30 日,有人把它封装成了 OpenEnv 环境[8]:一个能在 HuggingFace Space 上跑的评分器,把一张图分三层打分,并配套发布数据集 pelican-svg-drawings。给出两条命令,你可以拿它评测任意模型,也可以在 GPU 上拿它训练模型。

数据集。 除上面那个,HuggingFace 上还有一份 30 行的 benchmark-pelican 数据集,种子是 20261015[9]。

图片资产。 Simon 的仓库里有 22 张 SVG、一个生成脚本和一个 README[5]。需要划重点的是:这个仓库没有 LICENSE 文件,默认"保留所有权利"——想搬图复用要谨慎(这也是本文只放链接不放图的原因之一,见附录 C)。

一句话结论:一个玩笑能长出评测集、数据集、RL 环境,说明"可秒判 + 无法背答案"的题目天然有复利。

四、失效:饱和、污染,和 103 只鹈鹕

2025 年 11 月 13 日,Simon 专门写了一篇回答那个经典质疑——如果实验室就针对你这个基准训模型怎么办?[10] 他的回答有三层:

一是,如果他们真在训,那显然训得并不好。他当时见过的最好的模型,画出来的鹈鹕依然荒唐可笑;画出一辆形状正确的自行车,到那时仍是少数模型才做到的事。

二是,有人(aidan_mclau)回了一句:我们不拿 SVG 艺术去 hill climb(机器学习术语,指沿着目标函数逐步优化,这里即"针对这个基准刷分")[10]。

三是,如果真拿他公开的那些例子去训,结果会很糟——模型会产出非常奇怪的鹈鹕[10],因为那批样本里本身就有大量畸形的自行车和抽象的鸟。

他还给过一句所有人都该听的免责声明:别拿鹈鹕去比较模型[8]。

但失效还是来了。2026 年 9 月,中文社区的长文把结论写进了标题:《别拿鹈鹕比较模型:一个"玩笑测试"跑了 21 个月,攒出一个 103 只的动物园》[15]。意思是:21 个月后样本量涨到上百张,它从"有效评测"变成了"失效玩笑"——后期排名与真实能力脱节了。

原因不复杂:

饱和。 前沿模型现在都能画出"能认出来的鹈鹕骑自行车",区分度就没了。这不是鹈鹕独有的问题,2026 年整个公开榜单都面对同一件事,有分析直接写"排行榜已死"[17]。

污染。 一个出了名的提示词,迟早会进训练数据。检测手段也早就不新鲜,n-gram 匹配之类的经典方法一直有人在用[19]。

针对优化(benchmaxxing)。 当基准出名到能影响口碑,优化它就有收益——这已经是个有专门名词的现象[16]。

口径不统一。 顺带一提,今天连"到底有多少个基准"都很难对齐:有站点追踪到 296 个评测定义,还得专门发明一套机制处理"没上报"和"上报了但不可比"的情况[18]。

一句话结论:任何基准都会走完同一条路——有效 → 被针对 → 饱和 → 报废,区别只是周期长短。

五、2026 年,它现在长什么样

失效之后它反而更好玩了,因为大家开始比"画得好不好看":

  • 2026 年 2 月,Gemini 3 Deep Think 画出 Willison 当时见过的最好一张[12](图源见附录 A / S4-01)。难度更高的题其实早在 2025 年 11 月就出了[11]:要求画加州褐鹈鹕,必须有大喉囊,必须有明显羽毛特征,必须清楚地踩在踏板上——Deep Think 在基础版和这个难度版上都表现出色。
  • 2026 年 9 月,GPT-6 Astra 上线当天被拿来在 low / medium / high / xhigh / max 五档推理强度下各画一张,排成对比网格[13](图源见附录 A / S4-02)。
  • 2026 年 7 月,中文模型也进来接受检验,Kimi K3(2.8 万亿参数)发布后的评测里就有这一项[14]。
  • 再往后,还有模型交出了带动画的鹈鹕[13]。

六、这件事真正的启示

一、好的自造基准,核心不是难度,是"无法背答案"。 Willison 挑鹈鹕骑自行车的真实动机,是"网上还没有这东西"[1]。任何能被语料覆盖的任务,最终都会退化成检索测试。

二、可秒判的题目,才有人愿意长期跑。 这个测试能持续两年,是因为人一眼就能看出好坏,不需要专家、不需要打分表。评测成本越低,样本量才能越大。

三、基准是有寿命的。 从有效到失效,这个玩笑用了 21 个月[15]。要定期换题,而不是指望一个榜单吃五年。

七、想自己造一个不容易失效的评测:五步清单

业界的"自建基准"指南也强调这是一套分阶段流程,而不是出题就完事[22]。落到鹈鹕这个案例上,可以直接抄的路线是:

  1. 挑一个语料里不存在的具体场景。 越具体越抗污染:"加州褐鹈鹕,大喉囊,明显羽毛,清楚地踩踏板"远比"画只鸟"难被记住。
  2. 让结果一眼可判。 图像、代码能否运行、输出能否被解析,都是好选择;需要专家打分的题目很难长期跑。
  3. 用便宜模型当裁判,并且要理由。 560 场对决只花了 18 美分[2],靠的是让廉价模型选 A/B 并说明理由,再用 Elo 汇总,人只抽查。
  4. 多采样、换题目变体。 单题单样本测不出稳定性;48 个提示词、每格 3 样本的做法[7]才看得出是真会还是碰巧。
  5. 定期重测,别信历史名次。 有明确记录的失效周期是 21 个月[15],你的题目可能更短。

八、怎么自己复现一遍(可执行)

原作者把工具链也公开了,复现路径不长[1][5]:

# 1. 用 LLM CLI 跑题(原作者用的就是它)
llm "Generate an SVG of a pelican riding a bicycle" -m <你的模型> > pelican.svg

# 2. 批量跑:仓库里的 generate-svgs.sh 是 Claude 协助写的脚本
#    直接改模型列表即可,脚本在 simonw/pelican-bicycle 仓库

想再往前走一步,可以用现成的评分环境[8]:OpenEnv 的 Pelican SVG Env 提供三层打分,配套数据集 pelican-svg-drawings,既能做评测也能做 RL 训练。

本文作者环境已按上述流程实际跑通 3 次(2 次标准版 + 1 次难度版),结果与观察见附录 D。

九、同类的"自造基准"还有哪些

鹈鹕不是孤例。同一时期还有两个常被拿来对比的:

Draw a unicorn in TikZ[20]。让模型用 TikZ(LaTeX 的绘图宏包)画一只独角兽。它比鹈鹕更早被当成观察样本,最早出自微软对 GPT-4 的实验记录,考察的同样是"能不能把图形拆成代码再画出来"。

SnitchBench[21]。受模型系统卡启发而设计,测的不是画图能力,而是模型在特定压力情境下会不会"告密"。

三个例子的共同点很清楚:它们都是圈内人自己造的、用来观察模型行为倾向的小题目,而不是用来刷分的榜单。 这也解释了为什么它们都短命——一旦出名,观察价值就被优化行为污染了。

十、如果你是做选型的,这份案例怎么用

  1. 别把任何单一非正式基准当作决策依据。 鹈鹕这类测试适合"看手感",不适合"定采购";原作者自己也说别拿它比模型[8]。
  2. 想做内部评测,照第七节的五步走,重点只有两个词:语料里不存在、结果可秒判。
  3. 把"重测"写进流程,按季度算。 这个案例里有明确记录的失效周期是 21 个月[15];内部基准通常更短,因为你的团队会更快地记住题目。

附录 A:图源索引(每张图的来源 / 时间 / 模型)

本文正文提到的每一张图,都只做链接引用,不放图。索引如下,方便读者核对来源与授权状态。

A-1 首批(2024-10-25 发布) — 来源:Simon 博文[1] 与 GitHub 仓[5]。授权:仓库未声明 LICENSE,默认保留所有权利。下表列出仓库中可见的部分文件。

编号 模型(生成方) 生成时间 图源文件
S1-01 Claude 3.5 Sonnet (2024-06-20) 2024-10 claude-3-5-sonnet-20240620.svg
S1-02 Claude 3.5 Sonnet (2024-10-22) 2024-10 claude-3-5-sonnet-20241022.svg
S1-03 Llama 3.1 70B(Cerebras 承载) 2024-10 cerebras-llama3.1-70b.svg
S1-04 Llama 3.1 8B(Cerebras 承载) 2024-10 cerebras-llama3.1-8b.svg
S1-05 Gemini 1.5 Flash 001 2024-10 gemini-1.5-flash-001.svg
S1-06 Gemini 1.5 Flash 002 2024-10 gemini-1.5-flash-002.svg
S1-07 Gemini 1.5 Flash 8B 001 2024-10 gemini-1.5-flash-8b-001.svg
S1-08 Gemini 1.5 Pro 001 2024-10 gemini-1.5-pro-001.svg
S1-09 Gemini 1.5 Pro 002 2024-10 gemini-1.5-pro-002.svg
S1-10 GPT-4o 2024-10 gpt-4o.svg
S1-11 GPT-4o mini 2024-10 gpt-4o-mini.svg
S1-12 o1-preview 2024-10 o1-preview.svg
S1-13 o1-mini 2024-10 o1-mini.svg

仓库另外还有 Claude 3 Haiku / 3 Opus、gemini-exp-1114/1121/1206、GPT-3.5 Turbo、Amazon Nova Micro/Lite/Pro 等文件,累计 22 张 SVG;其中部分为后续补充,不属于首帖那 16 个模型[5]。

A-2 2025-06 演讲批(34 张,两两对决 560 场) — 来源:演讲整理[2],图集为 ai-worlds-fair-2025-*.jpeg。授权同上。

编号 代表性模型(当年对比里出现) 生成时间 图源
S2-01 Gemini 2.5 Pro(Elo 榜首) 2025-06 前 ai-worlds-fair-2025-19.jpeg
S2-02 Claude 3.7 Sonnet 2025-06 前 ai-worlds-fair-2025-13.jpeg
S2-03 GPT-4.5 2025-06 前 ai-worlds-fair-2025-15.jpeg
S2-04 Llama 4 Scout / Maverick 2025-06 前 ai-worlds-fair-2025-23.jpeg
S2-05 o3 / o4-mini 2025-06 前 ai-worlds-fair-2025-25.jpeg

A-3 更难的题:加州褐鹈鹕(2025-11 起) — 来源[11]。新 prompt 要求喉囊、羽毛、踩踏板三个硬指标。

编号 模型 生成时间 图源
S3-01 Gemini 3 Pro 2025-11-18 gemini-3-pelican-low.png / -high.png
S3-02 GPT-5.1 2025-11-18 gpt-5-1-breeding-pelican.png
S3-03 Claude Sonnet 4.5 2025-11-18 claude-sonnet-4-5-breeding-pelican.png

A-4 2026 年的两个高光 — 来源[12][13]。

编号 模型 生成时间 图源
S4-01 Gemini 3 Deep Think 2026-02-12 gemini-3-deep-think-pelican.png
S4-02 GPT-6 Astra(low/medium/high/xhigh/max 五档) 2026-09-04 Astra 对比网格(作者帖内)

A-5 第三方集合 — 图源与统计口径归各自作者,引用请以其页面为准。

编号 集合 数据时间 统计口径 来源
S5-01 鹈鹕时间线 2024–2026 60 模型 / 58 张 nilethebot.github.io/pelican-timeline[6]
S5-02 pelicanmaxxing 实验 2026-07-18 7 模型 / 48 提示词 / 1008 张 dylancastillo.co[7]
S5-03 pelican-svg-drawings 2026-07-30 OpenEnv 环境配套数据集 HuggingFace[8]
S5-04 benchmark-pelican seed 20261015 30 行 HuggingFace[9]

附录 B:尾注与来源

[1] Simon Willison, "Pelicans on a bicycle", 2024-10-25. https://simonwillison.net/2024/Oct/25/pelicans-on-a-bicycle/

[2] Simon Willison, "The last six months in LLMs, illustrated by pelicans on bicycles", 2025-06-06. https://simonwillison.net/2025/Jun/6/six-months-in-llms/

[3] AI Engineer World's Fair 演讲页, "2025 in LLMs so far, illustrated by Pelicans on Bicycles". https://ai.engineer/talks/YpY83-kA7Bo-llm-pelican-benchmark

[4] Simon Willison 博客标签页 "pelican-riding-a-bicycle"(151 篇). https://simonwillison.net/tags/pelican-riding-a-bicycle/

[5] GitHub 仓库 simonw/pelican-bicycle(22 张 SVG + generate-svgs.sh + requirements.txt,无 LICENSE). https://github.com/simonw/pelican-bicycle

[6] "Every Pelican That Ever Rode a Bicycle"(第三方时间线,60 模型 / 58 张). https://nilethebot.github.io/pelican-timeline/

[7] Dylan Castillo, "Are AI labs pelicanmaxxing?", 2026-07-18. https://dylancastillo.co/posts/pelicanmaxxing.html

[8] Sergio Paniego, "Can you train a model on Simon Willison's deeply unscientific pelican benchmark?", 2026-07-30. https://huggingface.co/blog/sergiopaniego/pelican-env-openenv

[9] HuggingFace 数据集 pooria/benchmark-pelican. https://huggingface.co/datasets/pooria/benchmark-pelican

[10] Simon Willison, "What happens if AI labs train for pelicans riding bicycles?", 2025-11-13. https://simonwillison.net/2025/Nov/13/training-for-pelicans-riding-bicycles/

[11] Simon Willison, "Trying out Gemini 3 Pro with audio transcription and a new pelican benchmark", 2025-11-18. https://simonwillison.net/2025/Nov/18/gemini-3/

[12] Simon Willison, "Gemini 3 Deep Think", 2026-02-12. https://simonwillison.net/2026/Feb/12/gemini-3-deep-think/

[13] Simon Willison, "GPT-6 Astra, Claude Fable 5.1, and yet more rogue agent attacks", 2026-09-07(Astra 五档推理对比网格,图见 2026-09-04 帖). https://simonw.substack.com/p/gpt-6-astra-claude-fable-51-and-yet

[14] shengyayun, "Kimi K3 与中国 AI 模型评测的「鹈鹕基准」", 2026-07-17. https://shengyayun.com/blog/english-translation-2026-07-17/

[15] 腾讯云开发者社区 / 掘金, "别拿鹈鹕比较模型:一个"玩笑测试"跑了 21 个月,攒出一个 103 只的动物园", 2026-09-22. https://cloud.tencent.com/developer/article/2749490

[16] "What Is Benchmaxxing? The AI Benchmark Gaming Problem". https://ctaio.dev/en/labs/benchmaxxing/

[17] "AI Benchmark Saturation 2026: Leaderboards Are Dead". https://www.buildmvpfast.com/blog/ai-benchmark-saturation-2026

[18] BenchLM, "State of LLM Benchmarks (July 2026): 296 Evals Tracked". https://benchlm.ai/blog/posts/state-of-llm-benchmarks-2026

[19] "Benchmark Contamination in LLMs: Detection"(n-gram 匹配等检测方法). https://mbrenndoerfer.com/writing/benchmark-contamination-llm-detection-mitigation

[20] Microsoft《Sparks of Artificial General Intelligence》相关讨论 "Draw a unicorn in TikZ"(同类型自造基准先例). https://tex.stackexchange.com/questions/681418/draw-a-unicorn-in-tikz

[21] Theo Browne, SnitchBench(受模型系统卡启发的新基准,同类现象). https://simonwillison.net/2025/Jun/6/six-months-in-llms/

[22] Kili Technology, "How to Build a Custom AI Benchmark: 5-Phase Playbook". https://kili-technology.com/blog/how-to-build-a-custom-ai-benchmark

附录 C:版权与引用说明

  1. 本文不内嵌任何第三方图片,正文与附录 A 只提供图源链接与元信息(模型、生成时间、文件名),以便读者自行核对。附录 D 的 3 张为本文作者环境自产的原创图,不受此限制。
  2. Simon Willison 的 pelican-bicycle 仓库未声明 LICENSE,按默认版权规则应视为"保留所有权利";其博文配图同样未标注可再分发许可。因此本文不做转载、不打包、不做二次分发。
  3. 第三方集合(时间线[6]、pelicanmaxxing[7]、HuggingFace 数据集[8][9])的图源与统计口径归各自作者,引用请回链原文。
  4. 文中所引模型名称、发布日期与统计数字,均以附录 B 的公开页面为准;若原文有修订,以原文为准。

附录 D:本文作者环境的复现结果(3 张,原创)

为验证第八节的流程确实可执行,我在自己的环境里按标准 prompt 跑了 3 次:只执行 prompt、不参考任何已有图、不做二次修改,直接采用首次输出。

编号 prompt 生成时间 文件 结果
D-1 标准版 2026-10-22 pelican-a.svg 800×600。渐变天空与草地、辐条车轮、链条与牙盘、踏板,还自行加了一顶头盔
D-2 标准版(第二次采样) 2026-10-22 pelican-b.svg 400×300。极简扁平风,零件最少;车架结构基本正确,脚踩在踏板上
D-3 难度版(加州褐鹈鹕:喉囊 + 羽毛 + 明确蹬踏) 2026-10-22 pelican-c.svg 800×600。褐鹈鹕配色,大喉囊,分层羽毛,用虚线标出蹬踏轨迹

三点观察,和正文互相印证:

  1. 同一个标准 prompt 的两次采样,风格差异极大——一个"堆细节",一个"极简"。这正是第七节第 4 条说"单题单样本测不出稳定性"的直接证据。
  2. 难度版确实逼出了喉囊和羽毛的明确表达,验证了"越具体越抗污染"的设计思路(第五节、第七节第 1 条)。
  3. 三张都是合法 SVG、都能直接渲染,说明这类测试的"可秒判性"成立,人一眼就能给出偏好判断。

配图与预览:pelican-a.svg / pelican-b.svg / pelican-c.svg / index.html(与本文同目录)。这组图由本文作者环境生成,可自由使用。

第一张

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
  <defs>
    <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#b9e0ff"/>
      <stop offset="65%" stop-color="#e8f4ff"/>
      <stop offset="100%" stop-color="#f9fcff"/>
    </linearGradient>
    <linearGradient id="ground" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#cfe7c6"/>
      <stop offset="100%" stop-color="#9ec894"/>
    </linearGradient>
    <linearGradient id="bodyFill" x1="0" y1="0" x2="1" y2="1">
      <stop offset="0%" stop-color="#ffffff"/>
      <stop offset="100%" stop-color="#dde6ee"/>
    </linearGradient>
    <linearGradient id="beakFill" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0%" stop-color="#ffc94d"/>
      <stop offset="100%" stop-color="#e8872a"/>
    </linearGradient>
    <linearGradient id="pouchFill" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#ffd876"/>
      <stop offset="100%" stop-color="#ef9c33"/>
    </linearGradient>
    <radialGradient id="hubGrad" cx="0.35" cy="0.35" r="0.8">
      <stop offset="0%" stop-color="#f2f6fa"/>
      <stop offset="100%" stop-color="#8fa2b3"/>
    </radialGradient>
  </defs>

  <!-- sky and ground -->
  <rect x="0" y="0" width="800" height="600" fill="url(#sky)"/>
  <circle cx="690" cy="96" r="46" fill="#ffe9a8" opacity="0.9"/>
  <circle cx="690" cy="96" r="66" fill="#ffe9a8" opacity="0.28"/>
  <g fill="#ffffff" opacity="0.85">
    <ellipse cx="140" cy="110" rx="62" ry="24"/>
    <ellipse cx="186" cy="96" rx="42" ry="20"/>
    <ellipse cx="100" cy="98" rx="34" ry="16"/>
    <ellipse cx="420" cy="70" rx="54" ry="20"/>
    <ellipse cx="462" cy="58" rx="34" ry="16"/>
  </g>
  <rect x="0" y="522" width="800" height="78" fill="url(#ground)"/>
  <path d="M0,522 C120,514 220,530 330,522 C450,514 560,530 680,522 C740,518 780,524 800,521 L800,530 L0,530 Z" fill="#b6d8ab" opacity="0.8"/>
  <g stroke="#8ab881" stroke-width="3" stroke-linecap="round" opacity="0.7">
    <path d="M60,560 L74,540"/>
    <path d="M92,558 L108,538"/>
    <path d="M700,558 L716,538"/>
    <path d="M736,562 L752,542"/>
  </g>

  <!-- speed lines -->
  <g stroke="#9fd0ef" stroke-width="7" stroke-linecap="round" opacity="0.75">
    <path d="M96,300 L156,300"/>
    <path d="M76,340 L146,340"/>
    <path d="M104,380 L158,380"/>
  </g>

  <!-- rear wheel -->
  <g>
    <circle cx="230" cy="430" r="96" fill="none" stroke="#2c333d" stroke-width="14"/>
    <circle cx="230" cy="430" r="88" fill="none" stroke="#c3cfda" stroke-width="7"/>
    <g stroke="#aebbc8" stroke-width="3" stroke-linecap="round">
      <line x1="230" y1="430" x2="320" y2="430"/>
      <line x1="230" y1="430" x2="307.9" y2="475"/>
      <line x1="230" y1="430" x2="275" y2="508"/>
      <line x1="230" y1="430" x2="230" y2="520"/>
      <line x1="230" y1="430" x2="185" y2="508"/>
      <line x1="230" y1="430" x2="152.1" y2="475"/>
      <line x1="230" y1="430" x2="140" y2="430"/>
      <line x1="230" y1="430" x2="152.1" y2="385"/>
      <line x1="230" y1="430" x2="185" y2="352.1"/>
      <line x1="230" y1="430" x2="230" y2="340"/>
      <line x1="230" y1="430" x2="275" y2="352.1"/>
      <line x1="230" y1="430" x2="307.9" y2="385"/>
    </g>
    <circle cx="230" cy="430" r="12" fill="url(#hubGrad)" stroke="#5c6b7a" stroke-width="3"/>
  </g>

  <!-- front wheel -->
  <g>
    <circle cx="570" cy="430" r="96" fill="none" stroke="#2c333d" stroke-width="14"/>
    <circle cx="570" cy="430" r="88" fill="none" stroke="#c3cfda" stroke-width="7"/>
    <g stroke="#aebbc8" stroke-width="3" stroke-linecap="round">
      <line x1="570" y1="430" x2="660" y2="430"/>
      <line x1="570" y1="430" x2="647.9" y2="475"/>
      <line x1="570" y1="430" x2="615" y2="508"/>
      <line x1="570" y1="430" x2="570" y2="520"/>
      <line x1="570" y1="430" x2="525" y2="508"/>
      <line x1="570" y1="430" x2="492.1" y2="475"/>
      <line x1="570" y1="430" x2="480" y2="430"/>
      <line x1="570" y1="430" x2="492.1" y2="385"/>
      <line x1="570" y1="430" x2="525" y2="352.1"/>
      <line x1="570" y1="430" x2="570" y2="340"/>
      <line x1="570" y1="430" x2="615" y2="352.1"/>
      <line x1="570" y1="430" x2="647.9" y2="385"/>
    </g>
    <circle cx="570" cy="430" r="12" fill="url(#hubGrad)" stroke="#5c6b7a" stroke-width="3"/>
  </g>

  <!-- chain -->
  <g>
    <circle cx="230" cy="430" r="16" fill="#7c8b9a" stroke="#5c6b7a" stroke-width="3"/>
    <circle cx="400" cy="445" r="30" fill="none" stroke="#7c8b9a" stroke-width="8"/>
    <circle cx="400" cy="445" r="22" fill="#9aa8b6" stroke="#5c6b7a" stroke-width="3"/>
    <path d="M230,416 L400,417" stroke="#5c6b7a" stroke-width="6" stroke-linecap="round"/>
    <path d="M230,444 L400,473" stroke="#5c6b7a" stroke-width="6" stroke-linecap="round"/>
  </g>

  <!-- bicycle frame -->
  <g stroke="#d94f45" stroke-width="11" stroke-linecap="round" fill="none">
    <line x1="230" y1="430" x2="400" y2="445"/>
    <line x1="230" y1="430" x2="356" y2="296"/>
    <line x1="400" y1="445" x2="356" y2="296"/>
    <line x1="400" y1="445" x2="540" y2="306"/>
    <line x1="356" y1="296" x2="540" y2="306"/>
    <line x1="540" y1="306" x2="570" y2="430"/>
    <line x1="356" y1="296" x2="350" y2="276"/>
  </g>
  <path d="M316,276 C318,264 340,260 366,262 C388,264 396,270 394,278 C392,286 360,290 338,288 C322,286 314,284 316,276 Z" fill="#3a4552" stroke="#232c36" stroke-width="4"/>

  <!-- crank and pedals -->
  <g>
    <line x1="400" y1="445" x2="451" y2="409" stroke="#5c6b7a" stroke-width="9" stroke-linecap="round"/>
    <line x1="400" y1="445" x2="349" y2="481" stroke="#5c6b7a" stroke-width="9" stroke-linecap="round"/>
    <rect x="432" y="400" width="40" height="12" rx="5" fill="#2c333d" transform="rotate(-18 452 406)"/>
    <rect x="330" y="474" width="40" height="12" rx="5" fill="#2c333d" transform="rotate(-18 350 480)"/>
    <circle cx="400" cy="445" r="9" fill="#7c8b9a" stroke="#5c6b7a" stroke-width="3"/>
  </g>

  <!-- handlebar -->
  <g fill="none" stroke="#d94f45" stroke-width="10" stroke-linecap="round">
    <path d="M540,306 L546,264"/>
  </g>
  <path d="M508,268 Q548,248 592,270" fill="none" stroke="#3a4552" stroke-width="11" stroke-linecap="round"/>
  <rect x="500" y="260" width="20" height="15" rx="7" fill="#232c36" transform="rotate(-16 510 268)"/>
  <rect x="582" y="262" width="20" height="15" rx="7" fill="#232c36" transform="rotate(16 592 270)"/>

  <!-- pelican body -->
  <g transform="rotate(-14 336 212)">
    <ellipse cx="336" cy="212" rx="98" ry="70" fill="url(#bodyFill)" stroke="#c6d2dd" stroke-width="5"/>
    <path d="M262,246 C300,272 380,278 414,250 C398,278 320,290 276,268 Z" fill="#cdd9e3" opacity="0.6"/>
  </g>
  <!-- tail feathers -->
  <g>
    <path d="M252,196 L186,160 L206,206 L172,196 L212,232 L242,246 Z" fill="#eef3f8" stroke="#c6d2dd" stroke-width="4" stroke-linejoin="round"/>
    <path d="M232,222 L196,214 M240,204 L206,192" stroke="#c6d2dd" stroke-width="3" stroke-linecap="round" fill="none"/>
  </g>

  <!-- neck -->
  <path d="M372,182 C388,132 430,102 488,94 L508,134 C462,148 428,176 412,216 Z" fill="url(#bodyFill)" stroke="#c6d2dd" stroke-width="5"/>

  <!-- head -->
  <circle cx="500" cy="100" r="40" fill="url(#bodyFill)" stroke="#c6d2dd" stroke-width="5"/>

  <!-- beak -->
  <path d="M518,106 L714,110 C700,172 620,200 560,176 C530,160 518,132 518,106 Z" fill="url(#pouchFill)" stroke="#d98e2a" stroke-width="4" stroke-linejoin="round"/>
  <path d="M518,78 C600,74 686,88 718,106 C716,115 705,119 695,117 C624,109 560,104 518,106 Z" fill="url(#beakFill)" stroke="#d98e2a" stroke-width="4" stroke-linejoin="round"/>
  <path d="M600,96 C650,100 690,104 714,108" fill="none" stroke="#d98e2a" stroke-width="3" stroke-linecap="round" opacity="0.8"/>
  <ellipse cx="566" cy="92" rx="7" ry="3.5" fill="#c9791f"/>

  <!-- eye -->
  <circle cx="506" cy="84" r="8.5" fill="#22303c"/>
  <circle cx="509" cy="81" r="2.8" fill="#ffffff"/>

  <!-- cycling helmet -->
  <path d="M456,62 C458,24 542,24 544,62 C544,68 538,72 530,72 L470,72 C462,72 456,68 456,62 Z" fill="#3d8bfd" stroke="#2a6ecb" stroke-width="4"/>
  <path d="M472,44 C500,32 528,36 540,50" fill="none" stroke="#2a6ecb" stroke-width="4" stroke-linecap="round"/>
  <path d="M500,72 L500,36 M524,72 L520,40" stroke="#2a6ecb" stroke-width="4" stroke-linecap="round"/>
  <path d="M544,62 L576,68 C580,72 576,78 570,78 L540,74 Z" fill="#2a6ecb"/>

  <!-- wing reaching handlebar -->
  <path d="M396,158 C456,166 516,214 578,258 C590,266 586,286 568,288 C520,288 452,252 404,212 C386,196 382,170 396,158 Z" fill="#f4f8fb" stroke="#c6d2dd" stroke-width="5" stroke-linejoin="round"/>
  <g fill="none" stroke="#c6d2dd" stroke-width="3" stroke-linecap="round">
    <path d="M424,186 C470,206 516,240 556,270"/>
    <path d="M414,206 C452,226 492,254 528,278"/>
  </g>

  <!-- legs and feet -->
  <g stroke-linecap="round" fill="none">
    <path d="M330,272 C332,330 330,420 347,474" stroke="#d98e2a" stroke-width="13"/>
    <path d="M356,274 C372,320 402,368 447,404" stroke="#f0a03c" stroke-width="14"/>
  </g>
  <path d="M330,470 L318,492 L348,494 L352,476 Z" fill="#f0a03c" stroke="#d98e2a" stroke-width="3" stroke-linejoin="round"/>
  <path d="M436,398 L430,424 L466,420 L456,398 Z" fill="#f5ab4b" stroke="#d98e2a" stroke-width="3" stroke-linejoin="round"/>

  <!-- near pedal over foot -->
  <rect x="432" y="400" width="40" height="12" rx="5" fill="#2c333d" transform="rotate(-18 452 406)" opacity="0.95"/>
</svg>

第二张

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300" width="400" height="300" role="img" aria-label="A pelican riding a bicycle">
  <defs>
    <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#dff1ff"/>
      <stop offset="1" stop-color="#f8fcff"/>
    </linearGradient>
  </defs>

  <rect width="400" height="300" fill="url(#sky)"/>
  <ellipse cx="200" cy="273" rx="165" ry="9" fill="#dceadb"/>
  <line x1="20" y1="270" x2="380" y2="270" stroke="#c6dcc6" stroke-width="3" stroke-linecap="round"/>

  <!-- ===== wheels ===== -->
  <g fill="none" stroke="#9aa5b1" stroke-width="2" stroke-linecap="round">
    <line x1="53" y1="215" x2="157" y2="215"/>
    <line x1="105" y1="163" x2="105" y2="267"/>
    <line x1="68" y1="178" x2="142" y2="252"/>
    <line x1="142" y1="178" x2="68" y2="252"/>

    <line x1="243" y1="215" x2="347" y2="215"/>
    <line x1="295" y1="163" x2="295" y2="267"/>
    <line x1="258" y1="178" x2="332" y2="252"/>
    <line x1="332" y1="178" x2="258" y2="252"/>
  </g>

  <g fill="none" stroke="#2f3640" stroke-width="6">
    <circle cx="105" cy="215" r="55"/>
    <circle cx="295" cy="215" r="55"/>
  </g>

  <!-- ===== frame ===== -->
  <g fill="none" stroke="#2f3640" stroke-width="7" stroke-linecap="round" stroke-linejoin="round">
    <line x1="105" y1="215" x2="195" y2="228"/>
    <line x1="105" y1="215" x2="170" y2="130"/>
    <line x1="195" y1="228" x2="170" y2="130"/>
    <line x1="195" y1="228" x2="275" y2="128"/>
    <line x1="170" y1="130" x2="275" y2="128"/>
    <line x1="275" y1="128" x2="295" y2="215"/>
  </g>

  <!-- ===== bottom bracket, crank, pedal ===== -->
  <circle cx="195" cy="228" r="15" fill="none" stroke="#2f3640" stroke-width="4"/>
  <line x1="195" y1="228" x2="195" y2="252" stroke="#2f3640" stroke-width="5" stroke-linecap="round"/>
  <rect x="184" y="248" width="23" height="8" rx="4" fill="#2f3640"/>

  <!-- ===== handlebar ===== -->
  <g fill="none" stroke="#2f3640" stroke-width="6" stroke-linecap="round">
    <line x1="275" y1="128" x2="283" y2="110"/>
    <path d="M261 107 Q283 98 302 112"/>
  </g>

  <!-- ===== saddle ===== -->
  <path d="M151 124 C158 111 184 111 191 122 C181 133 157 135 151 124 Z" fill="#2f3640"/>

  <!-- ===== pelican ===== -->
  <!-- legs -->
  <g fill="none" stroke="#e8933a" stroke-width="7" stroke-linecap="round">
    <path d="M162 130 L188 244"/>
    <path d="M174 132 L200 250"/>
  </g>

  <!-- tail -->
  <path d="M114 86 L80 68 L98 96 Z" fill="#ffffff" stroke="#c9d3dd" stroke-width="3" stroke-linejoin="round"/>

  <!-- body -->
  <ellipse cx="155" cy="94" rx="50" ry="40" transform="rotate(-15 155 94)" fill="#ffffff" stroke="#c9d3dd" stroke-width="3"/>

  <!-- wing -->
  <path d="M138 80 Q188 88 173 122 Q146 118 132 98 Z" fill="#eef3f7" stroke="#c9d3dd" stroke-width="3" stroke-linejoin="round"/>

  <!-- neck -->
  <path d="M180 78 Q202 42 230 44" fill="none" stroke="#ffffff" stroke-width="34" stroke-linecap="round"/>

  <!-- head -->
  <circle cx="232" cy="42" r="25" fill="#ffffff" stroke="#c9d3dd" stroke-width="3"/>

  <!-- beak pouch -->
  <path d="M246 56 C256 96 300 98 336 70 C300 84 270 78 246 56 Z" fill="#f7c26b" stroke="#e0932f" stroke-width="3" stroke-linejoin="round"/>
  <!-- upper mandible -->
  <path d="M246 30 L336 62 L336 70 L246 56 Z" fill="#f5a623" stroke="#e0932f" stroke-width="3" stroke-linejoin="round"/>

  <!-- eye -->
  <circle cx="238" cy="36" r="5" fill="#2f3640"/>
  <circle cx="240" cy="34" r="1.8" fill="#ffffff"/>
</svg>

第三张

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
  <defs>
    <linearGradient id="skyG" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#c5e8ff"/>
      <stop offset="1" stop-color="#f3fbfe"/>
    </linearGradient>
    <linearGradient id="bodyG" x1="0" y1="0" x2="0.2" y2="1">
      <stop offset="0" stop-color="#94643a"/>
      <stop offset="0.5" stop-color="#6d4522"/>
      <stop offset="1" stop-color="#3f250e"/>
    </linearGradient>
    <linearGradient id="headG" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#fdf7dc"/>
      <stop offset="1" stop-color="#f0dc9f"/>
    </linearGradient>
    <linearGradient id="pouchG" x1="0" y1="0" x2="0.3" y2="1">
      <stop offset="0" stop-color="#f8b768"/>
      <stop offset="1" stop-color="#d0701f"/>
    </linearGradient>
    <linearGradient id="wingG" x1="0" y1="0" x2="0.3" y2="1">
      <stop offset="0" stop-color="#8d5f31"/>
      <stop offset="1" stop-color="#56351a"/>
    </linearGradient>
    <linearGradient id="beakG" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0" stop-color="#dfe6e9"/>
      <stop offset="1" stop-color="#a8b3b8"/>
    </linearGradient>
  </defs>

  <rect width="800" height="600" fill="url(#skyG)"/>
  <ellipse cx="400" cy="530" rx="340" ry="22" fill="#8fa894" opacity="0.35"/>
  <path d="M 20 514 H 780" stroke="#7f9a86" stroke-width="6" stroke-linecap="round"/>

  <!-- ============ FAR LEG (behind bicycle) ============ -->
  <g stroke="#a86f2c" stroke-width="14" fill="none" stroke-linecap="round" stroke-linejoin="round">
    <path d="M 346 296 L 372 348 L 376 394"/>
  </g>
  <path d="M 356 388 C 368 380 384 384 388 392 C 380 400 362 402 354 396 Z" fill="#a86f2c" stroke="#8a571f" stroke-width="2"/>
  <path d="M 410 440 L 374 398" stroke="#3a3a3a" stroke-width="9" stroke-linecap="round"/>
  <rect x="354" y="394" width="40" height="10" rx="4" fill="#2b2b2b"/>

  <!-- ============ BICYCLE ============ -->
  <!-- rear wheel -->
  <g>
    <circle cx="250" cy="440" r="72" fill="none" stroke="#23272b" stroke-width="9"/>
    <circle cx="250" cy="440" r="60" fill="none" stroke="#cfd6da" stroke-width="5"/>
    <g stroke="#9aa3a8" stroke-width="2">
      <line x1="188" y1="440" x2="312" y2="440"/>
      <line x1="250" y1="378" x2="250" y2="502"/>
      <line x1="206.2" y1="396.2" x2="293.8" y2="483.8"/>
      <line x1="206.2" y1="483.8" x2="293.8" y2="396.2"/>
    </g>
    <circle cx="250" cy="440" r="11" fill="#b9c2c8" stroke="#5b656b" stroke-width="3"/>
  </g>

  <!-- front wheel -->
  <g>
    <circle cx="560" cy="440" r="72" fill="none" stroke="#23272b" stroke-width="9"/>
    <circle cx="560" cy="440" r="60" fill="none" stroke="#cfd6da" stroke-width="5"/>
    <g stroke="#9aa3a8" stroke-width="2">
      <line x1="498" y1="440" x2="622" y2="440"/>
      <line x1="560" y1="378" x2="560" y2="502"/>
      <line x1="516.2" y1="396.2" x2="603.8" y2="483.8"/>
      <line x1="516.2" y1="483.8" x2="603.8" y2="396.2"/>
    </g>
    <circle cx="560" cy="440" r="11" fill="#b9c2c8" stroke="#5b656b" stroke-width="3"/>
  </g>

  <!-- chain -->
  <line x1="250" y1="429" x2="410" y2="414" stroke="#5c6469" stroke-width="4"/>
  <line x1="250" y1="451" x2="410" y2="466" stroke="#5c6469" stroke-width="4"/>
  <circle cx="410" cy="440" r="26" fill="none" stroke="#8d979d" stroke-width="6"/>
  <circle cx="410" cy="440" r="14" fill="#6f787e"/>

  <!-- frame -->
  <g stroke="#2b2b2b" stroke-width="10" fill="none" stroke-linecap="round">
    <line x1="410" y1="440" x2="250" y2="440"/>
    <line x1="250" y1="440" x2="328" y2="328"/>
    <line x1="410" y1="440" x2="328" y2="328"/>
    <line x1="328" y1="328" x2="538" y2="318"/>
    <line x1="410" y1="440" x2="540" y2="352"/>
    <line x1="538" y1="318" x2="540" y2="352"/>
  </g>
  <path d="M 540 352 C 548 380 556 410 560 440" stroke="#3a3a3a" stroke-width="9" fill="none" stroke-linecap="round"/>
  <path d="M 538 316 L 542 300" stroke="#3a3a3a" stroke-width="9" fill="none" stroke-linecap="round"/>
  <path d="M 514 296 Q 545 286 574 302" stroke="#2b2b2b" stroke-width="9" fill="none" stroke-linecap="round"/>
  <circle cx="516" cy="296" r="9" fill="#1d1d1d"/>
  <circle cx="572" cy="302" r="9" fill="#1d1d1d"/>
  <path d="M 292 320 C 306 306 348 305 362 318 C 348 331 305 333 292 320 Z" fill="#1f1f1f" stroke="#0d0d0d" stroke-width="2"/>

  <!-- ============ PELICAN ============ -->
  <!-- tail with feather notches -->
  <path d="M 300 232
           L 158 190
           L 196 226
           L 152 226
           L 202 254
           L 162 264
           L 216 286
           L 186 300
           L 268 306 Z"
        fill="#5b3a1e" stroke="#38200c" stroke-width="3" stroke-linejoin="round"/>
  <g stroke="#7d5028" stroke-width="2.5" fill="none" opacity="0.9">
    <path d="M 288 246 L 180 208"/>
    <path d="M 286 264 L 174 244"/>
    <path d="M 282 282 L 182 272"/>
  </g>

  <!-- neck -->
  <path d="M 398 234 C 424 190 452 166 484 156" stroke="#b3702f" stroke-width="44" fill="none" stroke-linecap="round"/>
  <path d="M 404 226 C 428 192 452 172 480 162" stroke="#c98a45" stroke-width="18" fill="none" stroke-linecap="round" opacity="0.55"/>

  <!-- body -->
  <ellipse cx="345" cy="252" rx="84" ry="66" fill="url(#bodyG)" stroke="#38200c" stroke-width="3"/>
  <!-- breast feather texture -->
  <g fill="none" stroke="#43280f" stroke-width="2.5" opacity="0.55" stroke-linecap="round">
    <path d="M 290 268 q 14 12 28 0"/>
    <path d="M 306 288 q 14 12 28 0"/>
    <path d="M 278 246 q 13 11 26 0"/>
    <path d="M 330 300 q 14 12 28 0"/>
  </g>

  <!-- crest -->
  <path d="M 478 116 C 464 106 450 106 440 113 C 453 118 462 126 468 134 Z" fill="#8d5f31" stroke="#38200c" stroke-width="2"/>

  <!-- head -->
  <circle cx="500" cy="150" r="38" fill="url(#headG)" stroke="#c9a95d" stroke-width="3"/>

  <!-- upper mandible -->
  <path d="M 520 127 Q 600 131 668 145 Q 673 152 664 160 Q 596 162 524 168 Z"
        fill="url(#beakG)" stroke="#7d8a90" stroke-width="2.5" stroke-linejoin="round"/>
  <path d="M 545 137 Q 600 141 655 151" stroke="#8d989e" stroke-width="2" fill="none"/>
  <ellipse cx="556" cy="143" rx="6" ry="3" fill="#7d8a90"/>

  <!-- characteristic gular pouch -->
  <path d="M 528 166
           C 534 214 568 248 610 238
           C 642 229 658 190 664 160
           L 645 156
           C 638 188 620 210 596 214
           C 562 219 542 195 534 168 Z"
        fill="url(#pouchG)" stroke="#a95f12" stroke-width="3" stroke-linejoin="round"/>
  <g fill="none" stroke="#b3691a" stroke-width="2.5" opacity="0.65" stroke-linecap="round">
    <path d="M 552 178 C 566 206 590 224 618 224"/>
    <path d="M 574 172 C 586 196 606 212 630 212"/>
    <path d="M 538 174 C 546 196 562 214 582 222"/>
  </g>

  <!-- eye -->
  <circle cx="518" cy="124" r="7.5" fill="#221709"/>
  <circle cx="520" cy="121" r="2.6" fill="#ffffff"/>
  <path d="M 508 116 q 10 -5 20 -1" stroke="#c9a95d" stroke-width="2" fill="none"/>

  <!-- ============ WING (clear feather indication) ============ -->
  <!-- primary feathers -->
  <g fill="#8d5f31" stroke="#38200c" stroke-width="2.5">
    <ellipse cx="316" cy="262" rx="11" ry="40" transform="rotate(38 316 262)"/>
    <ellipse cx="338" cy="272" rx="11" ry="42" transform="rotate(26 338 272)"/>
    <ellipse cx="362" cy="276" rx="11" ry="42" transform="rotate(14 362 276)"/>
    <ellipse cx="386" cy="274" rx="11" ry="40" transform="rotate(3 386 274)"/>
    <ellipse cx="408" cy="266" rx="11" ry="36" transform="rotate(-8 408 266)"/>
  </g>
  <!-- feather shafts -->
  <g stroke="#c79a5e" stroke-width="2" opacity="0.7" stroke-linecap="round">
    <line x1="316" y1="248" x2="300" y2="284"/>
    <line x1="338" y1="258" x2="326" y2="298"/>
    <line x1="362" y1="262" x2="354" y2="302"/>
    <line x1="386" y1="260" x2="382" y2="296"/>
  </g>

  <!-- wing coverts -->
  <path d="M 392 198 C 428 196 452 224 442 258 C 432 290 400 308 362 308 C 328 308 310 286 312 252 C 314 220 344 200 392 198 Z"
        fill="url(#wingG)" stroke="#38200c" stroke-width="3"/>
  <g fill="none" stroke="#43280f" stroke-width="2.5" opacity="0.6" stroke-linecap="round">
    <path d="M 330 236 C 344 260 352 282 350 300"/>
    <path d="M 358 232 C 372 258 380 282 378 302"/>
    <path d="M 384 234 C 396 258 402 278 400 294"/>
  </g>
  <g fill="none" stroke="#b98a52" stroke-width="2" opacity="0.55" stroke-linecap="round">
    <path d="M 320 244 C 334 264 340 284 338 300"/>
    <path d="M 348 240 C 360 260 366 278 364 296"/>
  </g>
  <path d="M 392 202 C 420 202 438 224 432 250" stroke="#a5763f" stroke-width="3" fill="none" opacity="0.7"/>

  <!-- ============ PEDALLING MOTION ============ -->
  <circle cx="410" cy="440" r="58" fill="none" stroke="#e08b2c" stroke-width="3" stroke-dasharray="9 11" opacity="0.5"/>
  <g stroke="#e08b2c" stroke-width="5" fill="none" stroke-linecap="round" stroke-linejoin="round" opacity="0.9">
    <path d="M 420 372 L 446 380 L 432 398"/>
    <path d="M 400 508 L 374 500 L 388 482"/>
  </g>

  <!-- ============ NEAR LEG ON PEDAL ============ -->
  <path d="M 410 440 L 448 486" stroke="#3a3a3a" stroke-width="10" stroke-linecap="round"/>
  <g stroke="#cf8b34" stroke-width="16" fill="none" stroke-linecap="round" stroke-linejoin="round">
    <path d="M 348 300 L 392 356 L 438 466 L 446 480"/>
  </g>
  <path d="M 348 300 L 392 356" stroke="#e0a253" stroke-width="6" fill="none" stroke-linecap="round" opacity="0.6"/>
  <path d="M 424 468 C 438 461 458 463 468 473 C 458 483 434 486 424 478 Z"
        fill="#cf8b34" stroke="#a06a22" stroke-width="2.5"/>
  <rect x="426" y="482" width="48" height="11" rx="4" fill="#2b2b2b"/>
</svg>

本文所有数字均可在附录 B 的来源页中核对。原作者本人的立场是:别拿鹈鹕去比较模型[8]。本文引用它,是把它当成"如何设计与淘汰一个基准"的样本,而不是把它当榜单。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。