欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    绘制任意斜率的直线.doc

    • 资源ID:24092327       资源大小:129.50KB        全文页数:8页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    绘制任意斜率的直线.doc

    【精品文档】如有侵权,请联系网站删除,仅供学习与交流绘制任意斜率的直线.精品文档.淮海工学院计算机工程学院实验报告书课程名: 计算机图形学 题 目: 绘制任意斜率的直线 班 级: 测绘121 学 号: 2012122827 姓 名: 王其芳 评语:成绩: 指导教师: 批阅时间: 年 月 日一、实验目的或要求1. 掌握任意斜率直线的绘制算法。2. 掌握直线中点Bresenham算法的基本原理,能够用VC+实现该算法。二、 实验内容1、掌握直线段的生成算法,并用C+实现算法,包括中点法生成直线。2、编程实现DDA算法、Bresenham算法、中点画线法绘制直线段三、实验代码1、生成直线的DDA算法算法思想:一个坐标轴上以单位间隔增量,决定另一个坐标轴上最靠近线段路径的对应整数值。假定x2x1的绝对值大于y2y1的绝对值,取x为一个象素单位长,即x 每次递增一个象素,然后利用下式计算相应的y值:yk+1ykyykm·x 对于|m|1的线段,可通过计算由Y方向的增量y引起的改变来生成直线: xk+1xkxxkm·y生成直线的DDA算法思想是源用初中直线的方程得出来的,而生成直线的中点算法是通过将DDA算法的方程式改为隐函数形式,然后通过与中点的比较确定该取的像素,绘制图线。/* DDA */#include<graphics.h>void linedda(int x0,int y0,int x1,int y1,int color)int x,dy,dx,y;float m;dx=x1-x0;dy=y1-y0;m=dy/dx;y=y0;for(x=x0;x<=x1;x+)putpixel(x,(int)(y+0.5),color);y+=m;main()int a,b,c,d,e;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode,"");cleardevice();a=0;b=100;c=200;d=300;e=200;linedda(a,b,c,d,e);getch();closegraph();运行结果:VC+环境:#include <graphics.h>#include <conio.h>/ 四舍五入int Round(float x)return (int)(x < 0 ? x - 0.5 : x + 0.5);/ 使用 DDA 算法画任意斜率的直线(包括起始点,不包括终止点)void Line_DDA(int x1, int y1, int x2, int y2, int color)float x, y;/ 当前坐标点float cx, cy;/ x、y 方向上的增量int steps = abs(x2 - x1) > abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1);x = (float)x1;y = (float)y1;cx = (float)(x2 - x1) / steps;cy = (float)(y2 - y1) / steps;for(int i = 0; i < steps; i+)putpixel(Round(x), Round(y), color);/ 在坐标 (x, y) 处画一个 color 颜色的点x += cx;y += cy;/ 主函数void main()initgraph(640, 480);/ 测试画线Line_DDA(100, 100, 100, 478, RED);/ 按任意键退出getch();2、Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。 Bresenham画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进行直线的扫描的转换的。通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的像素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的所有对象。根据直线的斜率确定选择变量在X方向上或在Y方向上每次递增一个单位,另一变量的增量为0或1,它取决于实际直线与最近网格点位置的距离,这一距离称为误差。设第k步的误差为ek,选取上面象素点后的积累误差为:ek+1ek(m1)选取下面的象素点后的积累误差为:ek+1ekm/* Bresenham */程序代码如下:#include <graphics.h>#include <conio.h>/ 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Bresenham(int x1, int y1, int x2, int y2, int color)int x = x1;int y = y1;int dx = abs(x2 - x1);int dy = abs(y2 - y1);int s1 = x2 > x1 ? 1 : -1;int s2 = y2 > y1 ? 1 : -1;bool interchange = false;/ 默认不互换 dx、dyif (dy > dx)/ 当斜率大于 1 时,dx、dy 互换int temp = dx;dx = dy;dy = temp;interchange = true;int p = 2 * dy - dx;for(int i = 0; i < dx; i+)putpixel(x, y, color);if (p >= 0)if (!interchange)/ 当斜率 < 1 时,选取上下象素点y += s2;else/ 当斜率 > 1 时,选取左右象素点x += s1;p -= 2 * dx;if (!interchange)x += s1;/ 当斜率 < 1 时,选取 x 为步长elsey += s2;/ 当斜率 > 1 时,选取 y 为步长p += 2 * dy;/ 主函数void main()initgraph(640, 480);/ 测试画线Line_Bresenham(10, 100, 100, 478,BLUE);Line_Bresenham(10, 478, 638, 1, RED);/ 按任意键退出getch();运行结果如下:3、生成直线的中点算法算法思想:中点算法主要是利用椭圆的正负划分性,利用已知或以求出的点,根据递推关系来判断下一个点的位置。中点算法有效地消除了DDA浮点运算效率低下的问题,将直线的斜率m转化为可加的数,然后通过中点来确定要选择的点,这样使得中点算法的效率大大提高,使之成为被图形软件广泛采用的算法之一。 代码如下:#include <graphics.h>#include <conio.h>/ 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Midpoint(int x1, int y1, int x2, int y2, int color)int x = x1, y = y1;int a = y1 - y2, b = x2 - x1;int cx = (b >= 0 ? 1 : (b = -b, -1);int cy = (a <= 0 ? 1 : (a = -a, -1);putpixel(x, y, color);int d, d1, d2;if (-a <= b)/ 斜率绝对值 <= 1d = 2 * a + b;d1 = 2 * a;d2 = 2 * (a + b);while(x != x2)if (d < 0)y += cy, d += d2;elsed += d1;x += cx;putpixel(x, y, color);else/ 斜率绝对值 > 1d = 2 * b + a; d1 = 2 * b;d2 = 2 * (a + b);while(y != y2) if(d < 0)d += d1; else x += cx, d += d2; y += cy; putpixel(x, y, color);/ 主函数void main()initgraph(640, 480);/ 测试画线Line_Midpoint(100, 50, 100, 478, GREEN);Line_Midpoint(1, 478, 638, 1, BLUE);/ 按任意键退出getch();四、实验结果1、该程序实现了三种算法的直线段绘制2、比较三种算法的结果:像素逼近效果由好到差依次为:Bresenham算法、DDA算法、中点算法执行速度由快到慢依次为: 中点算法、DDA算法、Bresenham算法五、实验分析与体会 通过此次实验我对计算机图形学有了实际的认识,计算机图形学对我们的生活有很多的益处。学习之后我知道了计算机图形学是研究怎样利用计算机来显示,生成和处理图形的原理,方法和技术的一门学科。虽然一开始有些许不懂和茫然,但是经过老师的指导,我还是完成了这次的实验。

    注意事项

    本文(绘制任意斜率的直线.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开