天天看点

计算机图形学笔记之Bresenham直线光栅化算法

计算机图形学笔记之Bresenham直线光栅化算法

代码:

#include<GL/glut.h>
#include<iostream>
#include<math.h>
using namespace std;
#define PI 3.14
GLfloat pointsize = 1.0f;

int isign(int x)
{
	if (x > 0)
		return 1;
	else if (x == 0)
		return 0;
	else return -1;
}

void lineBres(int x0, int y0, int xEnd, int yEnd)//起点坐标:(x0,y0),终点坐标(xEnd,yEnd)
{
	int dx = fabs(xEnd - x0), dy = fabs(yEnd - y0),sx=isign(xEnd-x0),sy=isign(yEnd-y0);
	bool flag;
	if (dy > dx)
	{
		swap(dx, dy);
		flag = 1;
	}
	else
		flag = 0;
	int NError = 2 * dy - dx;//误差值
	int x=x0, y=y0;

	for (int i = 0;i < dx;i++)
	{
		glVertex2i(x,y);
		if (NError >= 0)
		{
			if (flag)
				x = x + sx;
			else
				y = y + sy;
			NError = NError - 2 * dx;
		}
		if (flag)
			y = y + sy;
		else
			x = x + sx;
		NError = NError + 2 * dy;
	}	
}



void display() {          
	glClear(GL_COLOR_BUFFER_BIT);	
	glBegin(GL_POINTS);
	lineBres(0, 0, 300, 400);
	glEnd();
	glFlush();
}
int main(int argc, char** argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("直线光栅化");
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-500.0, 500.0, -500.0, 500.0);
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

           

运行结果:

计算机图形学笔记之Bresenham直线光栅化算法

继续阅读