AI 协作日志

学生 Web 实验作品平台

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

# 实验三 AI协作记录(请学生在实际完成实验后填写)

> 教师参考代码包不包含虚构的AI协作过程。学生提交时需填写真实工具、提示词、独立测试与结论。

## AI 协作 1:矩阵和变换次序

- 我自己的预测:
我一开始认为矩阵变换的执行顺序和代码书写顺序一致,写`T(cx,cy)*R`代表先做平移再做旋转;对于公转,我直接写`T*R`,认为图形会绕世界原点转圈,自转用`R*T`。
- AI 工具与原始提示词:

> 
> 原始提问:Task‑B 旋转 pivot=world 和 self,矩阵乘法顺序,列向量,T 与 R 相乘。

- AI 的建议:
本项目使用**列向量**规则:矩阵表达式中**靠右侧的矩阵先执行变换**。

1. 自转(绕物体自身中心):先旋转、再平移,表达式:`T(c) * R`;
2. 公转(绕世界原点):先平移到目标位置,再旋转,表达式:`R * T(c)`;
矩阵乘法不满足交换律,调换两个矩阵顺序得到完全不同效果。

- 本人计算、运行与证据:
我在 task‑b 页面做测试:把`bCenterX`调到 0.5,`bCenterY`调到 0.25。

1. `pivot=self`使用`multiply(transMat, rotMat)`,图形在自身位置原地旋转;
2. `pivot=world`使用`multiply(rotMat, transMat)`,图形绕画布原点做大圈公转;
如果把两者顺序写反,world/self 现象会颠倒。矩阵自测表格`probe()`全部✓,验证 S、R、T 矩阵实现正确。

- 采纳或修正结论:
采纳 AI 给出的列向量变换次序规则;修正我最初对矩阵执行顺序的错误直觉。`world`公转用`R*T`,`self`自转用`T*R`。

## AI 协作 2:实际故障排查

- 错误现象与重现步骤:
现象:Task‑C 打开 task‑c.html 画布整体黑屏,UI 面板显示对象数量为 4,但是看不到任何图形,F12 控制台报`X is not defined`。
重现:打开 task‑c.html,等待页面加载完成,画布背景正常,但没有任何物体渲染。
- 我先检查了什么:

1. 确认 objects 数组不为空,对象全部创建成功;
2. 检查 TAU 常量是否定义,检查 transforms.js 末尾导出列表;
3. 怀疑是 tick 函数 dt 计算错误。

- AI 工具与原始提示词:

> 
> 原始提问:task‑c 画布黑色,对象存在但是不显示,transforms.js 代码。

- AI 建议的候选原因与测试:

1. 候选 1:transforms.js 内部 modelFor 函数错误使用`shtur`;`X`只是 app.js 里面的别名,transforms.js 闭包内部没有`X`变量,会抛出引用错误。
2. 候选 2:TAU、triangle01 忘记导出;
3. 候选 3:tick 中 dt 始终为 0,动画矩阵为固定值。
测试:F12 控制台看到`ReferenceError: X is not defined`,定位到`modelFor`函数内部代码。

- 实测结果、修复与复测:
修复:把`modelFor`函数内部所有`X.deg2rad`、`X.triangle01`全部去掉`X.`前缀,直接调用本地函数`deg2rad()`、`triangle01()`、`multiply()`。
复测:Ctrl+F5 刷新 task‑c.html,圆周期缩放、三角形往复平移、正方形公转、四面体自转全部正常;暂停后继续不会跳变,motion‑debug 调试数值正常更新。

## AI 协作 3:设计方案比较

- 我考虑的两种实现:

> 
> 场景:Task‑D,点击画布创建物体,保存对象运动参数。
> 方案 A:点击创建对象时,直接保存 DOM 控件对象,运行时实时读取页面上 direction、amplitude 等 DOM 取值。
> 方案 B:点击创建瞬间读取控件数值,生成一份参数快照保存到对象,之后不再读取 DOM,后续修改 UI 不会改变已经生成的旧对象。

- AI 工具与原始提示词:

> 
> 原始提问:Task‑D selectOptions,为什么不能直接保存 DOM,参数快照怎么写。

- 对比、取舍与原因:
方案 A 缺陷:DOM 是页面控件引用,所有对象共用一套 UI;只要拖动滑块,**全部已经创建的旧对象行为立刻跟着变化**,不符合实验要求 “新建对象使用点击时刻参数,旧对象不受后续 UI 改动影响”。
方案 B 优点:创建对象那一刻把数值复制一份存入对象属性;每个对象拥有独立的 directionDeg、amplitude、speed;UI 改动只影响下一次点击新建的对象,满足题目 “参数快照” 需求。
- 实际实现及核验:
实际采用方案 B,在`selectOptions()`内部使用`num()`读取各个控件的数值,返回普通 JS 对象字面量,传入`createObject()`。
核验测试:

1. 先选择 X 方向,点击画布生成若干三角形;
2. 再把方向改为 Y,**旧三角形仍然沿 X 运动,新点击生成的三角形沿 Y 运动**;
现象符合实验预期,D 任务完成。