公司动态
# [特殊字符] 指南针 — 鸿蒙ArkTS方向计算与方位跟踪系统
一、应用概述1.1 应用简介指南针Compass是一款模拟方向定位的实用工具能够显示当前方向角度、方位文字、目标方位跟踪和方位保存功能。该应用以HarmonyOS NEXT的ArkTS框架为基础深入展示了方向计算算法、角度映射、方位保存、旋转动画、传感器调用和视觉反馈等关键技术。1.2 核心功能功能模块功能描述技术实现设计考量方向显示当前方向角度角度计算传感器0-360°精确显示方位文字16方位文字角度映射表北/北东北/东北等目标设定设置目标方位偏差计算到达提醒方位保存保存方位记录数组存储带位置名称校准功能模拟校准定时器动画抖动动画效果可视化指针旋转动画旋转动画渐变平滑过渡磁场强度显示磁场强度传感器数据检测干扰水平仪水平角度检测加速度传感器辅助功能1.3 应用架构指南针应用采用分层架构UI表现层指南针表盘、方向指针、角度/方位文字显示、目标方位设定、保存列表。业务逻辑层方向计算引擎、方位映射器、目标跟踪器、传感器管理器。数据持久层使用Preferences API保存方位记录和设置。二、方向计算算法2.1 方位映射classCompassEngine{// 16方位映射privatestaticreadonlyDIRECTIONS_16[{name:北,abbreviation:N,range:[0,11.25]},{name:北东北,abbreviation:NNE,range:[11.25,33.75]},{name:东北,abbreviation:NE,range:[33.75,56.25]},{name:东东北,abbreviation:ENE,range:[56.25,78.75]},{name:东,abbreviation:E,range:[78.75,101.25]},{name:东东南,abbreviation:ESE,range:[101.25,123.75]},{name:东南,abbreviation:SE,range:[123.75,146.25]},{name:南东南,abbreviation:SSE,range:[146.25,168.75]},{name:南,abbreviation:S,range:[168.75,191.25]},{name:南西南,abbreviation:SSW,range:[191.25,213.75]},{name:西南,abbreviation:SW,range:[213.75,236.25]},{name:西西南,abbreviation:WSW,range:[236.25,258.75]},{name:西,abbreviation:W,range:[258.75,281.25]},{name:西西北,abbreviation:WNW,range:[281.25,303.75]},{name:西北,abbreviation:NW,range:[303.75,326.25]},{name:北西北,abbreviation:NNW,range:[326.25,348.75]},{name:北,abbreviation:N,range:[348.75,360]}];// 获取方向文字staticgetDirectionText(degrees:number):{name:string;abbreviation:string}{constnormalized((degrees%360)360)%360;for(constdirofthis.DIRECTIONS_16){if(normalizeddir.range[0]normalizeddir.range[1]){return{name:dir.name,abbreviation:dir.abbreviation};}}return{name:北,abbreviation:N};}// 简化版使用公式计算更高效staticgetDirectionSimple(degrees:number):string{constdirections[北,北东北,东北,东东北,东,东东南,东南,南东南,南,南西南,西南,西西南,西,西西北,西北,北西北];constindexMath.round(((degrees%360)360)%360/22.5)%16;returndirections[index];}// 计算两个方向的偏差角度staticgetBearingDifference(current:number,target:number):number{letdifftarget-current;if(diff180)diff-360;if(diff-180)diff360;returndiff;}// 判断是否面向目标方向staticisFacingTarget(current:number,target:number,threshold:number5):boolean{returnMath.abs(this.getBearingDifference(current,target))threshold;}// 角度平滑过渡防止指针抖动staticsmoothAngle(current:number,target:number,smoothingFactor:number0.3):number{letdifftarget-current;if(diff180)diff-360;if(diff-180)diff360;returncurrentdiff*smoothingFactor;}// 磁偏角校正根据地理位置staticapplyDeclination(degrees:number,declination:number):number{return((degreesdeclination)%360360)%360;}}2.2 目标方位跟踪classTargetTracker{privatetargetAngle:number|nullnull;privatetargetName:string;privatereached:booleanfalse;privateonReached:(()void)|nullnull;setTarget(angle:number,name:string):void{this.targetAngle((angle%360)360)%360;this.targetNamename;this.reachedfalse;}clearTarget():void{this.targetAnglenull;this.targetName;this.reachedfalse;}update(currentAngle:number):TrackingInfo{if(this.targetAnglenull){return{hasTarget:false,difference:0,direction:,isReached:false};}constdiffCompassEngine.getBearingDifference(currentAngle,this.targetAngle);constisReachedMath.abs(diff)5;if(isReached!this.reached){this.reachedtrue;this.onReached?.();}letdirection;if(diff0)direction← 向左转;elseif(diff0)direction向右转 →;elsedirection✓ 正对目标;return{hasTarget:true,targetAngle:this.targetAngle,targetName:this.targetName,difference:diff,direction,isReached:isReached};}setOnReached(callback:()void):void{this.onReachedcallback;}getTarget():{angle:number|null;name:string}{return{angle:this.targetAngle,name:this.targetName};}}interfaceTrackingInfo{hasTarget:boolean;targetAngle?:number;targetName?:string;difference:number;direction:string;isReached:boolean;}三、方位保存管理3.1 方位记录interfaceCompassRecord{id:string;name:string;angle:number;direction:string;latitude?:number;longitude?:number;createdAt:number;note:string;}classCompassRecordManager{privaterecords:CompassRecord[][];privateprefs:preferences.Preferences|nullnull;asyncinit(context:Context):Promisevoid{this.prefsawaitpreferences.getPreferences(context,compass_prefs);awaitthis.load();}addRecord(angle:number,name:string,note:string):CompassRecord{constrecord:CompassRecord{id:Date.now().toString(),name,angle:((angle%360)360)%360,direction:CompassEngine.getDirectionSimple(angle),createdAt:Date.now(),note};this.records.push(record);this.save();returnrecord;}deleteRecord(id:string):void{this.recordsthis.records.filter(rr.id!id);this.save();}getRecords():CompassRecord[]{return[...this.records].sort((a,b)b.createdAt-a.createdAt);}asyncload():Promisevoid{if(!this.prefs)return;constjsonawaitthis.prefs.get(compass_records,[]);try{this.recordsJSON.parse(json);}catch{this.records[];}}asyncsave():Promisevoid{if(!this.prefs)return;awaitthis.prefs.put(compass_records,JSON.stringify(this.records));awaitthis.prefs.flush();}}四、UI交互设计4.1 指南针表盘Componentstruct CompassDial{LinkcurrentAngle:number;LinktargetAngle:number|null;StatedisplayAngle:number0;StatesmoothAngle:number0;privatereadonlyCOMPASS_RING_COLORS[#E53935,#FF9800,#FFC107,#4CAF50,#2196F3,#1565C0,#9C27B0,#E91E63];aboutToAppear():void{this.smoothAnglethis.currentAngle;}build(){Stack(){// 外圈刻度Circle().width(280).height(280).fill(none).stroke(#333333).strokeWidth(2)// 刻度线ForEach(Array.from({length:72},(_,i)i),(i:number){constanglei*5;constisMajori%90;constlengthisMajor?20:10;constwidthisMajor?3:1;// 使用旋转定位Path().width(isMajor?4:2).height(length).fill(isMajor?#333:#999).rotate({angle})})// 基本方位文字ForEach([{text:N,angle:0,color:#E53935},{text:E,angle:90,color:#333333},{text:S,angle:180,color:#333333},{text:W,angle:270,color:#333333}],(dir:{text:string;angle:number;color:string}){Text(dir.text).fontSize(24).fontWeight(FontWeight.Bold).fontColor(dir.color).position({x:140-8Math.sin(dir.angle*Math.PI/180)*120,y:140-12-Math.cos(dir.angle*Math.PI/180)*120})})// 指针Path().width(4).height(120).fill(#E53935).rotate({angle:this.smoothAngle}).position({x:138,y:20})// 中心圆Circle().width(20).height(20).fill(#333333)// 中心点Circle().width(8).height(8).fill(#E53935)}.width(280).height(280).rotate({angle:-this.smoothAngle}).animation({duration:200,curve:Curve.EaseOut}).padding(20)}}五、总结5.1 核心技术要点16方位映射算法将360°角度精确映射到16个方位支持简称和全称。角度平滑过渡使用平滑因子算法防止指针抖动提升视觉体验。目标方位跟踪计算当前方向与目标方向的偏差提供转向指引。磁偏角校正支持根据地理位置进行磁偏角校正。方位记录管理保存和管理已记录的方位数据。旋转动画使用ArkTS动画API实现指针平滑旋转。5.2 扩展方向真实传感器调用接入设备磁力计和加速度计获取真实方向数据。地图集成与地图应用联动显示目标方位在地图上的位置。导航路线记录行进路线支持返航导航。磁场检测检测周围磁场强度识别电磁干扰。水平仪集成水平角度检测功能。5.3 核心代码量统计模块核心代码行数接口数组件数方向计算引擎1206-目标跟踪器705-方位记录管理器805-UI组件25034总计520194