绘制任意斜率的直线(20200930121829)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮海工学院计算机工程学院
实验报告书
、实验目的或要求
1. 掌握任意斜率直线的绘制算法。
2. 掌握直线中点Bresenham算法的基本原理,能够用VC+实现该算法。
二、实验内容
1、掌握直线段的生成算法,并用C++实现算法,包括中点法生成
直线。
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 */
#include<>
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,( in t)(y+,color);
y+=m;
}
}
main ()
{
int a,b,c,d,e;
in t graphdriver=DETECT;
int graphmode=0;
in itgraph(&graphdriver, &graphmode,""); cleardevice();
a=0;
b=100;
c=200;
d=300;
e=200;
lin edda(a,b,c,d,e);
getch();
closegraph();
}
运行结果:
□
1112.exe
VC++环境:
#in clude <>
#in clude <>
//四舍五入
int Rou nd(float x)
{
return (in t)(x < 0 x - : x + ;
// 使用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();
}
二
OtX). exe
2、Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在n维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。
Bresenham画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进
行直线的扫描的转换的。通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定
该列象素中与此交点最近的像素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的所有对象。
根据直线的斜率确定选择变量在X方向上或在Y方向上每次递增一个单位,另一变量的增量
为0或1,它取决于实际直线与最近网格点位置的距离,这一距离称为误差。设第k步的误
差为ek,选取上面象素点后的积累误差为:ek+1 = ek +( m- 1)选取下面的象素点后的积
累误差为:ek+1 = ek+ m
/* Brese nham */ 程序代码如下:
#in elude <>
#in elude <>
II使用Bresenham算法画任意斜率的直线(包括起始点,不包括终止点)
void Lin e_Brese nham(i nt 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 si = x2 > x1 1 : -1;
int s2 = y2 > y1 1 : -1;
bool in tereha nge = false; if (dy > dx)
{
int temp = dx;
dx = dy; II默认不互换dx、dy
II当斜率大于1时,dx、dy互换