⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 breshamline.cpp

📁 数值计算算法,BreshamLine画线算法,数值计算实验,比较简单
💻 CPP
字号:
#include <Windows.h>
#include <gl/glut.h>
#include <time.h>

//子像素列数

#define SUBSIZE 2

//色彩混合公式
#define CONVERT(a,b) (a*0.5+b*0.5)


//global values
const int ciWidth=400;
const int ciHeight=300;


void Init(void)
{
	glClearColor(1.0,1.0,1.0,0.0);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0,400.0,0.0,300.0);


}

void glmGetPixel2i(int cx,int cy,unsigned char * color)
{
	glReadPixels(cx,cy,1,1,GL_RED,GL_UNSIGNED_BYTE,color);
}

void glmSetPixel2i(int cx,int cy)
{
	glBegin(GL_POINTS);
		glVertex2i(cx,cy);
	glEnd();
}

void DrawLine2Di(int x0,int y0,int xEnd,int yEnd,double red=0,double green=0,double blue=0)
{
	//glClearColor(GL_COLOR_BUFFER_BIT);
	glColor3f(red,green,blue);

	unsigned char color[4];

	int tred=red*255;
	int tgreen=green*255;
	int tblue=blue*255;

	x0=x0*SUBSIZE;
	y0=y0*SUBSIZE;
	xEnd=xEnd*SUBSIZE;
	yEnd=yEnd*SUBSIZE;


	//加入反走样

	int dx=x0>xEnd?(x0-xEnd):(xEnd-x0);
	int dy=y0>yEnd?(y0-yEnd):(yEnd-y0);

	int d2x=2*dx;
	int d2y=2*dy;

	int x,y;

	if(dy<dx)
	{
		int p=d2y-dx;

		if(x0>xEnd)
		{
			x=xEnd;
			y=yEnd;
			xEnd=x0;
		}
		else
		{
			x=x0;
			y=y0;
		}
		//反走样变换
		glReadPixels(x/SUBSIZE,y/SUBSIZE,1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);

		//变换公式
		color[0]=CONVERT(color[0],tred);
		color[1]=CONVERT(color[1],tgreen);
		color[2]=CONVERT(color[2],tblue);

		glRasterPos2i(x/SUBSIZE,y/SUBSIZE);
		glDrawPixels(1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);
		//不带反走样
		//glmSetPixel2i(x/SUBSIZE,y/SUBSIZE);
		

		while(x<xEnd)
		{
			x++;
			if(p<0)
			{
				p+=d2y;
			}
			else
			{
				y++;
				p+=d2y-d2x;
			}
			//
			glReadPixels(x/SUBSIZE,y/SUBSIZE,1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);

			color[0]=CONVERT(color[0],tred);
			color[1]=CONVERT(color[1],tgreen);
			color[2]=CONVERT(color[2],tblue);

			glRasterPos2i(x/SUBSIZE,y/SUBSIZE);
			glDrawPixels(1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);
			//glmSetPixel2i(x,y);
		}
	}
	else
	{
		int p=d2x-dy;



		if(y0>yEnd)
		{
			y=yEnd;
			x=xEnd;
			yEnd=y0;
		}
		else
		{
			x=x0;
			y=y0;
		}
		
		glReadPixels(x/SUBSIZE,y/SUBSIZE,1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);

		color[0]=CONVERT(color[0],tred);
		color[1]=CONVERT(color[1],tgreen);
		color[2]=CONVERT(color[2],tblue);

		glRasterPos2i(x/SUBSIZE,y/SUBSIZE);
		glDrawPixels(1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);
		//glmSetPixel2i(x,y);

		while(y<yEnd)
		{
			y++;
			if(p<0)
			{
				p+=d2x;
			}
			else
			{
				x++;
				p+=d2x-d2y;
			}
			//
			glReadPixels(x/SUBSIZE,y/SUBSIZE,1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);

			color[0]=CONVERT(color[0],tred);
			color[1]=CONVERT(color[1],tgreen);
			color[2]=CONVERT(color[2],tblue);

			glRasterPos2i(x/SUBSIZE,y/SUBSIZE);
			glDrawPixels(1,1,GL_RGBA,GL_UNSIGNED_BYTE,color);
			//glmSetPixel2i(x,y);
		}
	}
}


void LineSegment(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	
	srand(time(NULL));

	int x0,y0,xEnd,yEnd;
	double red,green,blue;

	for(int i=0;i<10;i++)
	{
		x0=rand()%ciWidth;
		y0=rand()%ciHeight;
		xEnd=rand()%ciWidth;
		yEnd=rand()%ciHeight;
		red=(double)rand()/RAND_MAX;
		green=(double)rand()/RAND_MAX;
		blue=(double)rand()/RAND_MAX;
		DrawLine2Di(x0,y0,xEnd,yEnd,red,green,blue);
	}
	//DrawLine2Di(100,200,200,200);
	//DrawLine2Di(0,10,100,130,1,0,0);
	
	
	//glmGetPixel2i(0,100,color);

	
		
	
	glFinish();
}


void main(int argc,char ** argv)
{
	
	//
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowPosition(50,100);
	glutInitWindowSize(ciWidth,ciHeight);
	glutCreateWindow("Bresham with ColorCorrect");

	Init();

	glutDisplayFunc(LineSegment);
	glutMainLoop();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -