news 2026/8/25 23:55:23

鸿蒙 ArkTS 实战|二元一次方程组应用:两直线交点求解 + 三种解的可视化判定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙 ArkTS 实战|二元一次方程组应用:两直线交点求解 + 三种解的可视化判定


一、设计思路

二元一次方程组的几何意义就是两条直线的交点。本页做成"直线可视化求解器":输入两条直线 y = k₁x + b₁、y = k₂x + b₂,代码算出交点坐标,Canvas 同时画出两条直线并标记交点;斜率截距不同的组合,自动给出唯一解 / 无解 / 无穷多解三种结论,让"解的数量"变成看得见的几何关系。

二、状态与求解逻辑(含三种解判定)

import{router}from'@kit.ArkUI';interfacePixel{px:number;py:number;}@Entry@Componentstruct BinaryEquation{@Statek1:number=1;// 直线1 斜率@Stateb1:number=0;// 直线1 截距@Statek2:number=-1;// 直线2 斜率@Stateb2:number=4;// 直线2 截距@StatesolutionState:string='唯一解';@Statesolution:string='x = 2.00, y = 2.00';privatesettings:RenderingContextSettings=newRenderingContextSettings(true);privatectx:CanvasRenderingContext2D=newCanvasRenderingContext2D(this.settings);// 解方程组:两式相减消 y,得 (k1 - k2)x = b2 - b1privatesolve():void{constd=this.k1-this.k2;if(Math.abs(d)<0.0001){// k 相等:斜率相同 → 平行或重合if(Math.abs(this.b1-this.b2)<0.0001){this.solutionState='重合 · 无穷多解';this.solution='两条直线完全重合,处处都是解';}else{this.solutionState='平行 · 无解';this.solution='两条直线平行,永不相交';}}else{// k 不等:必然相交,交点即唯一解constx=(this.b2-this.b1)/d;consty=this.k1*x+this.b1;this.solutionState='唯一解';this.solution='x = '+x.toFixed(2)+', y = '+y.toFixed(2);}}privateyOf1(x:number):number{returnthis.k1*x+this.b1;}privateyOf2(x:number):number{returnthis.k2*x+this.b2;}}

三、三种解的判定逻辑表

k₁ 与 k₂b₁ 与 b₂几何关系解的数量
k₁ ≠ k₂任意两条直线相交唯一解(交点坐标)
k₁ = k₂b₁ ≠ b₂平行无解
k₁ = k₂b₁ = b₂完全重合无穷多解

代码用Math.abs(d) < 0.0001做浮点相等判断(而不是===),避免因浮点误差把"相等"误判为"不等"。

四、Canvas 绘制两条直线与交点

// 世界坐标 → 画布像素(画布中心即原点)privatetoPixel(x:number,y:number,w:number,h:number):Pixel{return{px:w/2+(x/this.xRange)*(w/2),py:h/2-(y/this.yRange)*(h/2)};}privatedrawLines():void{constctx=this.ctx;constw=ctx.width;consth=ctx.height;ctx.clearRect(0,0,w,h);// 网格与坐标轴(与一元页同构,略)// 直线1(蓝):取 x = ±6 两端点连线constlp1a=this.toPixel(-this.xRange,this.yOf1(-this.xRange),w,h);constlp1b=this.toPixel(this.xRange,this.yOf1(this.xRange),w,h);ctx.strokeStyle='#4C7DFF';ctx.lineWidth=3;ctx.beginPath();ctx.moveTo(lp1a.px,lp1a.py);ctx.lineTo(lp1b.px,lp1b.py);ctx.stroke();// 直线2(橙):同上constlp2a=this.toPixel(-this.xRange,this.yOf2(-this.xRange),w,h);constlp2b=this.toPixel(this.xRange,this.yOf2(this.xRange),w,h);ctx.strokeStyle='#F59E0B';ctx.lineWidth=3;ctx.beginPath();ctx.moveTo(lp2a.px,lp2a.py);ctx.lineTo(lp2b.px,lp2b.py);ctx.stroke();// 交点:仅唯一解时绘制红色圆点 + 坐标标签constd=this.k1-this.k2;if(Math.abs(d)>=0.0001){constx=(this.b2-this.b1)/d;consty=this.k1*x+this.b1;constip=this.toPixel(x,y,w,h);ctx.beginPath();ctx.arc(ip.px,ip.py,6,0,Math.PI*2);ctx.fillStyle='#EF4444';ctx.fill();ctx.strokeStyle=Color.White;ctx.lineWidth=2;ctx.stroke();ctx.fillStyle='#EF4444';ctx.fillText('('+x.toFixed(1)+', '+y.toFixed(1)+')',ip.px+12,ip.py-10);}}

五、UI 组装(四参数输入 + 解结果卡)

build(){Column(){// 顶部标题栏(略)Scroll(){Column({space:14}){// 方程组公式卡Text('y = k₁x + b₁ / y = k₂x + b₂').fontSize(17).fontWeight(FontWeight.Bold).fontColor('#7C3AED').width('100%').textAlign(TextAlign.Center)// 两直线 + 交点Canvas(this.ctx).width('100%').height(230).onReady(()=>{this.drawLines();})// 解结果卡(自动刷新)Row({space:10}){Text(this.solutionState).fontSize(13).fontColor(Color.White).backgroundColor('#7C3AED').padding({left:10,right:10,top:4,bottom:4}).borderRadius(10)Text(this.solution).fontSize(14).fontWeight(FontWeight.Bold).fontColor('#111827')}.width('100%')// 四参数输入区:改任一参数 → solve() + drawLines()Row({space:10}){Text('k₁ =').fontSize(14).fontColor('#111827')TextInput({text:this.k1.toString()}).width(70).height(36).type(InputType.Number).onChange((v:string)=>{this.k1=Number(v)||0;this.solve();this.drawLines();})Text('b₁ =').fontSize(14).fontColor('#111827')TextInput({text:this.b1.toString()}).width(70).height(36).type(InputType.Number).onChange((v:string)=>{this.b1=Number(v)||0;this.solve();this.drawLines();})Blank()}.width('100%')// k₂、b₂ 输入行同构(略)}.padding(14)}.layoutWeight(1).scrollBar(BarState.Off)}.height('100%').width('100%').backgroundColor('#F4F6FA')}

六、代码要点

  • 消元思想代码化(k1 - k2)x = b2 - b1正是加减消元法的代码形态,x = (b2 - b1) / (k1 - k2)
  • 浮点容差:斜率差用Math.abs(d) < 0.0001判断,而不是直接d === 0,杜绝浮点误差误判。
  • 几何到代数闭环:改参数 →solve()算解 →drawLines()画交点,图形与文字永远一致。
  • 两直线一画:直线1、直线2 分别用蓝、橙双色,交点用红点 + 白描边 + 坐标标签,视觉层次清晰。

七、二元一次方程组核心知识点

要点内容
定义含有两个未知数,且未知数次数都为 1 的两个方程合在一起
几何意义每个方程是一条直线,方程组的解 = 两直线的交点
代入法用一个方程解出 x(或 y),代入另一个方程消元
加减法两式相加减消去一个未知数(系数相等或相反时最方便)
解的情况相交唯一解、平行无解、重合无穷多解
检验把解代入两个方程都成立才是正确解
易错平行 ≠ 重合;消元时注意符号变化
口诀二元方程两条线,交点坐标就是解;k 同 b 异两平行,k 同 b 同无数解
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 23:54:47

144、影像算法DSP/NPU Offloading——降噪/超分/语义分割算子在高通/联发科/海思平台的部署选择

144、影像算法DSP/NPU Offloading——降噪/超分/语义分割算子在高通/联发科/海思平台的部署选择 上个月在调试一台搭载骁龙8 Gen2的旗舰机,客户反馈夜景模式在暗光下预览帧率掉到18fps,而且发热明显。抓了systrace一看,罪魁祸首是自研的时域降噪算子——纯CPU跑,每帧耗时3…

作者头像 李华
网站建设 2026/8/25 23:48:01

Edge浏览器JavaScript脚本开发全攻略:从用户脚本到扩展与自动化

1. 从“脚本”到“开发”&#xff1a;Edge浏览器中JavaScript的定位与价值 如果你在Edge浏览器里用过油猴&#xff08;Tampermonkey&#xff09;或者暴力猴&#xff08;Violentmonkey&#xff09;这类插件&#xff0c;那你对“浏览器脚本”这个概念一定不陌生。点一下&#xf…

作者头像 李华
网站建设 2026/8/25 23:48:00

后端转Agent开发已上岸,我说说怎样学更容易找到工作 !

做了两年Agent开发&#xff0c;我自己就是从传统后端转过来的&#xff0c;实打实跳槽涨了30%。 我真心想说&#xff0c;网上的Agent教程真的太容易误导人了&#xff0c;搞得好像学点提示词、跑个本地Demo就能高薪上岗&#xff0c; 但企业真实落地开发&#xff0c;完全是另一个…

作者头像 李华
网站建设 2026/8/25 23:46:53

Python装饰器深度解析:从函数对象到实战应用

1. 从“为什么需要装饰器”说起&#xff1a;一个函数日志的经典困境如果你写过一段时间的Python&#xff0c;尤其是在开发需要调试或监控的Web服务、数据处理脚本时&#xff0c;大概率遇到过这个场景&#xff1a;你写了一个核心业务函数&#xff0c;比如process_data()&#xf…

作者头像 李华
网站建设 2026/8/25 23:45:18

071、6D位姿估计基础与PPF:点对特征的刚体配准原理

071、6D位姿估计基础与PPF:点对特征的刚体配准原理 调试机器人抓取的时候,最烦的不是模型精度不够,而是你明明把点云喂进去了,位姿输出却在天上飞。上周调一个工业件抓取,CAD模型是标准STEP导出的,场景点云是RealSense拍的,PPF跑出来旋转矩阵行列式居然是负的——一看就…

作者头像 李华
网站建设 2026/8/25 23:43:22

从QClaw到AI Agent:揭秘GUI自动化与安全实践

1. 从“养龙虾”到AI Agent&#xff1a;一次技术概念的全民化传播最近&#xff0c;一个听起来有点“离谱”的消息在技术圈和普通用户间都引起了不小的讨论&#xff1a;“腾讯官宣&#xff0c;个人微信可以‘养龙虾’了&#xff01;”。乍一看&#xff0c;这标题充满了噱头&…

作者头像 李华