1. 项目概述
在数学教学中,三角函数的概念往往是学生最难理解的部分之一。传统的静态图示很难直观展示单位圆与三角函数之间的动态关系。这个基于HarmonyOS的应用实例,通过ARKTS开发了一个动态演示工具,将单位圆上点的旋转运动与正弦曲线的生成过程实时关联起来。
我在实际教学中发现,当学生能够亲眼看到单位圆上点的y坐标如何"展开"成正弦曲线时,他们对三角函数的理解会有一个质的飞跃。这个演示工具左侧展示标准单位圆,右侧绘制正弦波,通过动画形式展示两者之间的映射关系。
2. 核心功能解析
2.1 可视化设计原理
这个演示工具的核心在于建立单位圆与正弦函数之间的几何对应关系:
单位圆部分:以坐标系原点为中心,绘制半径为1的单位圆。圆周上有一个可移动的点P,其坐标可以表示为(cosθ, sinθ),其中θ是OP与x轴正方向的夹角。
正弦波部分:在右侧坐标系中,横轴表示角度θ(通常以弧度为单位),纵轴表示sinθ的值。随着点P在单位圆上移动,将其y坐标实时映射到右侧坐标系中,形成正弦曲线。
关键点:这个映射关系的本质是将圆周运动"展开"成波形图,让学生直观理解为什么正弦函数会有周期性的波动特征。
2.2 交互功能实现
2.2.1 动态旋转控制
通过滑块控件实现角度θ的精确控制:
// ARKTS示例代码:角度滑块控制 @State angle: number = 0 // 当前角度(弧度) Slider({ value: this.angle, min: 0, max: 2 * Math.PI, // 0到2π弧度 step: 0.01, style: SliderStyle.OutSet }) .onChange((value: number) => { this.angle = value this.updatePointPosition() // 更新点P位置 })2.2.2 视觉元素同步更新
单位圆部分:
- 点P的位置实时更新
- 从点P到x轴的垂直线(正弦线)动态绘制
- 当前角度θ的标注
正弦波部分:
- 已生成的正弦曲线
- 当前θ对应的曲线点高亮显示
- 从曲线点到x轴的参考线
3. 技术实现细节
3.1 图形绘制方案
3.1.1 单位圆绘制
使用ARKTS的Canvas组件进行绘制:
// 单位圆绘制示例 Canvas(this.context) .width('100%') .height('100%') .onReady(() => { // 绘制坐标系 this.drawAxes() // 绘制单位圆 this.context.beginPath() this.context.arc(centerX, centerY, radius, 0, 2 * Math.PI) this.context.stroke() })3.1.2 动态连线实现
点P与正弦曲线的动态连线需要精确计算坐标:
// 动态连线示例 updatePointPosition() { // 计算点P坐标 const px = centerX + radius * Math.cos(this.angle) const py = centerY - radius * Math.sin(this.angle) // 注意y轴向下 // 绘制正弦线 this.context.beginPath() this.context.moveTo(px, py) this.context.lineTo(px, centerY) this.context.strokeStyle = '#ff0000' this.context.stroke() // 更新正弦曲线点 this.updateSineWavePoint() }3.2 性能优化技巧
- 局部重绘:只重绘变化的元素(如点P、连线),而不是整个画布
- 防抖处理:对滑块事件进行防抖,避免过于频繁的重绘
- 对象复用:重复使用的图形对象(如坐标轴)只绘制一次
4. 教学应用场景
4.1 关键概念演示
这个工具特别适合演示以下概念:
- 周期性与振幅:展示2π的周期性和振幅为1的特性
- 相位变化:通过调整起始角度演示相位移动
- 余弦函数:修改映射关系为x坐标即可演示余弦曲线
4.2 课堂互动设计
建议的教学流程:
- 先让学生观察静态的单位圆和正弦曲线
- 缓慢移动滑块,观察点P运动与曲线生成的关系
- 重点观察关键点(0, π/2, π, 3π/2, 2π)的对应关系
- 引导学生思考为什么曲线会有这样的形状
5. 扩展功能建议
5.1 多函数对比
可以扩展为同时显示正弦、余弦、正切等函数的对比演示:
// 多函数演示数据结构示例 interface TrigFunction { name: string color: string calculate: (angle: number) => number } const functions: TrigFunction[] = [ { name: 'sin', color: 'red', calculate: Math.sin }, { name: 'cos', color: 'blue', calculate: Math.cos } ]5.2 参数调节功能
增加振幅、频率、相位等参数的调节控件,演示函数y=Asin(ωx+φ)中各参数的影响。
6. 常见问题与解决
6.1 坐标系统转换
常见问题:屏幕坐标系y轴向下与数学坐标系y轴向上不一致
解决方案:
// 坐标转换示例 function toScreenY(mathY: number): number { return centerY - mathY * scaleFactor }6.2 动画流畅度
问题:在低端设备上动画可能卡顿
优化方案:
- 降低帧率
- 减少不必要的图形元素
- 使用硬件加速
6.3 精度问题
问题:浮点数计算可能导致图形位置不精确
解决方法:
- 使用toFixed()限制小数位数
- 添加适当的容错范围
7. 开发心得
在实际开发过程中,有几个关键点值得注意:
比例协调:单位圆区域和正弦波区域的尺寸比例要恰当,建议宽度比为1:2
视觉引导:使用不同颜色区分各个元素(如正弦线用红色,余弦线用蓝色)
交互反馈:当用户操作滑块时,可以添加轻微的动画效果增强体验
教学注释:在适当位置添加文字说明,解释当前演示的数学概念
这个项目最让我满意的部分是看到学生使用时那种"恍然大悟"的表情。当抽象的数学概念变得可视化和可交互时,学习效果确实会有显著提升。