c语言 绘制任意斜率的直线,绘制任意斜率的直线

本文详细介绍了计算机图形学实验中绘制任意斜率直线的三种算法:DDA算法、Bresenham算法和中点算法。通过C++代码实现并对比了它们的像素逼近效果和执行速度,实验结果显示Bresenham算法在效果和效率上最优。实验加深了作者对计算机图形学的理解,并认识到其在实际应用中的价值。
摘要由CSDN通过智能技术生成

《绘制任意斜率的直线》由会员分享,可在线阅读,更多相关《绘制任意斜率的直线(9页珍藏版)》请在人人文库网上搜索。

1、淮海工学院计算机工程学院实验报告书课程名: 计算机图形学 题 目: 绘制任意斜率的直线 班 级: 测绘121 学 号: 27 姓 名: 王其芳 评语:成绩: 指导教师: 批阅时间: 年 月 日.一、实验目的或要求1. 掌握任意斜率直线的绘制算法。2. 掌握直线中点Bresenham算法的基本原理,能够用VC+实现该算法。二、 实验内容1、掌握直线段的生成算法,并用C+实现算法,包括中点法生成直线。2、编程实现DDA算法、Bresenham算法、中点画线法绘制直线段三、实验代码1、生成直线的DDA算法算法思想:一个坐标轴上以单位间隔增量,决定另一个坐标轴上最靠近线段路径的对应整数值。假定x2x1。

2、的绝对值大于y2y1的绝对值,取x为一个象素单位长,即x 每次递增一个象素,然后利用下式计算相应的y值:yk+1ykyykmx 对于|m|1的线段,可通过计算由Y方向的增量y引起的改变来生成直线: xk+1xkxxkmy生成直线的DDA算法思想是源用初中直线的方程得出来的,而生成直线的中点算法是通过将DDA算法的方程式改为隐函数形式,然后通过与中点的比较确定该取的像素,绘制图线。/* DDA */#includevoid 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。

3、=dy/dx;y=y0;for(x=x0;x#include / 四舍五入int Round(float x)return (int)(x 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 #include / 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Bresenham(int x1, int y1。

4、, 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 = 。

5、0)if (!interchange)/ 当斜率 1 时,选取左右象素点x += s1;p -= 2 * dx;if (!interchange)x += s1;/ 当斜率 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、生成直线的中点算法算法思想:中点算法主要是利用椭圆的正负划分性,利用已知或以求出的点,根据递。

6、推关系来判断下一个点的位置。中点算法有效地消除了DDA浮点运算效率低下的问题,将直线的斜率m转化为可加的数,然后通过中点来确定要选择的点,这样使得中点算法的效率大大提高,使之成为被图形软件广泛采用的算法之一。 代码如下:#include #include / 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)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。

7、);int cy = (a 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算法五、实验分析与体会通过此次实验我对计算机图形学有了实际的认识,计算机图形学对我们的生活有很多的益处。学习之后我知道了计算机图形学是研究怎样利用计算机来显示,生成和处理图形的原理,方法和技术的一门学科。虽然一开始有些许不懂和茫然,但是经过老师的指导,我还是完成了这次的实验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值