AI 协作日志

学生 Web 实验作品平台

学号:202412211401013 · 来源:ai-log.md

# 实验二 AI协作记录

## AI协作1 · Koch算法
### 我的目标与初步判断
目标:不照搬教材现成代码,独立实现 Koch 雪花——线段三等分、向外等边三角形顶点、递归、闭合绘制。
初步判断:①每条线段替换为 A→P→R→Q→B 四段,线段数随层数 ×4,即 3×4ⁿ;②外凸顶点需用旋转 ±60° 求得;③“向外”方向与初始三角形绕行顺序有关,当时不确定取正负,决定先用水平线段测试确认。

### 关键提示词(原文)
- “如何计算线段三等分点 P、Q,以及向外的等边三角形顶点 R?”
- “旋转 ±60° 怎么确定让凸起朝外?与三角形绕行方向的关系?”
- “递归终止条件怎么写?为什么 Koch 第 n 层是 3×4ⁿ 条线段?”
- “闭合边界用什么图元绘制,顶点怎么组织?”

### AI关键建议摘要
- 三等分点:P = a + (b−a)/3,Q = a + 2(b−a)/3。
- 外凸顶点:R = P + 旋转(Q−P, ±60°);符号由绕行方向决定(我的三角形逆时针排列,采用右转 60°,即 −60°)。
- 递归:level 0 输出当前线段端点终止;否则对 A→P、P→R、R→Q、Q→B 四段递归。
- 绘制:gl.LINE_LOOP,GPU 自动连接末点到首点保证闭合;顶点数 = 3×4ⁿ。

### 我的测试方法与结果
先输出 Level 0 三角形核对三边首尾;再用水平线段确认右转 60° 使凸起朝外;扩展 Level 1—4 对照线段数:
| Level | 应有 | 实际(实测) |
|---:|---:|---:|
| 0 | 3 | 3 |
| 1 | 12 | 12 |
| 2 | 48 | 48 |
| 3 | 192 | 192 |
| 4 | 768 | 768 |
结果:凸起均朝外,各层线段数与预期一致,Level 0–4 未裁切。

### 采纳情况及修正结论
采纳 AI 的三等分与旋转公式、递归终止条件和 LINE_LOOP 方案。旋转方向经水平线段测试确认:逆时针初始三角形 + 右转 60° 正确,取反会向内凹。实现位于 `task-b.js` 的 `subdivideSegment()`,在 C、E 中复用。

## AI协作2 · 绘图板调试
### 具体错误现象(一次成功,故人为注入并恢复)
按实验要求人为注入错误:临时把 `yNDC = 1 − 2*yCanvas/height` 改成 `2*yCanvas/height − 1`(去掉 Y 翻转)。点击画布右上角,点却出现在右下角,上下颠倒(已截图)。

### 我的初步排查
怀疑是坐标转换的 Y 方向处理,先核对 getBoundingClientRect、Canvas 像素换算、NDC 三段,判断问题最可能出在 Y 翻转那一步。

### 关键提示词(原文)
- “点击位置在 Y 轴方向上下颠倒,可能是什么原因?”
- “clientX/Y 到 NDC 的转换哪一步容易出错?怎么逐段验证?”

### AI建议与逐项测试
AI 建议把 clientX/Y → Canvas 像素 → NDC 拆开逐段核对、重点查 Y 翻转,并逐项测试:
1. 四角附近建点核对位置——注入错误后四角上下颠倒;
2. 恢复 `1 − 2y/height` 后四角位置正确;
3. 调整窗口大小后再点中心,仍准确;
4. 点、线段、矩形共存不消失;
5. 第一次点线段后切换为矩形再点击,状态正确重置;
6. “清空”后旧图形不再出现。

### 最终原因与修复证据
根因:Canvas 坐标原点在左上、Y 向下,而 WebGL NDC 原点在中心、Y 向上,必须做 `yNDC = 1 − 2*yCanvas/height` 翻转,去掉即上下颠倒。已恢复正确实现(`task-d.js` 的 `pointerToNDC()`),全部测试通过。

## AI协作3 · 主题整合
### 主题及预期效果
主题:生长。预期:Koch 雪花边界向外扩展,放射线与节点象征枝条由中心向外生长,配合旋转动画体现持续生长;点击画布可移动图案中心,滑块控制展开尺度。

### 两个方案的对比(本实验实际做的比较)
对“生长”给出两种用基本 WebGL 图元表达的方式并比较:
- 方案A(采用):Koch 雪花边界(LINE_LOOP)+ uniform 旋转动画;新增圆环(LINE_LOOP)、放射线(LINES)、节点(POINTS);点击改中心。
- 方案B(未采用):改用动态轨迹线 + 节拍式缩放表达生长,需每帧重新生成大量顶点。

### 方案比较、取舍理由
A 图元 3 种、复用 B/C/D 能力、实现清晰可解释;B 视觉虽丰富但顶点开销大、实现复杂、难讲清。评分重抽象与可解释性,故选 A。

### 实际实现、测试与结果
实现 Koch + 外环/内环 + 放射线 + 节点;验证点击画布移动图案中心、展开尺度滑块、开始/暂停旋转均生效,状态栏显示主题与线段数。已保存初始状态与一次交互后的对比截图。实现位于 `task-e.js`,主题词与设计说明已同步改为“生长”。

## 其他AI使用(若有)
- Task A:AI 帮助补全层次读取/夹取、颜色转换、事件绑定与重置,并修正重复声明 `const level`、重复 `setupDraw`、嵌套 reset 事件等错误。
- Task C:AI 说明用 uniform 逐帧更新 `uTheta`、几何 Buffer 只上传一次、单个 requestAnimationFrame 循环,并实现速度/反向/暂停/复位。
- Challenge(Task D 扩展):AI 提供对象选中(几何命中 hitTest/distToSegment)、选中改色、撤销的实现与验收步骤。
工具:豆包(Doubao)。