Advertisement

计算机图形学笔记之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;
    }

运行结果:

全部评论 (0)

还没有任何评论哟~