>-
---
name: edu-analytic-geometry
description: >-
把一道解析几何题解成一个自包含的交互教学网页:左栏题面 + 动态控制台(一个
可变参数滑块驱动实时重算的几何量 + 理论范围/定值指示),中栏 KaTeX 分步解析,右栏 2D
Canvas 动态几何画板(椭圆/双曲线/抛物线/圆 + 动直线/动点 + 向量 + 标注 + 画笔涂鸦)。
支持三入口——给定文字题、随机出题、上传题目图片识别后解题。覆盖求标准方程、弦长、向量
数量积范围/定值、三角形面积最值、定点、定值(斜率之积)、轨迹、离心率等题型,统一"设含参
直线 x=my+c + 联立 + 韦达 + 换元/常数分离",并由 sympy 精确计算驱动(答案、坐标、步骤
数值、交互引擎的理论范围同源一致)。其它 agent 也可调用本技能生成此类网页。形态与
edu-solid-geometry 平行,但用 Canvas-2D + KaTeX(非 Three.js)。
触发词:解析几何, 圆锥曲线, 椭圆, 双曲线, 抛物线, 直线与圆锥曲线, 焦点弦, 弦长, 数量积取值范围,
向量数量积, 定点问题, 定值问题, 斜率之积, 三角形面积最值, 轨迹方程, 离心率, 解这道解析几何题,
随机出一道圆锥曲线题, 这张图里的解析几何题; analytic geometry, conic sections, ellipse,
hyperbola, parabola, chord length, dot product range, fixed point, fixed value, locus,
eccentricity, interactive analytic geometry solution page.
---
# 解析几何解题 → 交互网页
## 这个技能产出什么
一个可直接用浏览器打开的单页 HTML(三栏):
- **左栏**:题面 + 动态控制台 —— 一个可变参数滑块(如直线倾斜角 θ / 动点参数 t)驱动实时
重算的几何量(交点坐标、斜率、数量积、弦长、面积…),以及"理论范围条"或"定值指示"。
- **中栏**:分步解析(公式用 **KaTeX**),可一键收起把空间让给画板。
- **右栏**:2D Canvas 动态几何画板(圆锥曲线 + 动直线/动点 + 向量 + 点标注 + 网格坐标轴),
叠加画笔涂鸦工具栏。
形态与目标模板 `/Users/wuyi/code/code2026/6/template/code_artifact.html` 一致。
## 依赖(重要)
计算核心 `lib/analytic_kernel.py` 依赖 **sympy**。运行脚本前先确认有能 import sympy 的
解释器:`python3 -c "import sympy"`(本机用 `/opt/homebrew/bin/python3.11`,sympy 1.14)。
**缺库时**:若 import 报错(sympy 或后续任何库),**先询问用户是否安装**,同意后再装
(`python3 -m pip install <库名>`)或换一个已装该库的解释器;**不要未经询问直接装**。
下文 `python3` 均指这个能跑通依赖的解释器。
## 工作流程
### 第 1 步:得到 problem spec(三入口归一)
把题目整理成结构化 spec(曲线类型与参数、已知点/条件、所求类型与对象、语言)。
- **文字题**:直接抽取。
- **图片**:视觉读图抽取,并**把识别到的题目回显给用户确认**(题面/曲线/参数/所求/语言)再继续。
- **随机出题**:选曲线 + 题型,随机参数 → kernel 求解,用 `analytic_kernel.is_clean(...)` 判答案
是否规整,不规整就重抽。
> **输出语言跟随提示词语言**:英文提示 → 英文网页,中文 → 中文。spec 记下 `language`。
### 第 2 步:用 kernel 精确计算(不要心算)
按 `references/conventions.md` 的解法配方,调用 `lib/analytic_kernel.py` 与 `lib/conics.py`:
- `conics.ellipse/hyperbola/parabola/circle(...)` 得曲线对象(精确 a,b,c、焦点、顶点、准线、
渐近线、`eq_latex`、以及给前端引擎的 `board` dict)。
- `chord_setup(conic, through)` 联立含参直线 `x=my+c` 得 y 的二次方程 + 韦达量(精确)。
- 目标量:`dot_product_expr` / `chord_len_sq_expr` / `triangle_area_expr` / `slope_product_central` …
- 取值范围:`range_over_m(expr, horizontal_valid=?)` —— **含开闭端点判定**(关键正确性点,见下)。
- 定值:`is_constant_in_m(expr)`。
可命令行自检 kernel:
```bash
python3 lib/analytic_kernel.py # 旗舰题内置断言自检
```
> ⚠️ **端点开闭 = 正确性命门**:过焦点的弦,水平线(x 轴,θ=0)与竖直线(θ=90)都是合法直线,
> 它们取到的端点要计入。例:椭圆 MA·MB 题,x 轴取到 −3、竖直线取到 7/4,故答案是**闭区间**
> `[-3, 7/4]`(很多教辅误写成开的 `(-3, 7/4]`)。`range_over_m` 已据此判定,且这样答案与交互
> 工具一致——拖滑块到 0° 就读到 −3。抛物线焦点弦的"轴方向"是退化线(只交一点),其极限端点
> 不计入(`horizontal_valid=False` 或限制 param 范围)。
### 第 3 步:组装数据并注入模板
> 📍 **输出位置 & 唯一产物(最重要)**:交付给用户的**只有一个 `.html`**,写到**当前工作目录
> (`Path.cwd()`)**(除非用户显式指定路径)。cwd 里**不要留任何别的文件**——构建脚本(`.py`)、
> `__pycache__`、自检截图(`.png`)、临时文件都**不是交付物**,一律放 `/tmp` 或用完即删。
> 也**绝不要**写进技能自身目录(`skills/edu-analytic-geometry/output/` 是技能内部样例)。
把"组装数据 + 注入模板"的**构建脚本写到临时目录**(如 `/tmp/ag_build.py`),让它**只把 `.html`
写到 cwd**;脚本拼出 `lesson` / `steps` / `board` 数据(schema 见 `references/problem-schema.md`),
调用 `generate.render_html(data, out)` 注入 `template/board.html`,**跑完即删脚本**:
```python
# 构建脚本放 /tmp(不要放 cwd):/tmp/ag_build.py
import sys; sys.dont_write_bytecode = True # 不生成 __pycache__
sys.path.insert(0, "<技能目录>/scripts")
import generate
from pathlib import Path
data = {"lesson": {...}, "steps": [...], "board": {...}}
out = Path.cwd() / "solution-<题目简述>.html" # 唯一产物,落在用户当前目录
generate.render_html(data, out)
```
```bash
python3 -B /tmp/ag_build.py && rm -f /tmp/ag_build.py # -B 不写字节码;跑完删临时脚本,cwd 只剩 .html
```
- `steps[*].content` 里的数值**直接引用 kernel 结果**(用 `K.tex(...)` 输出 LaTeX),模型只负责
组织讲解文字(按目标语言)。
- `board` 用 kernel 给的曲线 `board` dict、精确点坐标、`param`、`derived` 构造序列、`readouts`、
`rangeBar`(范围题)/ `constant`(定值题)/ `answerBand`(**形状参数题**,如离心率范围)。
- **形状参数题(滑块=离心率 e 等)**:自然动态量是曲线本身的形状而非动直线/动点时,让滑块=该参数,
把曲线 `a/b/c`、焦点、动点坐标写成 `@param` 的**表达式字符串**(引擎每帧重绘曲线/焦点/渐近线),
配 `status` 读数显示不等式状态、`answerBand` 在参数轴高亮答案区间。见 conventions「形状参数题」。
- **可直接照抄的范本**:`scripts/generate.py` 里 6 个 `build_*` 覆盖各类交互范式:
`ellipse_dot_range`(范围条)、`ellipse_chord_range`、`ellipse_area_max`、
`ellipse_slopeprod_const`(定值·中心对称)、`parabola_dot_const`(定值·抛物线)、
`hyperbola_ecc_range`(**形状参数**:滑块=e,曲线随之重绘 + `status` + `answerBand`)。
已注册题直接出(`-B` 不写字节码;不传路径默认写技能 output,交付给用户时务必改成 cwd 下的 `.html`):
```bash
python3 -B scripts/generate.py list # 列出题型
python3 -B scripts/generate.py ellipse_dot_range ./sol.html
python3 -B scripts/generate.py all ./out_dir # 全部题型
```
### 第 4 步:自检(正确性方案)
- kernel 答案 == 答案卡 `lesson.answer` == 末步骤展示值 == **JS 标准位/扫段重算值**,四者一致
(`build_*` 内已加 `assert`)。
- `rangeBar` 端点来自 kernel 的 `range_over_m`;`constant` 值来自 kernel 的定值。
- 起本地静态服务(服务**输出文件所在目录**,即 cwd)用预览检查:无控制台报错、KaTeX 正常、
滑块实时重算正确、范围条/定值/定点/轨迹行为符合、画笔与收起面板可用。
(技能仓库内开发时可用 `.claude/launch.json` 的 `ag-preview`,端口 4601;别处运行就对 cwd 起
一个临时静态服务。)
- **自检截图只给你自己看**:preview 工具直接返回图像,**不要把 `.png` 存到 cwd**;本地静态服务只读不写、
不产生文件。自检产生的任何临时文件(构建脚本 `.py`、截图 `.png`、`__pycache__` 等)交付前一律清掉。
> ⚠️ **必须关闭你开过的端口/服务**:预览一结束立即停掉,**绝不留占用端口的进程**。
> - preview 工具开的:`preview_stop`(传 serverId)。
> - 直接起的 `http.server`:用完 `kill`,或 `lsof -nP -iTCP:<port> -sTCP:LISTEN` 确认已释放。
> - 交付前确认端口已释放再告诉用户。开了不关 = 未完成自检。
### 第 5 步:交付
成品写在**用户当前工作目录(cwd)**,命名形如 `solution-<题目简述>.html`,把路径告诉用户,
可直接浏览器打开。交付前确认:**(1)** 成品在 cwd、不在技能目录;**(2)** 没有遗留本次预览
开启的本地服务/端口;**(3)** cwd 里**只新增了这一个 `.html`**——没有 `.py` / `.png` /
`__pycache__` / 临时文件(用 `git status` 或 `ls` 核一眼,有就删掉)。
## 扩展
- **加题型**:在 `analytic_kernel.py` 加目标量函数(写成 m 的表达式)+ 复用 `range_over_m` /
`is_constant_in_m`;在 `generate.py` 加一个 `build_*`,选定交互范式(范围条 / 定值 / 定点 /
轨迹 trace / 形状参数 answerBand)。见 `references/conventions.md` 配方表。
- **加曲线**:`conics.py` 已有椭圆/双曲线/抛物线/圆;前端 `board.html` 引擎已支持四类渲染、
渐近线、准线方向。新曲线在两处各加一份即可。
- **加交互构造**:`board.html` 的 `buildScene` switch 是构造库(`line_through_angle`、
`intersect_line_conic`、`point_on_conic`、`point_reflect`、`tangent_at`、`foot_perp`…),
按需扩充并在 schema 文档登记。
## 目录
- `template/board.html` — 数据驱动模板(通用 2D 渲染器 + 参数引擎 + 数据岛 `__LESSON_DATA__`)
- `lib/conics.py` — 圆锥曲线 sympy 定义库(特殊点 / LaTeX / board dict)
- `lib/analytic_kernel.py` — sympy 精确求解核心(联立·韦达·范围·定值)
- `scripts/generate.py` — 注入模板 + 5 个 build_* 范本 + 批量/单题出题
- `references/problem-schema.md` — 数据格式(board 引擎 schema)
- `references/conventions.md` — 标准式、解法配方表、韦达/换元套路、端点开闭、自检
Creator's repository · wy51ai/edulab