#include <GL/glut.h> 
#include<iostream>
#include<math.h>
using namespace std;
GLfloat pointsize = 1.0f;
void init(void)
{

	glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色

	glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
	gluOrtho2D(-200.0, 200.0, -200.0, 200.0);///*设定映射区域,参数为(minX,maxX,minY,maxY),(minX,minY为原点);(maxX, maxY)为右上角的点* /
}
double D2R(double deg) {
	return deg / 180.0 * 3.14159265;
}

void Bresenham_drawOneLine(GLint xs, GLint ys, GLint xe, GLint ye) {
	GLint  x = xs;
	GLint  y = ys;
	int  flag;//用以表示是否发生了交换
	GLint dx = abs(xe - xs);
	GLint dy = abs(ye - ys);
	GLint sx = ((xe > xs)?1:-1);
	GLint sy = ((ye > ys)?1:-1);
	if (dy > dx)
	{
		swap(dx, dy);
		flag = 1;
	}
	else
	{
		flag = 0;
	}
	cout << flag;
	GLfloat Nerror =2*dy - dx;//开始在光栅点处,d=0,下一个点处d=k
	for (int i = 1; i < dx; i++)
	{
		glBegin(GL_LINES);
		glColor3f(1.0f, 0.0f, 0.0f);
		//cout << x << y << endl;
		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;
	}
	glEnd();//结束

	glFlush();

	/*OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。

	glFlush都是强制将命令缓冲区的内容提交给硬件执行。*/
}
void Bresenham_Rotationline()
{
	
	glClear(GL_COLOR_BUFFER_BIT);			//清除所有的像素
	glEnable(GL_LINE_STIPPLE);				//点画线模式
	float t = 0;
	glColor3f(1.0, 0.0, 0.0);					//使用红色绘制该线段
	for (double i = 0; i <=360; i =i+5)
	{
		cout << i << endl;
		Bresenham_drawOneLine(0, 0, 100*cos(D2R(i)), 100*sin(D2R(i)));
	}

	//Bresenham_drawOneLine(0, 0,-50, -100);
	//Bresenham_drawOneLine(200, 200, 0, 0);
	//Bresenham_drawOneLine(-200, -200, 0, 0);
	//Bresenham_drawOneLine(200,- 200, 0, 0);
	glFlush();
}
int main(int argc, char ** argv)

{

	/*初始化*/

	glutInit(&argc, argv);

	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//单缓冲、RGB模式

	glutInitWindowSize(400, 400);

	glutInitWindowPosition(200, 200);

	glutCreateWindow("Bresenham直线光栅化算法");//窗口标题

	init();

	/*绘制与显示*/

	//glutReshapeFunc(myReshape);//窗口大小发生改变时采取的行为

	glutDisplayFunc(Bresenham_Rotationline);//将图传递给显示窗口,参数是描述的一个程序,即调用这个函数再送到显示窗口

	glutMainLoop();//循环

	return(0);//去掉这个函数,程序窗口一打开就马上关闭了

}



在这里插入图片描述
加上颜色之后的版本为


#include <GL/glut.h> 
#include<iostream>
#include<math.h>
using namespace std;
GLfloat pointsize = 1.0f;
void init(void)
{

	glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色

	glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
	gluOrtho2D(-200.0, 200.0, -200.0, 200.0);///*设定映射区域,参数为(minX,maxX,minY,maxY),(minX,minY为原点);(maxX, maxY)为右上角的点* /
}
double D2R(double deg) {
	return deg / 180.0 * 3.14159265;
}

void Bresenham_drawOneLine(GLint xs, GLint ys, GLint xe, GLint ye) {
	GLint  x = xs;
	GLint  y = ys;
	int  flag;//用以表示是否发生了交换
	GLint dx = abs(xe - xs);
	GLint dy = abs(ye - ys);
	GLint sx = ((xe > xs)?1:-1);
	GLint sy = ((ye > ys)?1:-1);
	if (dy > dx)
	{
		swap(dx, dy);
		flag = 1;
	}
	else
	{
		flag = 0;
	}
	cout << flag;
	GLfloat Nerror =2*dy - dx;//开始在光栅点处,d=0,下一个点处d=k
	for (int i = 1; i < dx; i++)
	{
		glBegin(GL_LINES);
		//glColor3f(1.0f, 0.0f, 0.0f);
		//cout << x << y << endl;
		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;
	}
	glEnd();//结束

	glFlush();

	/*OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。

	glFlush都是强制将命令缓冲区的内容提交给硬件执行。*/
}
void Bresenham_Rotationline()
{
	
	glClear(GL_COLOR_BUFFER_BIT);			//清除所有的像素
	glEnable(GL_LINE_STIPPLE);				//点画线模式
	float t = 0;
	//glColor3f(1.0, 0.0, 0.0);					//使用红色绘制该线段
	for (double i = 0; i <=360; i =i+5)
	{	if (0<=i&&i<=45)
		 glColor3f(1.0, 0.0, 0.0);
	else if(45<i&&i<=90)
		glColor3f(0.0, 1.0, 1.0);
	else if (90 < i&&i <=135)
		glColor3f(1.0, 1.0, 1.0);
	else if (135 < i&&i <=180)
		glColor3f(1.0, 0.6, 0.4);
	else if (180 < i&&i <=225)
		glColor3f(1.0, 1.0, 0.9);
	else if (225 < i&&i <=270)
		glColor3f(0.2, 0.6, 0.5);
	else if (270 < i&&i <=315)
		glColor3f(1.0, 0.7, 1.0);
	else  
		glColor3f(0.5, 0.5, 0.5);
	
		cout << i << endl;
		Bresenham_drawOneLine(0, 0, 150*cos(D2R(i)), 150*sin(D2R(i)));
	}

	//Bresenham_drawOneLine(0, 0,-50, -100);
	//Bresenham_drawOneLine(200, 200, 0, 0);
	//Bresenham_drawOneLine(-200, -200, 0, 0);
	//Bresenham_drawOneLine(200,- 200, 0, 0);
	glFlush();
}
int main(int argc, char ** argv)

{

	/*初始化*/

	glutInit(&argc, argv);

	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//单缓冲、RGB模式

	glutInitWindowSize(400, 400);

	glutInitWindowPosition(200, 200);

	glutCreateWindow("Bresenham直线光栅化算法");//窗口标题

	init();

	/*绘制与显示*/

	//glutReshapeFunc(myReshape);//窗口大小发生改变时采取的行为

	glutDisplayFunc(Bresenham_Rotationline);//将图传递给显示窗口,参数是描述的一个程序,即调用这个函数再送到显示窗口

	glutMainLoop();//循环

	return(0);//去掉这个函数,程序窗口一打开就马上关闭了

}



在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐