当前位置: 首页 > news >正文

基于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.dtcms.com/a/163226.html

相关文章:

  • 【数据结构】图论存储结构深度解析:邻接多重表如何实现无向图O(1)删边?邻接矩阵/链表/十字链对比
  • 【Prometheus-Mongodb Exporter安装配置指南,开机自启】
  • Educational Codeforces Round 178 div2(题解ABCDE)
  • Qwen3术语解密
  • 解决调用Claude 3.7接口 403 Request not allowed问题
  • Linux 内核中 TCP 协议的支撑解析
  • 通信协议:数字世界的隐形语言——从基础认知到工程实践-优雅草卓伊凡
  • C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)
  • [USACO08DEC] Hay For Sale S Java
  • WPF(Windows Presentation Foundation)的内容模型
  • Go 语言中的 `os.Truncate` 函数详解
  • STM32单片机入门学习——第49节: [15-2] 读写内部FLASH读取芯片ID
  • 本地大模型编程实战(29)查询图数据库NEO4J(2)
  • Mysql中索引的知识
  • 洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类
  • 基于LVS+Keepalived+NFS的高可用负载均衡集群部署
  • 基于大模型的大肠息肉全程管理研究报告
  • 破茧成蝶:一家传统制造企业的年轻化转型之路
  • 总结小程序的坑
  • ​钓鱼网页散播银狐木马,远控后门威胁终端安全
  • 数字中国浪潮下:Coremail AI赋能邮件办公,筑牢安全防线引领转型
  • VSCode突然连接不上服务器(已解决)
  • “情况说明“以后,Unity XR 开发者如何选择?
  • JavaWeb:后端web基础(TomcatServletHTTP)
  • Linux《进程概念(中)》
  • SSM书籍管理(业务编写)
  • c#WebsocketSever
  • 【3D基础】顶点法线与平面法线在光照与PBR中的区别与影响
  • 第13讲:图形尺寸与分辨率设置——适配论文版面,打造专业图稿!
  • upload-labs PASS 1-5通关