基于STM32的中点圆算法,画空心圆的函数

中点圆算法(Midpoint Circle Algorithm)是一种高效绘制圆的算法,它利用圆的对称性和整数运算来避免浮点计算,非常适合嵌入式系统使用。

空心圆绘制函数实现

/*** @brief  使用中点圆算法绘制空心圆* @param  x0: 圆心x坐标* @param  y0: 圆心y坐标* @param  r: 圆的半径* @retval 无*/
void DrawCircle(int16_t x0, int16_t y0, int16_t r)
{int16_t x = r;int16_t y = 0;int16_t err = 0;while (x >= y){// 利用圆的八分对称性,一次绘制8个点PutPixel(x0 + x, y0 + y);PutPixel(x0 + y, y0 + x);PutPixel(x0 - y, y0 + x);PutPixel(x0 - x, y0 + y);PutPixel(x0 - x, y0 - y);PutPixel(x0 - y, y0 - x);PutPixel(x0 + y, y0 - x);PutPixel(x0 + x, y0 - y);if (err <= 0){y += 1;err += 2*y + 1;}if (err > 0){x -= 1;err -= 2*x + 1;}}
}

算法说明
基本原理:

从圆的最右侧点(r, 0)开始绘制

每次迭代决定下一个像素是在当前像素的右侧还是右下侧

利用圆的八分对称性,一次计算并绘制8个对称点

误差项计算:

err表示中点与圆的实际位置的误差

当err <= 0时,选择右侧像素

当err > 0时,选择右下侧像素

优化特点:

仅使用整数运算,无浮点计算

避免三角函数计算

每次迭代最多绘制8个像素点

使用示例

int main(void)
{LCD_Init();  // 初始化LCD// 设置绘制颜色为红色SetColor(RED);// 在屏幕中心(160,120)绘制半径为50的圆DrawCircle(160, 120, 50);while(1);
}
int main(void)
{LCD_Init();  // 初始化LCD// 设置绘制颜色为红色SetColor(RED);// 在屏幕中心(160,120)绘制半径为50的圆DrawCircle(160, 120, 50);while(1);
}

性能优化建议
如果LCD支持批量写入,可以缓存8个点的坐标后一次性写入

对于小半径的圆,可以适当减少迭代次数

如果不需要完整圆,可以修改循环条件绘制圆弧

这个实现比基于三角函数的版本效率高得多,特别适合STM32等嵌入式平台使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Kotlin 项目完整集成 Bugly 异常监控指南

Android Kotlin 项目集成 Bugly 异常监控完整指南 一、Bugly 简介 Bugly 是腾讯提供的专业移动应用异常监控平台&#xff0c;支持&#xff1a; 崩溃报告&#xff08;Java/Native&#xff09;错误分析性能监控热更新功能&#xff08;需额外配置&#xff09; 二、集成步骤 1…

【电脑维修】MERCURY水星无线网卡导致 Windows 网络适配器无法连接的一种情况

故障现象 Powershell 无法启动&#xff0c; Terminal 无法启动&#xff0c; CMD 无法启动。 操作1 重新拔插 MERCURY 无线USB网卡&#xff0c;上述各种终端恢复相应。 分析 应该是MERCURY驱动故障导致卡死 操作2 磁盘出现 MERCURY 盘。里面是一个 MERCURY.exe 驱动安装程…

Docker 打上 Tag 和 Push 的意思

在 Docker 中&#xff0c;打 Tag&#xff08;Tagging&#xff09; 和 Push&#xff08;Pushing&#xff09; 是两个关键操作&#xff0c;用于管理镜像的版本并上传到镜像仓库&#xff08;如 Docker Hub、阿里云 ACR、Harbor 等&#xff09;。 1. 打 Tag&#xff08;Tagging&…

简化excel校验提高开发效率

业务背景&#xff1a;上传excel文件进行基础数据校验&#xff0c;然而东西太多写着写着就...自然成了测试的KPI了 解决思路&#xff1a;使用现有的注解处理&#xff0c;原理使用validate注解原理 直接上干货&#xff0c;一行代码搞定校验&#xff1a; ValidateUtils.validat…

基于Koa实现的服务端渲染 ✅

前段时间刚写完毕业论文&#xff0c;现在一上来就是“基于”&#xff0c;哈哈。&#x1f92f; 这篇文章持续更新&#xff0c;涉及到的技术栈是Koa、Vue和Vite &#xff08;用React手搓服务端渲染好麻烦&#xff09;。但是现在能上生产的服务端渲染估计是Next&#xff08;配合Re…

Linux运维——Vim基础

Vim基础 一、移动光标1.1、基础移动1.2、屏幕滚动 二、编辑操作2.1、插入模式2.2、删除与修改2.3、复制粘贴 三、搜索与替换3.1、搜索3.2、替换 4、分屏与窗口管理4.1、分屏操作4.2、窗口调整 五、宏与批量操作六、效率技巧七、操作符7.1、内置操作符7.2、操作符 文本对象&…

git操作合集

更新文件 在 Git 中更新已经上传到仓库的文件 1、检查当前状态 首先&#xff0c;打开终端或命令行工具&#xff0c;进入你的 Git 仓库目录&#xff08;即包含 .git 文件夹的目录&#xff09;。运行以下命令来查看当前仓库的状态&#xff1a; git status 此命令会显示哪些文…

【笔记】深度学习模型训练的 GPU 内存优化之旅⑤:内存分配篇

开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…

SQL Server 存储过程开发手册

SQL Server 存储过程开发手册&#xff08;更新版&#xff09; 根据要求&#xff0c;重新整理并加入了事务控制、异常日志记录和返回状态码的设计。以下是详细说明&#xff1a; 1. 总则 1.1 目标 本手册旨在为 SQL Server 存储过程的编写提供一套完整的规范&#xff0c;确保系…

深海科技服务博客简介

人人可学&#xff0c;人人可用&#xff0c;IT与AI不是高不可攀&#xff01; 博客宗旨 深海科技服务博客致力于&#xff1a; 推广IT与AI的实际应用&#xff0c;降低入门门槛&#xff0c;让更多个人和中小企业能够以最少投入、高效实现信息化、智能化。 分享开源免费软件、简单…

本地大模型编程实战(29)查询图数据库NEO4J(2)

上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用GraphQACypherChain查询NEO4J。用它实现简单快捷&#xff0c;但是不容易定制&#xff0c;在生产环境中可能会面临挑战。 本文将基于langgraph 框架&#xff0c;用LLM(大语言模型)查询图数据库NEO4J。它可以定义清晰复…

RPG_5.角色动画

1.创建一个动画实例 2.创建该实例的c子类 3.继续创建该类的子类&#xff0c;但是作用是用来链接&#xff08;以后会详细解释&#xff09; 4.基于PlayerAnimInstance类创建一个子类 5.目前一共创建了四个c类&#xff0c; 最基的类 角色的类 玩家控制的角色的类 玩家控制的角…

Sigmoid函数导数推导详解

Sigmoid函数导数推导详解 在逻辑回归中&#xff0c;Sigmoid函数的导数推导是一个关键步骤&#xff0c;它使得梯度下降算法能够高效地计算。 1. Sigmoid函数定义 首先回顾Sigmoid函数的定义&#xff1a; g ( z ) 1 1 e − z g(z) \frac{1}{1 e^{-z}} g(z)1e−z1​ 2. 导…

MS31860T——8 通道串行接口低边驱动器

MS31860T 是一款 8 通道低边驱动器&#xff0c;包含 SPI 串口通信、 PWM斩波器配置、过流保护、短路保护、欠压锁定和过热关断功能&#xff0c; 芯片可以读取每个通道的状态。MS31860T 可以诊断开路的负载情况&#xff0c;并可以读取故障信息。外部故障引脚指示芯片的故障状态。…

腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架

在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架&#xff0c;Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况&#xff0c;Kuikly 是一个面向终端技术栈的跨端开发框架&#xff0c;完全基于kotlin语言开发&#xff0c;提供原生的性能和体验。 按照官方的说法&…

AI驱动UI自动化测试框架调研

随着应用复杂度增加&#xff0c;手动测试变得费时且易出错&#xff0c;而自动化测试可提高效率和可靠性。如何借助大模型和一些自动化测试框架进行自动化测试&#xff0c;是一个研发团队很重要的诉求。 目前主流的自动化测试框架很多&#xff0c;Midscene.js结合Playwright提供…

关系型数据库设计指南

1. 前言 在自己独立开发一个项目的过程中&#xff0c;我发现了一些以往写小 Demo 从来没有遇到过的问题。 最近在独立制作一个全栈的通知管理平台。一开始我没有考虑太多&#xff0c;直接根据头脑中零星的想法就开撸后端数据库 model 和 API&#xff0c;用的是学了半成品的 M…

详解TypeScript中的类型断言及其绕过类型检查机制

TypeScript中的类型断言及其绕过类型检查机制 一、类型断言的本质与工作原理编译时与运行时的区别TypeScript编译器处理类型断言的步骤 二、类型断言的详细语法与进阶用法基础语法对比链式断言断言修饰符1. 非空断言操作符 (!)代码分析1. getLength 函数分析用法说明&#xff1…

XLSX.utils.sheet_to_json设置了blankrows:true,但无法获取到开头的空白行

在用sheetJs的XLSX库做导入&#xff0c;遇到一个bug。如果开头行是空白行的话&#xff0c;调用sheet_to_json转数组获得的数据也是没有包含空白行的。这样会导致在设置对应的起始行时&#xff0c;解析数据不生效。 目前是直接跳过了开头的两行空白行 正确应该获得一下数据 问…

PostgreSQL 数据库下载和安装

官网&#xff1a; PostgreSQL: Downloads 推荐下载网站&#xff1a;EDB downloads postgresql 我选了 postgresql-15.12-1-windows-x64.exe 鼠标双击&#xff0c;开始安装&#xff1a; 安装路径&#xff1a; Installation Directory: D:\Program Files\PostgreSQL\15 Serv…