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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章