HarmonyOS应用《玄象》开发实战:Canvas 太极图算法:阴阳半圆 + 鱼眼小圆的数学推导
阅读时长约 20 分钟 | 难度★★★★★ | 篇章第 2 篇 · 启动体验Splash 与动画对应源码entry/src/main/ets/pages/SplashPage.ets中的drawTaiji方法前言太极图是中华哲学的核心符号“一阴一阳之谓道”。玄象项目启动页以 Canvas 绘制的金色太极图作为视觉锚点传递玄之又玄众妙之门的品牌调性。本篇将深入剖析玄象项目drawTaiji方法的数学原理从外圈金色光环、白色半圆阳、黑色半圆阴、鱼眼小圆的算法推导到arc角度参数与坐标系的对应关系。掌握这套太极图绘制算法您就能用纯代码绘制任何复杂几何图形。提示太极图的绘制难点在于阴阳鱼眼的实现。玄象项目用 7 个 Canvas 操作精准还原了太极图的视觉精髓。一、drawTaiji 完整源码1.1 源码全貌privatedrawTaiji(canvas:CanvasRenderingContext2D,canvasWidth:number,canvasHeight:number){constcxcanvasWidth/2;constcycanvasHeight/2;constrcanvasWidth/2-10;// 1. 外圈金色光环canvas.strokeStyleColors.PRIMARY_GOLD;canvas.lineWidth2;canvas.beginPath();canvas.arc(cx,cy,r5,0,Math.PI*2);canvas.stroke();// 2. 白色半圆阳canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cy,r,-Math.PI/2,Math.PI/2);canvas.fill();// 3. 黑色半圆阴canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cy,r,Math.PI/2,-Math.PI/2);canvas.fill();// 4. 白色小圆阳中有阴canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cy-r/2,r/2,0,Math.PI*2);canvas.fill();// 5. 黑色小圆阴中有阳canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cyr/2,r/2,0,Math.PI*2);canvas.fill();// 6. 阳中小黑点canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cy-r/2,r/6,0,Math.PI*2);canvas.fill();// 7. 阴中小金点canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cyr/2,r/6,0,Math.PI*2);canvas.fill();// 8. 装饰花纹canvas.strokeStyleColors.PRIMARY_GOLD;canvas.lineWidth1;canvas.beginPath();canvas.arc(cx,cy,r*0.75,0,Math.PI*2);canvas.stroke();}1.2 八步绘制流程玄象项目太极图绘制分为 8 步步骤绘制内容Canvas API1外圈金色光环arcstroke2白色半圆阳arcfill3黑色半圆阴arcfill4白色小圆阳中有阴arcfill5黑色小圆阴中有阳arcfill6阳中小黑点arcfill7阴中小金点arcfill8装饰花纹arcstroke二、坐标系与几何参数2.1 Canvas 坐标系(0,0) ───────────→ x │ │ │ ↓ yCanvas 坐标系特点原点在左上角x 轴向右为正y 轴向下为正与数学坐标系相反2.2 arc 角度方向Canvasarc方法角度方向-π/2 │ │ π ◄────●────► 0 │ │ π/2角度 0指向 x 轴正方向右角度 π/2指向 y 轴正方向下角度 -π/2指向 y 轴负方向上角度 π指向 x 轴负方向左2.3 玄象项目太极图参数constcxcanvasWidth/2;// 圆心 xconstcycanvasHeight/2;// 圆心 yconstrcanvasWidth/2-10;// 太极半径圆心Canvas 几何中心半径Canvas 宽度的一半减去 10 像素边距提示玄象项目太极图 Canvas 尺寸为 220×220因此cx cy 110r 100。三、外圈金色光环3.1 绘制代码canvas.strokeStyleColors.PRIMARY_GOLD;canvas.lineWidth2;canvas.beginPath();canvas.arc(cx,cy,r5,0,Math.PI*2);canvas.stroke();3.2 关键参数参数值含义strokeStyleColors.PRIMARY_GOLD金色描边lineWidth2描边宽度 2pxarc(cx, cy, r5, 0, 2π)圆心 (cx, cy)半径 r5完整圆外圈光环3.3 视觉效果外圈金色光环环绕太极主体营造金边镶嵌的视觉。四、白色半圆阳4.1 绘制代码canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cy,r,-Math.PI/2,Math.PI/2);canvas.fill();4.2 arc 角度参数分析canvas.arc(cx,cy,r,-Math.PI/2,Math.PI/2);起始角度-π/2指向上方结束角度π/2指向下方默认方向顺时针从上方顺时针扫过 180 度到下方覆盖右半圆。4.3 颜色选择玄象项目用#F0D078浅金色表示阳颜色含义#F0D078浅金阳#1A1A2E深蓝黑阴提示传统太极图用黑白两色。玄象项目改为浅金 深蓝黑更符合应用的金色视觉调性。五、黑色半圆阴5.1 绘制代码canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cy,r,Math.PI/2,-Math.PI/2);canvas.fill();5.2 arc 角度参数分析canvas.arc(cx,cy,r,Math.PI/2,-Math.PI/2);起始角度π/2指向下方结束角度-π/2指向上方从下方顺时针扫过 180 度到上方覆盖左半圆。5.3 绘制顺序的视觉影响玄象项目先绘制白色半圆右半再绘制黑色半圆左半。两个半圆刚好覆盖整个圆形成阴阳两半的视觉效果。六、鱼眼小圆阳中有阴6.1 绘制代码canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cy-r/2,r/2,0,Math.PI*2);canvas.fill();6.2 几何参数canvas.arc(cx,cy-r/2,r/2,0,2π);参数值含义圆心 xcx与主圆同心圆心 ycy - r/2主圆上方 r/2 处半径r/2主圆半径的一半角度0到2π完整圆6.3 鱼眼的视觉效果这个小圆位于主圆上半部分阴区域用浅金色填充视觉上咬掉了阴区域的一块形成阳鱼眼。提示鱼眼是太极图最具哲学意味的部分——“阳中有阴阴中有阳”。玄象项目用 4 个小圆两个鱼眼 两个鱼眼内的小点精准还原了这一视觉。七、鱼眼小圆阴中有阳7.1 绘制代码canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cyr/2,r/2,0,Math.PI*2);canvas.fill();7.2 几何参数参数值含义圆心 xcx与主圆同心圆心 ycy r/2主圆下方 r/2 处半径r/2主圆半径的一半这个小圆位于主圆下半部分阳区域用深蓝黑填充形成阴鱼眼。八、鱼眼内的小点8.1 阳中小黑点canvas.fillStyle#1A1A2E;canvas.beginPath();canvas.arc(cx,cy-r/2,r/6,0,Math.PI*2);canvas.fill();8.2 阴中小金点canvas.fillStyle#F0D078;canvas.beginPath();canvas.arc(cx,cyr/2,r/6,0,Math.PI*2);canvas.fill();8.3 小点几何参数小点位置圆心半径颜色阳中小黑点(cx, cy - r/2)r/6深蓝黑阴中小金点(cx, cy r/2)r/6浅金8.4 鱼眼与小点的关系鱼眼内的小点是太极图鱼眼的瞳孔阳鱼眼浅金色圆内有一个深蓝黑小点阴鱼眼深蓝黑色圆内有一个浅金小点提示小点半径r/6约为主圆半径的 1/6。这个比例是玄象项目经过多次尝试后的黄金比例既保证小点可见又不破坏鱼眼的整体性。九、装饰花纹9.1 绘制代码canvas.strokeStyleColors.PRIMARY_GOLD;canvas.lineWidth1;canvas.beginPath();canvas.arc(cx,cy,r*0.75,0,Math.PI*2);canvas.stroke();9.2 装饰圆参数参数值含义圆心(cx, cy)与主圆同心半径r * 0.75主圆半径的 3/4描边金色1px细金线装饰花纹是太极图内部的细金圆环为太极图增加层次感。十、太极图绘制的数学总结10.1 关键数学关系元素圆心半径起止角度外圈光环(cx, cy)r 50 ~ 2π白色半圆阳(cx, cy)r-π/2 ~ π/2黑色半圆阴(cx, cy)rπ/2 ~ -π/2鱼眼小圆 1(cx, cy - r/2)r/20 ~ 2π鱼眼小圆 2(cx, cy r/2)r/20 ~ 2π阳中小黑点(cx, cy - r/2)r/60 ~ 2π阴中小金点(cx, cy r/2)r/60 ~ 2π装饰花纹(cx, cy)r * 0.750 ~ 2π10.2 设计精髓玄象项目太极图的设计精髓7 层绘制顺序从底层外圈光环到顶层鱼眼内小点精准控制视觉层级。几何对称性所有元素以(cx, cy)为对称中心。比例协调r、r/2、r/6的比例经过精心设计。提示太极图的绘制是 Canvas 几何绘制的典型范例。理解 arc 角度方向是绘制正确图形的关键。九、太极图绘制的常见问题9.1 太极图绘制的常见错误错误现象根因解决方案阴阳半圆错位arc 起始/结束角度理解错误记住 -π/2 指向上方π/2 指向下方鱼眼小圆偏离中心圆心坐标计算错误确保 cy ± r/2 正确鱼眼内小点不可见小点半径过小检查 r/6 是否大于 0.5px9.2 如何将太极图封装为可复用组件Componentexportstruct Taiji{Propsize:number220;privatesettings:RenderingContextSettingsnewRenderingContextSettings(true);privatetaijiContext:CanvasRenderingContext2DnewCanvasRenderingContext2D(this.settings);build(){Canvas(this.taijiContext).width(this.size).height(this.size).onReady((){this.drawTaiji(this.taijiContext,this.taijiContext.width,this.taijiContext.height);})}// drawTaiji 方法复用 SplashPage 中的实现}9.3 太极图的缩放适配在不同屏幕尺寸上太极图应自适应缩放。玄象项目通过canvasWidth / 2 - 10计算半径确保在不同分辨率下都完整显示。总结本篇以玄象项目drawTaiji方法为蓝本深入剖析了 HarmonyOS Canvas 绘制太极图的算法原理从 Canvas 坐标系与 arc 角度方向、外圈金色光环、阴阳半圆、鱼眼小圆、鱼眼内小点到装饰花纹的 8 步绘制流程。掌握这套几何绘制算法您就能用纯代码绘制任何复杂图形从太极图到八卦图、从星宿图到风水罗盘。下一篇《14 · 银河渐变带createLinearGradient 与 addColorStop 实战》将带您深入玄象项目启动页星空背景中的银河渐变绘制。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源HarmonyOS 官方文档CanvasRenderingContext2D.arcMDN Canvas APICanvasRenderingContext2D.arc()太极图数学原理wikipedia.org/wiki/太极图开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

多语言AI应用开发实战:从模型选型到部署优化

多语言AI应用开发实战:从模型选型到部署优化

1. 项目概述:为什么需要多语言AI应用? 在全球化数字产品的开发中,多语言支持早已不是加分项而是基础需求。去年我们团队为某跨境电商平台开发客服系统时,发现传统翻译API存在三个致命缺陷:上下文丢失导致语义扭曲、专业…

2026/10/24 21:37:22 阅读更多 →
国产化AI原生企业通讯系统SmartMsg的技术架构与实现

国产化AI原生企业通讯系统SmartMsg的技术架构与实现

1. 项目概述:当国产化遇上AI原生智信通SmartMsg的诞生源于两个关键趋势的碰撞:一方面,企业通讯工具国产化替代需求在近年呈现爆发式增长;另一方面,大模型技术正在重构所有软件的人机交互方式。这个项目本质上是在用全栈…

2026/10/25 9:22:25 阅读更多 →
Axios CDN快速集成实战:3种方法解决HTTP请求难题

Axios CDN快速集成实战:3种方法解决HTTP请求难题

Axios CDN快速集成实战:3种方法解决HTTP请求难题 【免费下载链接】axios Promise based HTTP client for the browser and node.js 项目地址: https://gitcode.com/GitHub_Trending/ax/axios 还在为项目中的HTTP请求烦恼吗?面对复杂的网络请求处理…

2026/10/24 9:29:24 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →