- 38
- 0
- 约 9页
- 2015-10-24 发布于河南
- 举报
绘制任意斜率的直线
淮海工学院计算机工程学院
实验报告书
课程名: 计算机图形学
题 目: 绘制任意斜率的直线
班 级: 测绘121
学 号: 2012122827
姓 名: 王其芳
一、实验目的或要求
掌握任意斜率直线的绘制算法。掌握直线中点Bresenham算法的基本原理,能够用VC++实现该算法。
2、编程实现DDA算法、Bresenham算法、中点画线法绘制直线段
三、实验代码
1、生成直线的DDA算法
算法思想:一个坐标轴上以单位间隔增量,决定另一个坐标轴上最靠近线段路径的对应整数值。假定x2﹣x1的绝对值大于y2﹣y1的绝对值,取x为一个象素单位长,即x 每次递增一个象素,然后利用下式计算相应的y值:yk+1﹦yk﹢△y﹦yk﹢m·△x
对于|m|>1的线段,可通过计算由Y方向的增量△y引起的改变来生成直线: xk+1﹦xk﹢△x﹦xk﹢m·△y
生成直线的DDA算法思想是源用初中直线的方程得出来的,而生成直线的中点算法是通过将DDA算法的方程式改为隐函数形式,然后通过与中点的比较确定该取的像素,绘制图线。
/* DDA */
#includegraphics.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,选取
原创力文档

文档评论(0)