嵌入式Linux填充圆算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式Linux填充圆算法

《嵌入式Linux软件设计》 课程设计报告 -----------填充圆算法设计 姓名 学号 班级 题目 成绩 评语 日期 项目名称 设计圆的两种以上填充算法,并比较其在ARM Linux的执行速度 项目需求分析 在实验箱的LCD(Linux framebuffer设备)上完成圆或椭圆的两种以上填充算法,比较他们的填充效果和填充速度。本实验计划完成圆的两种填充算法,分别用点和线的方式填充半径相等的两个圆,并进行比较。 项目分工 本次课程设计为一人完成。 概要设计 在ARM机上执行填充圆算法,需要在软硬件方面协调工作方可。 一、硬件 保证虚拟机和ARM机的通信,本次实验采用串口通信方式; 本实验要在LCD上画圆,所以需要使用到帧缓冲设备(Framebuffer)。 二、软件 所编写的填充圆算法必须可执行的,能够得出正确结果的。可利用交叉编译工具在宿主机上开发在目标板上运行的软件,即在Linux下先编写主函数然后编译连接成ARM可运行的二进制文件,最后把该二进制文件下载到超级终端上运行。 Ubuntu虚拟机 GUN交叉编译 ARM9超级终端 预处理 汇编 编译 链接 .C源程序 运行 预处理器 编译器 汇编器 连接器 可执行文件 软硬件流程图如图所示 GUN交叉编译工具链: arm-linux-gcc 编译C程序(.c)或汇编程序(.s) 使用交叉编译工具编译一个程序的arm可执行程序: #arm-linux-gcc -Wall -o *** +++.c(+++.c为已编译好的c程序,***为生成的arm程序的名字) -c:只编译不链接,-o:编译且链接,-Wall:显示出错信息 gcc的使用格式如下:$ gcc [options][filenames] 其中filenames为所要编译的程序源文件。 当使用gcc时,gcc会完成预处理、编译、汇编和连接。前三步分别生成目标文件,连接时,把生成的目标文件链接成可执行文件。 gcc可以针对支持不同的源程序文件进行不同处理,文件格式以文件的后缀来识别。 详细设计 在本次实验中我采用了两种填充圆算法。 第一种算法: 以(x-Rx)2+(y-Ry)2≤R2为判断准则对LCD屏幕上的每一个点进行其相对圆心的距离是否小于圆的半径进行判断,若小于等于则进行填充,反之,则不进行动作。 以一个16*16的网格为底板分别画一个半???为5和为6的圆,则填充效果如下图所示,则其圆的边界会随着半径的增大而变得更加光滑。 半径为5 半径为6 (圆心未填充只是为了更清楚的标识) 第二种算法: 以|x-Rx2+y-Ry2-R2|为判断准则判断边界点,取该绝对值最小的点为直线一端端点端点,并以此取得另一个端点,从而画以此两点为端点的直线。最终将整个圆完成。 以一个16*16的网格为底板分别画一个半径为5的圆,填充过程如下:       (圆心未填充只是为了更清楚的标识) 流程图 main函数       hanshu函数                                打开Framebuffer设备 对LCD进行检测,证明其屏幕显示正常工作,无坏点 进行第一种填充圆算法 进行第二种填充圆算法 关闭Framebuffer设备 退出程序 关键代码 第一种填充算法: r=100;x0=450;y0=240; for(y=y0-r;y=y0+r;y++) //取与该圆相切的正方形为目标点范围,从而缩小计算范围 { for(x=x0-r;x=x0+r;x++) { if(((x-x0)*(x-x0)+(y-y0)*(y-y0))=r*r) { *(fbp + y * 640*2 + x*2) = 0x00; *(fbp + y * 640*2 + x*2 +1) = 0xF8; } else{} } } 第二种算法 void drawcircle(unsigned int x0,unsigned int y0,unsigned int radius,unsigned int c) { unsigned int x,y,y1=0; int s0,s1,s2; //int i=0; x=x0+radius+1; y=y0; do { s0=abs((x-x0-1)*(x-x0-1)+(y-y0)*(y-y0

文档评论(0)

pengyou2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档