目录
本实验基于STM32F103RC+TFTLCD屏,旨在于在LCD屏上显示一个实心圆形,然而众所周知,对于屏幕而言,我们只能操作各个像素点,因此,选择出最接近标准圆形的像素点就成了本次实验的主要目的,最终得到的圆形大概应该长这样
看起来很不规则,但是这里只是半径为5个像素点的圆形,因此放大来看并不规则,但是在显示屏上,肉眼很难区分出来
首先,由于屏幕由像素点组成,每个像素点又有自己的位置信息,因此我们不妨将屏幕显示近似为一个坐标系,并在坐标系中作出一个标准圆形,圆心为原点(如果以后圆心改变,将所有坐标基于圆心平移即可),找出最接近圆边界的所有整数坐标(像素点),如原理图黑色部分,有了边界坐标,圆内的坐标就简单了
根据对称原理,我们可以将圆形分为八分,于是只需要求得其中任意一份中满足条件的所有点,就能根据它们推算出剩下的所有点,我们以下述原理图中蓝色部分为例
原理图
接下来进行一些几何学的分析来求取具体每个点的坐标,首先需要知道这里的坐标并不能单纯根据圆的方程求解各个坐标的准确值,然后靠四舍五入近似,因为这里的每个点的确定是来源于在圆边境内外两侧更接近圆的点,简单的四舍五入会遗失大量有效点
由于我们暂时只考虑边界,因此要先确定边界从哪开始(45°线与圆交点)到哪结束(x轴)。不难得到起点(0.707*r,r),终点(r,0)。
我们以x轴为参考轴,每单位x坐标对应得到一个最接近圆的y坐标即可。因此对于任意一个横坐标 i,我们可以从0到 r 遍历 y 坐标,直到对应坐标点( i,ym)在圆外为止。而对于其中ym值,可以用几何公式 x²+y²>r² 判断得到第一个在圆外的点,如上图中粉色部分
这里说明一下,我们寻找ym是为了判断是否已经到达圆的边界,此时( i,ym-1)和( i,ym)刚好分别位于圆的内外两侧,接下来我们只要根据点到圆的距离公式 d=|x²+y²-r²| 判断其中哪个更加接近圆,通过遍历x轴便可以获取到每个横坐标对应的边界点的纵坐标
我们通过上述方法可以得到蓝色区域内最接近圆的所有点,通过对称原理就能轻而易举的得到所有点了,如上图中绿色部分。有了整个圆上的坐标,填充出整个圆形就易如反掌了
整个圆形显示算法的原理已经完成,利用上述原理得到一个实心圆已经可以实现了。
但是经过实验发现几个小问题需注意,分别如下
在原理图的蓝色部分,我们选取1/8圆作为参考区域得到点坐标,然后利用对称原理获取整个圆形的坐标,原理的确没错,但是参考区域的选择会对结果产生一定的影响
如下图所示,按照x轴为参考轴,以此获取纵坐标,得到所有有效点(下图中绿色点)。如果照之前的方法选择0~45°区域,可以发现,有部分有效点被忽略掉了(下图中红色点)。这是由于我们遍历x轴时,每个横坐标只能对应得到一个纵坐标,因此,我们需要选择以下调整:
选择一、遍历一次横坐标得到ym值,再遍历一次纵坐标得到xm值,收集两次遍历得到的所有点(可行但效率低)
选择二、选择下图中蓝色区域为参考区域,仍然遍历横坐标得到ym值,然后进行1/8对称
为什么选择二不会遗漏有效点呢?
其实从图中就可以看出来,圆在0~45°中的表达式不是y(x)的函数,即每个x有且仅有一个y与之对应;而在45°~90°中的表达式不是x(y)的函数,但却符合y(x)函数关系,因此可以保证每个x有且仅有一个y与之对应
因此,我们在编写代码时,只需要横坐标遍历 0~0.707r 的范围即可
在原理图的粉色部分,我们为了判断圆的边界用到了一个复杂的数学表达式来计算点( i,ym-1)和( i,ym)到圆的距离,我们现在列出两个算式 d1=| i²+(ym-1)²-r² | 和 d2=| i²+ym²-r² |。且已知绝对值符号内d1为负,d2为正。(因为分别位于圆的内外两侧)
我们需要他们中的较小者作为有效点坐标,因此我们可以判断他们差值的符号 d2-d1=2i²+2ym²-2ym+1-2r² ,如果为负就选取( i,ym),反之同理。由于一般横纵坐标都是远大于1的,因此上式顺理成章简化为 D2-D1= i²+ym²-ym-r² 。同理判断符号即可
根据原理图,我们每次循环遍历,就可以获得一个坐标,通过1/8对称就可以获得一组坐标(8个坐标)
如果仅按照横/纵向填充,执行速度很快(因为没有重复填充),但是有可能会出现缺漏情况(区域选择合适则不会出现),如左图。
因此,我们在获取到一组坐标(8个坐标)后,可通过矩形范围填充的方式执行,便可以完全填充整个圆形了,牺牲了速度,但是保证了准确性。如右图
但是,如果按上述参考区域选取的方法选择45°~90°,则建议采用横/纵向填充,几乎没有重复,执行速度最快
//画实心圆//x,y 圆心坐标//r 半径//color 填充颜色void LCD_Draw_Fill_Circle(u16 x,u16 y,u16 r,u16 color){ int i,j; u16 ym; int xymax=r/1.414; //45°线与圆的交点坐标(取整) for(i=0;i<=xymax;i++) //遍历x轴,45°~90°区域 { j=0; while(i*i+j*j-r*r<=0)j++; //找到圆的边界 ym=(i*i+j*j-r*r-j<0)?j:(j-1); //边界内外侧更接近圆的坐标 LCD_Fill(x-i,y-ym,x+i,y-ym,color); //按行填充 LCD_Fill(x-i,y+ym,x+i,y+ym,color); LCD_Fill(x-ym,y-i,x+ym,y-i,color); LCD_Fill(x-ym,y+i,x+ym,y+i,color); }}
原网址: 访问
创建于: 2024-03-07 14:50:38
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论