计算机图形学-实验2-Bresenham画线算法

实验二:

一、 实验目的:

理解Bresenham画线算法

 

二、 实验内容:

编写程序,用Bresenham画线算法实现水平、垂直、斜率大于1斜率小于1斜率为正、斜率为负等各种情况。

 

三、 实现效果及步骤(或流程)

实现效果如下图:

计算机图形学-实验2-Bresenham画线算法_第1张图片

四、 创新设计和实现方法

(1)键盘事件,按F1清空屏幕,按F2退出应用。

实现方法:

1.第一步,main函数内添加对该方法的调用。


2.第二步,申请全局变量。


3.最后,编辑函数void ProcessSpecialKeyboead(int key,int x,int y)。

计算机图形学-实验2-Bresenham画线算法_第2张图片

(2)鼠标事件,点击窗口内两点,划线。

计算机图形学-实验2-Bresenham画线算法_第3张图片

实现方法:

1.第一步,main函数内添加对该方法的调用。


2.第二步,申请全局变量。分别用以代表鼠标的左键、右键、按压以及抬起。


3.最后,编辑函数DrawLine(int button,int state,int x,int y)。参数button代表鼠标按键、state代表状态(抬起或按压)以及x、y代表坐标(以窗口左上角为起点)。

计算机图形学-实验2-Bresenham画线算法_第4张图片


核心画线码如下:

void lineBres(int x0, int y0, int xEnd, int yEnd)
{
	glPointSize(2);
	glColor3f(0.1, 0.0, 0.0);
	glBegin(GL_POINTS);
	//画第一个点
	if (x0 > xEnd)
	{
		int t;
		t = x0; x0 = xEnd; xEnd = t;
		t = y0; y0 = yEnd; yEnd = t;
	}
	int x = x0;
	int y = y0;
	glVertex2i(x, y);
	//当线段垂直时。
	if (x0 == xEnd)
	{
		while (y < yEnd)
		{
			y++;
			glVertex2i(x, y);
		}
		glEnd();
		glFlush();
		return;
	}
	//当线段水平时。
	if (y0 == yEnd)
	{
		while (x < xEnd)
		{
			x++;
			glVertex2i(x, y);
		}
		glEnd();
		glFlush();
		return;
	}
	int dx = xEnd - x0;
	int dy = yEnd - y0;
	int twoDx = 2 * dx;
	int twoDy = 2 * dy;
	int twoDyMinusDx = 2 * (dy - dx);
	int twoDxMinusDy = 2 * (dx - dy);
	int twoDxAddDy = 2 * (dx + dy);
	int p;
	double k = (double)(yEnd - y0) / (double)(xEnd - x0);//斜率

	//当线段斜率0= -1)
	{
		p = 2 * dy + dx;
		while (x < xEnd)
		{
			x++;
			if (p >= 0)
				p += twoDy;
			else
			{
				y--;
				p += twoDxAddDy;
			}
			glVertex2i(x, y);
		}
		glEnd();
		glFlush();
		return;
	}
	//当线段斜率k<-1时。
	if (k < -1)
	{
		p = 2 * dx - dy;
		while (y > yEnd)
		{
			y--;
			if (p >= 0)
				p -= twoDx;
			else
			{
				x++;
				p -= twoDxAddDy;
			}
			glVertex2i(x, y);
		}
		glEnd();
		glFlush();
		return;
	}
	//当线段斜率k>1时。
	if (k > 1)
	{
		p = dy;
		while (y < yEnd)
		{
			y++;
			if (p < 0)
			{
				p += twoDx;
			}
			else
			{
				x++;
				p -= twoDyMinusDx;
			}
			glVertex2i(x, y);
		}
		glEnd();
		glFlush();
		return;
	}
}



你可能感兴趣的:(计算机图形学-实验2-Bresenham画线算法)