📄 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 + -