版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、;. MATLAB课程设计报告题 目 几何作图 学 院 电气信息学院 专 业 电子信息科学与技术 学生姓名 田绍宏 学 号 2011052466 年级 11 级 教 师 郭江凌 二一三年七月十三日1、 设计名称:几何作图(1.1)2、设计目标/设计要求(基本目标及扩展)根据给定的API,编写MATLAB函数,实现多条线段作图。function Y = ex03_drawline(I, x, y)% 线段作图% I : 输入画板矩阵, uint8% x : 线段各端点的x坐标,行向量,其中(x1,x2)是第一条线段的,(x3,x4)是第二条的,如此类推% y : 线段各端点的y坐标,行向量,其中
2、(y1,y2)是第一条线段的,(y3,y4)是第二条的,如此类推% Y : 输出画板矩阵, uint8扩展1:根据给定的API,编写MATLAB函数,实现圆作图。function Y = ex03_drawcircle(I, x, y, r)% 圆作图% I : 输入画板矩阵, uint8% x : 圆心的x坐标,行向量% y : 圆心的y坐标,行向量% r : 圆的半径,行向量% Y : 输出画板矩阵, uint8扩展2:画虚线、点划线3、 设计方案(1)、直线设计方案:1、 根据给出的端点,计算所在直线方程2、 根据所得方程,计算出所在两端点间的(x,y)坐标对3、 I中以计算所得(x,y
3、)坐标对为下标的元素置为v(2)、圆设计方案:1、 根据所给圆心、半径计算圆的方程2、 根据所得方程,计算圆上每个点的坐标对(x,y)3、I中以(x,y)为坐标的点置为04、算法描述(1)直线1、 根据给出的两端点算出直线斜率k=(y1-y2)/(x1-x2)。(x10,y00,r0)2、由圆心计算圆的边界,即x1=x0-r,x2=r+x0;y1=y2=y03、从x1开始到x2把中间步长为1的x带入方程中算得坐标对(x_k,+y_k)4、在I矩阵中,把所有算出的(x_k,+y_k)坐标对的值置为05、 算法实现及分析(1)、直线function Y = ex03_drawline(I, x,
4、y)%若斜率不存在,即为竖直的直线,则无需求斜率直接画if (x(1) = x(2) I(min(y):max(y),x(1)=0;else%1、根据给出的两端点算出直线斜率k=(y1-y2)/(x1-x2)。(x11 |a0,y00,r0)%2、由圆心计算圆的边界,即x1=x0-r,x2=r+x0;y1=y2=y0x_1=x-r;x_2=x+r;%3、从x1开始到x2把中间步长为1的x带入方程中算得坐标对(x_k,+y_k) for x_k=x_1:x_2 y_k1=sqrt(r2-(x_k-x)2)+y; y_k2=-sqrt(r2-(x_k-x)2)+y; y_k1=round(y_k1
5、); y_k2=round(y_k2);%4、在I矩阵中,把所有算出的(x_k,+y_k)坐标对的值置为0 I(y_1,x_k)=0; I(y_2,x_k)=0; endY=unit8(I);toc;end 6、 实验方案与结果分析(1) 描述实验方案-(直线篇)-输入为: I = uint8(ones(200) * 200); x = 10 1000 30 600 100 100; y = 30 600 100 1000 20 1000;预想中应该出现三条直线其中其端点分别为M(10,30)Q(1000,600)、N(30,100)V(600,1000)和P(100,20)B(100,100
6、0),并且其中一条为竖直的直线。在代码运行中,在画竖直直线的时候应该首先通过第一个判断语句直接画出来,否则后面将会出现除0的情况,导致代码错误。而其他两条直线应该要判断出第一条线应以x为基准,而第二条应以y为基准,否则画出来的线可能有断点,而且很难看。-(圆篇)-输入为: I = uint8(ones(200) * 200);x=100;y=100; r=50;预想中应该出现一个整圆,并且圆心在(100,100)处(2)实验结果分析-(直线篇)-最终结果也正确生成了三条直线,并且第一二条线并无断点与不美观,但是锯齿状还是略明显,这点在总结中会详细提到,结果如下图:-(圆篇)-经运行,输出的圆虽
7、然有圆的形状,但是很震惊的是在两个边界点附近有若干个离散的没有组合起来的点,如图一。经过认真观察,原因为在端点附近的x值一经变化y值变化较大,所以不能连起来,变换x,y的位置结果仍一样,最后不得不加了语句,把断点人工连起来,这点也将会在总结中详细叙说,连起断点的结果见图二。(图一)(图二)7、性能分析(可选)(1)速度分析-(直线篇)-根据tic、toc计时,在200*200的矩阵中画三条线用时如下:在1000*1000的矩阵中画三条线的用时为:画直线的耗时最主要体现在循环与判断语句中,由于代码中几个判断语句不能省略,否则会出现错误,由于要求是要一次画多条直线,所以一开始的循环取出端点的循环不
8、能取消。而原来在把每一个点坐标带入方程算出另一个左边的时候用到了for循环,而在改进中把循环改成了矩阵运算,令得速度快了不少。-(圆篇)-根据tic、toc计时,在200*200的矩阵中画一个圆用时如下:在1000*1000的矩阵中画一个院的用时如下:由对比可知 ,画圆所费的时间比直线相对来说要多,当然也是因为这里画的直线较短的限制,但是从圆的方程中来所,圆的代码中也用到了判断语句和for语句,同样的,为了保证画圆的正确性,if语句也不能省略,而在连接断点时原本用到了for循环,最后也改成了矩阵运算,加快了速度。(2) 内存开销分析在内存上画圆和画线都是一样,主要就是画板矩阵所占用的内存和在计
9、算坐标时保存数据所用到的内存。8、总结-(直线篇)-在画直线的代码编写中,由于在课堂上老师对于这个程序已经有了一个相当完整的介绍与指导,所以对于一开始的编写例如判断直线斜率是否存在,斜率正负问题都已经有了很详细的基础,所以并没有很费事,由于这次给的API中没有I,于是我就把给出的画板矩阵数值置为200,而当算出一个坐标以后直接把该坐标的数值置零。第一个难点是在老师要求要一次画多条直线,这就要求能识别一个矩阵当中的多个端点。其实也没有很难的地方,但是就要求在给出的矩阵中循环取出两个坐标,在这里还用到了c,d=size(x),目的是计算出给出的矩阵宽度,从而两个两个取出坐标,for f=1:2:d
10、。第二个难点是直线去锯齿的问题。由于所画的直线是由单像素点构成,所以难免会出现锯齿,但在画图工具或其他图像中,锯齿并不会很明显。经过网络查阅,了解到基本上有两种方法去锯齿,一是通过模糊化处理,多个图层模糊以后缩小给人的感觉好像锯齿不明显了。但是由于难度较高并且要用到其他软件,所以这种方法不能实现。二是画图软件中的处理。老师曾叫我们去放大画图软件的直线,看看用的是什么方法。经过试验以后发现画图软件中用的是一种近似障眼法的方法,它并不像我们画出来的图,每一个锯齿都是均匀的,二十每隔几个点锯齿小一点,再隔几个又变大,这样给人的感觉没有那个粗的锯齿感。于是模仿这种方法,我做了如下的改动:if (rem
11、(y_k,8)=4) x_k=ceil(x_k); else x_k=round(x_k); end对每个算出来y值对8取余,如果取出来的余数大于四,则把这个y值向上取余,如果小于四,则把y四舍五入。这样,就把y值在0.5的分界点做了改动,由于8除任何数的余数范围在08,所以相当于在半数的y上把y值增大了,而剩下的半数y值不变,于是输出的直线如下:虽然没有画图软件的美观,但是可以明显的看出,在原本等距的锯齿中有一段是比较窄,一段是比较长,然后交错下去的。虽然在询问多个同学后表示比之前的锯齿更加明显,但是在我眼中的虽说给人感觉更加扭曲了一点,但是锯齿感还是有所降低。-(圆篇)-画圆代码的编写虽说
12、老师并没有明确的分析,但是经过画直线的铺垫,也有了大致的想法。同样是确定方程,然后把一个方向上的坐标按规律变化,算出另一个坐标,然后把数置零。由于是画圆,所以并不存在以哪一个为基准的问题。遇到的难点就是第一次画出来的圆存在断点的问题。由于经过分析是不可避免的,所以在最后选择人工连起断点的方法:if(abs(y_1-y_k1)!=0|abs(y_1-y_k1)!=1) y_a=y_1 y_k1; y_b=y_2 y_k2; I(min(y_a):max(y_a)-1,x_kk)=0; I(min(y_b):max(y_b)-1,x_kk)=0; end在这里是把每个算出来的y值与前一个y值进行比
13、较,如果它们之差不为0或者不为1,那么就强行把它们之间的数都置为0(原画板矩阵值为200),结果为:图三程序中也加入了一个小判断,如果算出来的y值超过了画板的边界,就会自动在边界画出一条直线,形成一个半圆。但是画出来的圆锯齿感很强,并且有不少的突出(图三),在此,我又去画图工具中比较,发现画图中运用的是类似的方法,并且也有不少不美观的地方(图四、五),于是我就放弃了进一步的美化。图四图五不得不说,在这一次的课程设计中,体会也感受到了很多没有经过完整写一个代码感受不到的,至少整个过程要思考是的东西很多,这点应该得益于老师的教学方法,我想这种方法值得提倡。虽然说这一个写的程序还有诸多的不完美,譬如
14、没有完成拓展2的虚线,点划线的设计,画出来的圆不好看,画圆的时候对于,但是我觉得,只要真正花费了心思去完成并且收获了东西,那就足够了。9、附录n 完整源代码及注释(除部分简单语句外,如end,基本上每行都需要注释)(1)画直线代码function Y = ex03_drawline(I, x, y)% 线段作图% I : 输入画板矩阵, uint8% x : 线段各端点的x坐标,行向量,其中(x1,x2)是第一条线段的,(x3,x4)是第二条的,如此类推% y : 线段各端点的y坐标,行向量,其中(y1,y2)是第一条线段的,(y3,y4)是第二条的,如此类推% Y : 输出画板矩阵, uin
15、t8tic;%计算x向量的长度c,d=size(x);%每次取两个点作为直线的端点for f=1:2:d x_1=x(f) x(f+1); y_1=y(f) y(f+1); %若斜率不存在,则直接画出数值的线 if (x_1(1) = x_1(2) I(min(y_1):max(y_1),x_1(1)=0; else %算出直线参数a、b a=(y_1(1)-y_1(2)/(x_1(1)-x_1(2); b=y_1(1)-a*x_1(1); %求出画板矩阵的大小,方便下面坐标变换 m,n=size(I);%如果直线斜率为0,那么也是直接画出直线 if (a=0) I(y_1(1),min(x_
16、1):max(x_1)=0; else%如果直线的斜率大于1或小于-1,那么以y为基准,求出x的坐标 if (a1 |a=4) x_k=ceil(x_k); else x_k=round(x_k); end%坐标变换,把双下标转换成单下标,方便后面置0 k=(x_k-1)*m+y_k;%把算出来的坐标对置0 I(k)=0; else%如果直线的斜率绝对值小于1,那么以x为基准,求出y的坐标 x_k=min(x_1):max(x_1);%把两个端点间步长为1的点带入方程中,求的y y_k=a*x_k+b;%简单去齿痕,如果算出的y值对8的余数大于四,则把y四舍五入 if (rem(x_k,8)=
17、4) y_k=ceil(y_k); else y_k=round(y_k); end%坐标变换,把双下标转换成单下标,方便后面置0 k=(x_k-1)*m+y_k;%把算出来的坐标对置0 I(k)=0; end end end%把I以uint8的形式赋YY=uint8(I);end toc;end (2) 画圆代码function Y = ex03_drawcircle(I, x, y, r)% 圆作图% I : 输入画板矩阵, uint8% x : 圆心的x坐标,行向量% y : 圆心的y坐标,行向量% r : 圆的半径,行向量% Y : 输出画板矩阵, uint8tic;%算出I的大小方便
18、下面画半圆判断a,b=size(I);%算出圆的两个边界坐标x_1=x-r;x_2=x+r;%把y_1、y_2初始值置为yy_1=y;y_2=y;x_kk=x_1;%以x为基准,把两个边界点间步长为1的点带入算出两个y值 for x_k=x_1:x_2 y_k1=sqrt(r2-(x_k-x)2)+y; y_k2=-sqrt(r2-(x_k-x)2)+y;%如果算出来的y_k2小于等于零,则强行置为1,画出半圆 if(y_k2b) y_k2=b; end y_k1=round(y_k1); y_k2=round(y_k2);%比较前后两个算出来的y值,如果不相连,则强行连起来 if(abs(y_1-y_k1)!=0|abs(y_1-y_k1)!=1) y_a=y_1 y_k1; y_b=y_2 y_k2; I(min(y_a):max(y_a)-1,x_kk)=0; I(min(y_b):max(y_b)-1,x_kk)=0; end%记录旧算出来的y值与k值,方便后面断点比较 y_1=y_k1; y_2=y_k2; x_kk=x_k;%把算出来的坐标对在I中置零 I(y_1,x_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西省咸阳市(2024年-2025年小学五年级语文)人教版期末考试(下学期)试卷及答案
- 2024年进口食品项目资金申请报告代可行性研究报告
- 2024年飞机盒项目资金申请报告代可行性研究报告
- 2024年含高功能组分的低聚糖项目资金申请报告代可行性研究报告
- 2023年园林艺术陶瓷制品资金申请报告
- 2024-2025学年重庆乌江新高考协作体高三上学期二调物理试题及答案
- 企业文化部门培训
- 上海市市辖区(2024年-2025年小学五年级语文)人教版竞赛题((上下)学期)试卷及答案
- 五年级数学(小数四则混合运算)计算题专项练习及答案汇编
- 餐饮单位食品安全培训
- 《光伏发电站防雷技术要求》
- 城市轨道十四五规划
- MySQL数据库备份与恢复技术研究
- 新能源汽车维修施工单(模板)
- 110kV变电所电气一次专业系统设计
- 寝室室长工作总结个人工作总结
- 日本初级课本-标准日本语初级上册课文(附中文对照)
- 小儿过敏性休克课件
- 广东省深圳市深圳实验学校初中部2023-2024学年七年级上学期英语期中考试卷
- (高清版)TDT 1062-2021 社区生活圈规划技术指南
- 安全生产治本攻坚三年行动方案(2024-2026年)解读
评论
0/150
提交评论