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/17 4:09:55 阅读更多 →
国产化AI原生企业通讯系统SmartMsg的技术架构与实现

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

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

2026/10/17 4:10:17 阅读更多 →
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/17 4:11:23 阅读更多 →

最新新闻

Python+MySQL学生管理系统实战:从环境搭建到可视化界面与避坑指南

Python+MySQL学生管理系统实战:从环境搭建到可视化界面与避坑指南

简介:这是一套面向Python与MySQL初学者的学生管理系统实战项目,适合正在学习数据库编程、需要完成课程设计或毕业设计的在校学生参考。项目以Python编写客户端逻辑,MySQL负责数据存储,采用客户端/服务器模式,帮助使用者…

2026/10/18 19:32:24 阅读更多 →
knowledge-work-plugins:知识工作流的轻量协议与文件化插件范式

knowledge-work-plugins:知识工作流的轻量协议与文件化插件范式

1. 项目概述:什么是 knowledge-work-plugins?它不是“插件市场”,而是一套知识工作者的底层工作流协议“knowledge-work-plugins”这个标题乍看像某个开源仓库名,或是某款AI工具的子模块,但如果你最近在技术社区、开发…

2026/10/18 19:32:24 阅读更多 →
CVE-2021-22986 深度剖析:F5 BIG-IP iControl REST 远程代码执行漏洞的排查与加固

CVE-2021-22986 深度剖析:F5 BIG-IP iControl REST 远程代码执行漏洞的排查与加固

1. 从一条告警说起:这个漏洞为什么让运维团队彻夜难眠凌晨两点,手机响了。监控平台推来一条告警:某台负载均衡设备的管理接口出现了异常进程创建行为。我打开终端连上去,发现/var/log/下多了一个从未见过的日志文件,里…

2026/10/18 19:32:24 阅读更多 →
【Agent】【OpenCode】模型配置(OpenRouter)踩坑:401/local proxy failed 后把 endpoint 改到 TaoToken

【Agent】【OpenCode】模型配置(OpenRouter)踩坑:401/local proxy failed 后把 endpoint 改到 TaoToken

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

2026/10/18 19:32:24 阅读更多 →
基于System-Verilog的DE2-115驱动HC_SR04超声波测距:从时序到数码管显示的完整实现

基于System-Verilog的DE2-115驱动HC_SR04超声波测距:从时序到数码管显示的完整实现

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

2026/10/18 19:32:24 阅读更多 →
电赛C题省一报告拆解:从方案论证到测试数据的完整写作指南

电赛C题省一报告拆解:从方案论证到测试数据的完整写作指南

简介:这份资源是2022年全国大学生电子设计竞赛C题「小车跟随行驶系统」的省一等奖完整报告,面向备赛电赛的本科生与指导教师,可作为规范性报告范文与模板参考。报告以MSP432P401R为主控,涵盖系统方案论证、舵机与超声波测距模块选…

2026/10/18 19:31:24 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →