【OpenHarmony/HarmonyOs 】数学曲线画板实战:圆、椭圆、双曲线、抛物线的参数化绘制
【OpenHarmony/HarmonyOs 】数学曲线画板实战圆、椭圆、双曲线、抛物线的参数化绘制项目类型OpenHarmony / HarmonyOS ArkTS 数学学习应用项目名称数学视界对应主题悬浮导航栏、沉浸光感、全新视觉与交互体验等关键词ArkTS、Canvas、解析几何、参数化绘制、数学画板、端侧计算 一、为什么这篇不写普通 Canvas而写“数学曲线画板”之前很多 OpenHarmony 文章会写 Canvas 画线、画圆、画动画但数学学习 App 里更有价值的是把抽象公式变成可交互、可观察、可收藏的学习对象。在“数学视界”项目中CanvasBoard.ets不只是一个涂鸦板它更像一个解析几何实验台⭕ 圆支持圆心、半径、方程、半径线 双曲线支持横向/纵向、渐近线、顶点、焦点⬭ 椭圆支持长短轴、中心、顶点 抛物线支持顶点、方向、参数 函数支持表达式采样绘制 坐标系支持网格、坐标轴、标签、平移。所以这篇文章重点不是“Canvas 怎么画圆”而是讲如何把数学模型参数化然后再映射到屏幕坐标中绘制出来。二、整体状态设计画板先保存数学对象画板页里维护了两类核心数据Stateshapes: DrawShape[] []StatefunctionGraphs: FuncGraph[] []StatemodelList: MathModel[] []StategraphRange: DrawGraphRange { xMin: -10, xMax: 10, yMin: -10, yMax: 10 }这里的关键是画板不是直接保存像素点而是保存数学对象。shapes保存用户手绘的线段、点functionGraphs保存函数表达式modelList保存圆、椭圆、双曲线、抛物线等参数模型graphRange保存当前坐标视野。这样做有一个非常大的好处当用户缩放、平移、切换深色模式时不需要重新生成业务数据只需要根据当前坐标范围重新绘制。三、坐标转换数学坐标和屏幕坐标的桥梁Canvas 绘制使用的是屏幕坐标左上角是(0, 0)向右为 x 正方向向下为 y 正方向。数学坐标系通常以中心为原点向上为 y 正方向。所以画板必须先做坐标转换mathToCanvas(mathX: number, mathY: number): DrawPoint {if(this.canvasWidth 0)return{ x:0, y:0}constx: number ((mathX -this.graphRange.xMin) / (this.graphRange.xMax -this.graphRange.xMin)) *this.canvasWidthconsty: number ((this.graphRange.yMax - mathY) / (this.graphRange.yMax -this.graphRange.yMin)) *this.canvasHeightreturn{ x, y } }反向转换则用于触摸操作canvasToMath(canvasX: number, canvasY: number): DrawPoint {constmathX: number (canvasX /this.canvasWidth) * (this.graphRange.xMax -this.graphRange.xMin) this.graphRange.xMinconstmathY: number this.graphRange.yMax - (canvasY /this.canvasHeight) * (this.graphRange.yMax -this.graphRange.yMin)return{ x: mathX, y: mathY } }这两个函数是整个数学画板的基础。只要坐标转换准确后续的圆、椭圆、双曲线、函数图像都可以稳定绘制。四、添加数学模型从参数面板到 modelList项目中通过selectedTool判断当前添加哪类模型private modelTools: DrawTool[] [ { id:circle, label:圆, icon:⭕}, { id:hyperbola, label:双曲线, icon:}, { id:ellipse, label:椭圆, icon:⬭}, { id:parabola, label:抛物线, icon:}, { id:function, label:函数, icon:}, ]当用户点击“添加模型”时会把当前参数固化为一个MathModelif(this.selectedTool circle) {constmodel: MathModel { id:this.newId(), type:circle, modelType:horizontal, h:this.circle_h, k:this.circle_k, r:this.circle_r, a:0, b:0, color:this.circleColor, strokeWidth:this.strokeWidth, filled:this.isFilled, dashed:this.isDashed, showEquation:this.circleShowEq, showCenter:this.circleShowCenter, showRadius:this.circleShowRadius, showVertices:false, showAsymptotes:false, showFoci:false, }this.modelList.push(model) }圆需要的核心参数是h圆心 x 坐标k圆心 y 坐标r半径showEquation是否显示方程showCenter是否显示圆心showRadius是否显示半径线。这比直接在 Canvas 上画一次圆更灵活因为模型对象可以删除、重绘、收藏、分享。五、圆的绘制标准方程可视化圆的标准方程是(x - h)^2 (y - k)^2 r^2代码中先把圆心和半径转换成 Canvas 坐标drawCircleModel(ctx: CanvasRenderingContext2D, model: MathModel): void {const c: DrawPoint this.mathToCanvas(model.h, model.k) const rPx: number Math.abs(this.mathToCanvas(model.h model.r, model.k).x- c.x) ctx.strokeStyle model.colorctx.fillStyle model.colorctx.lineWidth model.strokeWidthctx.beginPath() ctx.arc(c.x, c.y, rPx, 0, Math.PI* 2) ctx.stroke() }这里的rPx很有意思它不是直接把数学半径当像素而是通过mathToCanvas(model.h model.r, model.k)计算出半径对应的屏幕长度。这样当坐标范围变化时圆会自动缩放。如果用户开启显示圆心if(model.showCenter){ctx.beginPath()ctx.arc(c.x, c.y,4,0, Math.PI *2)ctx.fill()}如果开启显示半径if(model.showRadius) { const re: DrawPoint this.mathToCanvas(model.hmodel.r,model.k)ctx.setLineDash([4, 2])ctx.beginPath()ctx.moveTo(c.x,c.y)ctx.lineTo(re.x,re.y)ctx.stroke()ctx.setLineDash([])}这种设计对学生很友好不仅看到圆还能看到圆心、半径、方程之间的关系。六、方程显示让图像和公式互相对应圆的方程由buildCircleEq()生成buildCircleEq(h:number, k:number, r:number):string{leteq:stringif(Math.abs(h) 0.01)eqx²elseeq (x${h 0?-:}${Math.abs(h).toFixed(1)})²eq if(Math.abs(k) 0.01)eqy²elseeq (y${k 0?-:}${Math.abs(k).toFixed(1)})²eq r.toFixed(2) ²returneq}这段代码看似只是字符串拼接但对学习体验很重要。学生调整圆心和半径后可以马上看到方程变化圆心在原点x² y² r²圆心右移(x-h)² y² r²圆心上移x² (y-k)² r²这就是数学画板比静态公式表更有价值的地方。七、双曲线、椭圆、抛物线统一模型不同绘制添加双曲线时参数是h、k、a、b、modelTypeconstmodel: MathModel { id:this.newId(), type:hyperbola, modelType:this.hyperbolaType, h:this.hyperbola_h, k:this.hyperbola_k, r:0, a:this.hyperbola_a, b:this.hyperbola_b, color:this.hyperbolaColor, strokeWidth:this.strokeWidth, filled:false, dashed:this.isDashed, showEquation:this.hyperbolaShowEq, showCenter:true, showVertices:this.hyperbolaShowVertices, showAsymptotes:this.hyperbolaShowAsymptotes, showFoci:this.hyperbolaShowFoci, }模型结构保持统一绘制时通过type分发drawModel(ctx: CanvasRenderingContext2D, model: MathModel): void { switch (model.type) { casecircle:this.drawCircleModel(ctx, model)breakcasehyperbola:this.drawHyperbolaModel(ctx, model)breakcaseellipse:this.drawEllipseModel(ctx, model)breakcaseparabola:this.drawParabolaModel(ctx, model)break} }这种“统一模型 分类绘制”的结构很适合继续扩展比如后续增加直线抛物线标准式切换极坐标曲线参数方程圆锥曲线综合模式。八、触摸交互画板不是静态展示画板也支持触摸绘制、选中、平移、橡皮擦。触摸事件会先转成数学坐标consttouch: TouchObject event.touches[0]constcanvasX: number touch.xconstcanvasY: number touch.yconstmathPt: DrawPoint this.canvasToMath(canvasX, canvasY)this.cursorPos { x: canvasX, y: canvasY, mathX: mathPt.x, mathY: mathPt.y }如果当前工具是平移constdx: number (canvasX -this.lastPanPos.x) /this.canvasWidth * (this.graphRange.xMax -this.graphRange.xMin)this.graphRange.xMin - dxthis.graphRange.xMax - dx这样平移改变的是坐标视野而不是移动像素图层。这一点非常重要因为数学画板应该始终以坐标系为中心而不是以屏幕截图为中心。九、学习数据联动画图也算学习行为当用户添加模型或完成绘制时项目会记录学习行为AppState.recordDrawing()this.redraw()这让画板和首页学习进度、成就系统产生连接。用户不是孤立地画一个图而是在完成一次“数学探究”。十、总结这篇文章对应的是“全新视觉与交互体验”主题但它不是泛泛写 UI而是聚焦数学项目特有的解析几何画板。核心实现可以总结为 用MathModel保存圆、椭圆、双曲线、抛物线参数 用mathToCanvas()和canvasToMath()打通数学坐标和屏幕坐标⭕ 用参数化方式绘制圆并显示圆心、半径、方程 用统一drawModel()分发不同曲线绘制 用触摸事件支持平移、绘制、删除 用AppState.recordDrawing()接入学习统计。数学类应用最吸引人的地方不是把公式堆在页面上而是让公式真正动起来、画出来、被操作。这个画板就是数学视界里最有辨识度的功能之一。

相关新闻

130页PPT普华永道医疗集团案例,从悬浮到扎根:集团管控组织优化的四步闭环体系

130页PPT普华永道医疗集团案例,从悬浮到扎根:集团管控组织优化的四步闭环体系

在集团型企业规模扩张与多元化发展的进程中,组织管控始终是最棘手的难题之一。许多集团虽制定了宏大的战略规划,却在向下传导时迅速悬空——总部战略意图无法有效转化为子公司的经营行为,各业务板块各自为政,集团资源难以整合。执…

2026/7/5 1:06:27阅读更多 →
从数据手册到PCB:DC-DC芯片SCT2464Q的5步电源设计实战

从数据手册到PCB:DC-DC芯片SCT2464Q的5步电源设计实战

从数据手册到PCB:DC-DC芯片SCT2464Q的5步电源设计实战在硬件工程师的日常工作中,电源设计是最基础也是最具挑战性的任务之一。一款优秀的电源设计不仅需要满足系统供电需求,还要兼顾效率、稳定性和成本。本文将围绕SCT2464Q这款DC-DC降压芯片…

2026/7/5 1:06:27阅读更多 →
完整高精度工程代码:Artix7 + AD4134 + 64bit NCO + CORDIC arctan2 IQ-DPLL(0.02S 计量级)

完整高精度工程代码:Artix7 + AD4134 + 64bit NCO + CORDIC arctan2 IQ-DPLL(0.02S 计量级)

目录 工程组成 1、AD4134 采集优化模块 ad4134_spi_capture_opt.v 2、Ultra 高精度 IQ-DPLL dpll_50hz_iq_ultra.v 3、顶层整合模块 top_ultra_dpll_ad4134.v 4、4096 点正弦 / 余弦 coe 文件(节选,完整 4096 长度) sin_4096_16bit.coe…

2026/7/5 1:06:27阅读更多 →
生成式 UI Schema:先约束状态,再生成页面

生成式 UI Schema:先约束状态,再生成页面

生成式 UI Schema:先约束状态,再生成页面 一、没有 Schema 的生成很容易散 生成式 UI 如果只给模型一段自然语言需求,它可能生成看起来不错的页面,但状态、事件、字段和权限都不稳定。页面一多,组件协议就会混乱&#…

2026/7/5 2:21:31阅读更多 →
Kafka 消费者再均衡:别让扩容变成抖动源

Kafka 消费者再均衡:别让扩容变成抖动源

Kafka 消费者再均衡:别让扩容变成抖动源 一、再均衡是常见稳定性问题 Kafka 消费组在成员加入、退出、超时或分区变化时会触发再均衡。再均衡本身是正常机制,但在高频扩缩容、消费者处理过慢、心跳配置不合理的情况下,它会变成吞吐抖动和延迟…

2026/7/5 2:21:31阅读更多 →
Stduio Pro 8最新版VR/R2R下载一键安装完整版StduioPro 8下载安装教程支持Win/Mac Stduio Pro 8.1.0 双系统安装最新版下载Stduio one 8

Stduio Pro 8最新版VR/R2R下载一键安装完整版StduioPro 8下载安装教程支持Win/Mac Stduio Pro 8.1.0 双系统安装最新版下载Stduio one 8

Win/Mac Stduio Pro 8/7/6 最新中文完整版​ Stduio one 8/7/6 下载链接:Win系统 https://www.dygdu.com/soft/one.htmlMac 系统 https://www.dygdu.com/soft/mone.html“Studio Pro 8”是一个相对宽泛的名称,可能对应不同领域的软件产品,但…

2026/7/5 2:21:31阅读更多 →
C 语言 enum 的用法

C 语言 enum 的用法

一、enum 是什么enum 是枚举类型,用来定义一组有限、固定、具名字的整型常量。本质:枚举成员都是 int 常量,只是用文字替代数字,可读性远优于纯数字。语法基础:enum 枚举名 {枚举常量1,枚举常量2,枚举常量3 };二、基础…

2026/7/5 2:21:31阅读更多 →
全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

摘要 核心结论:在2026年邳州家具消费市场中,大博金沙发厂在全屋配套场景下的综合性价比(三室两厅配齐全屋家具总价约1.6万-2万元,较品牌专卖店低40%-60%)和交付效率(成品现货当天提货)上显著优…

2026/7/5 2:21:31阅读更多 →
终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛

终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛

终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)",是一个在线工具,它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》…

2026/7/5 2:16:31阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →