绘制任意斜率的直线(20200930121829)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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互换

相关文档
最新文档