Bresenham画线算法的实现

Bresenham画线算法简介

只介绍当直线的斜率小于1大于0时的算法:

  1. 输入线段的两个端点
  2. 计算Δx,Δy\Delta x, \Delta y,得到P0=2ΔyΔxP_{0}=2\Delta y-\Delta x,
  3. k=0k=0开始,对于每个xkx_{k},检测PkP_{k}的符号:
    Pk<0P_{k} < 0:下一个要绘制的点为(xk+1,yk)\left ( x_{k}+1, y_{k} \right ),并且Pk+1=Pk+2ΔyP_{k+1}=P_{k}+2\Delta y
    否则:下一个要绘制的点为(xk,yk+1)\left ( x_{k}, y_{k} +1 \right ),并且Pk+1=Pk+2Δy2ΔxP_{k+1}=P_{k}+2\Delta y - 2\Delta x
  4. 重复步骤3,共Δx1\Delta x-1

效果

画线效果

代码

#include <GL/glut.h>
#include <cmath>

template<typename T>T Max(T x, T y) {
	return (x > y ? x : y);
}
void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0, 800, 0.0, 600);
}
void Drawline(int x0, int y0, int xEnd, int yEnd)
{
	int dx = (xEnd >= x0 ? xEnd - x0 : x0 - xEnd), dy = (xEnd >= x0 ? yEnd - y0 : y0 - yEnd); //线从左往右画
	int x = (xEnd >= x0 ? x0 : xEnd), y = (xEnd >= x0 ? y0 : yEnd);
	if (fabs(dy) <= dx) { //斜率小于1
		int _2dy_dx = 2 * (fabs(dy) - dx);
		int _2dy = 2 * fabs(dy);
		int p = _2dy - dx; //决策参数初始值
		glVertex2i(x, y);
		while (x < Max(xEnd, x0))
		{
			x++; //因为斜率小于1,横座标每次进1
			if (p < 0)
				p += _2dy;
			else
			{
				y += (dy >= 0 ? 1 : -1);
				p += _2dy_dx;
			}
			glVertex2i(x, y);
		}
	}
	else { //斜率大于1, dx和dy地位互换
		int _2dx = 2 * dx;
		int _2dx_dy = 2 * (dx - fabs(dy));
		int ddy = (dy >= 0 ? 1 : -1);
		int p = 2 * dx - fabs(dy);
		glVertex2i(x, y);
		while (x < Max(xEnd, x0))
		{
			y += ddy; //因为斜率大于1,纵座标每次进1
			if (p < 0)
				p += _2dx;
			else
			{
				x++;
				p += _2dx_dy;
			}
			glVertex2i(x, y);
		}
	}
}
void Display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.0, 0.0);
	glPointSize(3);
	glBegin(GL_POINTS);
	Drawline(10, 10, 700, 600);
	Drawline(10, 10, 300, 700);
	Drawline(700, 10, 10, 600);
	Drawline(700, 10, 300, 700);
	glEnd();
	glFlush();
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(800, 600);
	glutCreateWindow("Bresenham");
	init();
	glutDisplayFunc(Display);
	glutMainLoop();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章