edu-analytic-geometry

>-

Skill file

Preview skill file
---
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` — 标准式、解法配方表、韦达/换元套路、端点开闭、自检

Source

Creator's repository · wy51ai/edulab

View on GitHub

Security

Security checks in progress
Results will appear here once audits complete
What this skill can do
Reads your filesConnects to the internetRuns code on your machine
Checked by 3 independent security firms
Does it try to trick the AI?Not yet checkedPending · Gen Agent Trust Hub
Does it sneak in hidden code?Not yet checkedPending · Socket
Does it have known bugs?Not yet checkedPending · Snyk