edu-solid-geometry
把一道立体几何题解成一个自包含的交互教学网页:左侧 MathJax 分步解析, 右侧 Three.js 可交互 3D 模型(分步高亮 + 镜头切换)。支持三种入口——给定文字题目、 随机出题、上传题目图片识别后解题。覆盖正方体/长方体、棱锥/棱柱、圆柱/圆锥上的线面角、 二面角、异面直线夹角、点到平面距离、体积等题型,统一用"建系+向量法",并由 sympy 精确 计算驱动(答案、3D 坐标、步骤数值同源一致)。其他 agent 也可调用本技能生成此类网页。 触发词:立体几何, 线面角, 二面角, 异面直线, 点到平面距离, 正四棱锥, 正方体求角, 解这道几何题, 随机出一道立体几何题, 这
By wy51ai · 528 installs
npx skills add wy51ai/edulab --skill edu-solid-geometry
Source repository · Upstream listing
立体几何解题 → 交互网页
这个技能产出什么
一个可直接用浏览器打开的单页 HTML:左侧题面/答案/分步解析(公式用 MathJax),
右侧是题目对应的 3D 模型(Three.js,可旋转缩放,分步高亮关键元素并切换镜头)。
形态与 template/lesson.html 一致。
依赖(重要)
计算核心 lib/geometry kernel.py 依赖 sympy 。运行脚本前先确认有一个能 import sympy 的
python3 :跑 python3 c "import sympy" 。
缺库时的处理(重要) :若 import 报错(sympy 或后续用到的任何库都同理), 先询问用户是否安装 ,
得到同意后再帮忙安装( python3 m pip install <库名 ),或换一个已装该库的解释器; 不要未经询问直接装 。
下文命令里的 python3 均指这个能跑通依赖的解释器。
工作流程
第 1 步:得到 problem spec(三入口归一)
把题目整理成结构化 spec(格式见 references/problem schema.md ):几何体类型与尺寸、
已知构造点/条件、所求类型与对象、 语言 。
文字题目 :直接抽取。
图片 :用视觉读图抽取,并 把识别到的题目回显给用户确认 (题面/几何体/尺寸/所求/语言)后再继续。
随机出题 :选定几何体与题型,用 kernel 随机参数求解,答案不规整就重抽。
输出语言跟随提示词语言 :英文提示 → 英文网页,中文 → 中文。spec 里记下 language 。
第 2 步:用 kernel 精确计算(不要心算)
按 references/conventions.md 的建系约定与解法配方,调用 lib/geometry kernel.py :
得到精确坐标、关键向量、法向量、最终答案,以及各步骤要展示的中间量(均为 LaTeX 字符串)。
顶点的 three.js 坐标用 kernel.to three(points, scale) 得到。
可先在命令行跑 kernel 验证答案,例如:
第 3 步:组装 lesson data 并注入模板
📍 输出位置(重要) :成品 HTML 一律写到 用户当前工作目录( Path.cwd() ) ,除非用户显式指定路径。
绝不要 写进技能自身目录( skills/edu solid geometry/output/ 等)——那是技能内部的开发样例目录。
临时构建脚本也放到 cwd 或临时目录(如 /tmp ),用完可删。
写一个 临时构建脚本 ,导入 kernel、bodies、generate,拼出 lesson / steps / model 数据
(schema 见 references/problem schema.md ),再调用 generate.render html(data, out) 注入模板产出 HTML。
out 用 cwd 下的绝对路径 :
steps[ ].content 里的所有数值 直接引用 kernel 的计算结果 ,模型只负责组织讲解文字(按目标语言书写)。
model.points 用 kernel.to three(...) 的结果; model.spheres / edges 用 lib/bodies.py 的拓扑
( quad pyramid / tri pyramid / cuboid / cube / prism ),罕见几何体可手写 edges。
每步配 highlight (该步可见元素的绝对集合)与 cameraPos 。
题面给出线段长度时 :为对应棱加 measure 元素( label 用 LaTeX,如 2\sqrt{2} ),
并把它放进"建系/列已知条件"那步的 highlight ,在 3D 图中点处标出长度(见 problem schema)。
英文输出时填 lesson.ui 英文文案并设 lesson.language="en" 。
可直接参考的范例 : scripts/generate.py 里的 build data() (正四棱锥·线面角)、
build cube data() (正方体·线面角)、 build box volume data() (长方体·体积)都是完整范本,照着改即可。
generate.py 可直接出已注册的题; 不传路径时默认写到当前工作目录(cwd) ,也可显式给 cwd 下的文件名
(用技能目录里的 scripts/generate.py ,输出落在 cwd):
随机出题 : generate.py random <seed [输出.html] ,内部用 kernel.is clean(...) 判答案规整、不过重抽:
扩展随机题型时沿用"随机参数 → 求解 → is clean 不过就重抽"。
第 4 步:自检(对应正确性方案)
kernel 答案 == 答案卡 answerValue == 末步骤展示的最终值(generate.py 已有断言示例)。
3D 顶点坐标来自 kernel.to three (与解题同源)。
起本地静态服务(服务 输出文件所在目录 ,即 cwd)用预览检查:无控制台报错、公式渲染正常、分步高亮/镜头符合预期。
(技能仓库内开发时可用 .claude/launch.json 的 geom preview ;在别处运行就对 cwd 起一个临时静态服务。)
⚠️ 必须关闭你开过的端口/服务 :预览检查一结束就立即停掉本地服务, 绝不留下占用端口的进程 。
用 preview 工具开的:检查完马上 preview stop (传对应 serverId)。
直接起的 http.server :用完 kill 掉,或核对 lsof nP iTCP:<port sTCP:LISTEN 确认已释放。
交付前确认端口已释放,再告诉用户结果。开了不关 = 未完成自检。
第 5 步:交付
成品写在 用户当前工作目录(cwd) ,命名形如 solution <题目简述 .html ,把(cwd 下的)路径告诉用户,可直接浏览器打开。
交付前确认: (1) 成品在 cwd、不在技能目录; (2) 没有遗留任何由本次预览开启的本地服务/端口。
扩展
加题型 :在 geometry kernel.py 加求解函数(见 conventions 配方表),在 generate.py 加一个 build 。
加几何体 :在 geometry kernel.py 加坐标构建函数,在 bodies.py 加棱拓扑。
目录
template/lesson.html — 数据驱动模板(通用 3D 渲染器 + 数据岛 LESSON DATA )
lib/geometry kernel.py — sympy 精确计算核心
lib/bodies.py — 几何体棱拓扑库
scripts/generate.py — 注入模板 + 范例构建函数
references/problem schema.md — 数据格式
references/conventions.md — 建系约定、解法配方、自检