1.Bresenham.cpp
#include<gl/glut.h>
#include<math.h>
void Bres_Line(int x1, int y1, int x2, int y2)
{
glColor3f(0.0f, 0.0f, 1.0f);//设置颜色,蓝色
glPointSize(3);//栅格化点,直径为3
int dx = abs(x2 - x1);//计算|∆x|
int dy = abs(y2 - y1);//计算|∆y|
if (dx == 0 && dy == 0) return;
int flag = 0;
int temp;
if (dx < dy) //将斜率变换至0≤|k|≤1区间
{
flag = 1;
temp = x1, x1 = y1, y1 = temp;//交换x1,y1
temp = x2, x2 = y2, y2 = temp;//交换x2,y2
temp = dx, dx = dy, dy = temp;//交换dx,dy
int tx = (x2 - x1) > 0 ? 1 : -1; //若斜率是0≤k≤1,加1,若斜率是-1≤k≤0,减1
int ty = (y2 - y1) > 0 ? 1 : -1;
int curx = x1; //当前像素x坐标
int cury = y1; //当前像素y坐标
//画起点
glBegin(GL_POINTS);
glVertex2i(x1, x2);
glEnd();
int d = 2 * dy - dx; //d初值
while (curx != x2)
{ //迭代公式
if (d < 0)
d += 2 * dy;
else
{
cury += ty;
d += 2 * (dy - dx);
}
if (flag)//若发生过斜率变换
{
glBegin(GL_POINTS);
glVertex2i(cury, curx);
glEnd();
}
else
{
glBegin(GL_POINTS);
glVertex2i(curx, cury);
glEnd();
}
curx += tx;//下一个像素的x坐标
}
}
}
void myDisplay()
{
glClearColor(1.0, 1.0, 1.0, 1.0);//清除颜色,白色
glClear(GL_COLOR_BUFFER_BIT);//消除缓冲区,使用上述清除颜色消除
//Bres_Line(0, 0, 200, 200);
//Bres_Line(200, 200, 0, 0);
Bres_Line(0, 200, 100, 100);
glFlush();//强制刷新
}
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h); //定义视口大小
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);//使左下角坐标为(0,0),右上角坐标为(w,h)
}
void main(int argc, char* argv[])
{
glutInit(&argc, argv);//初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//显示模式
glutInitWindowPosition(100, 100);//窗口位置,窗口左上角在屏幕的坐标
glutInitWindowSize(400, 400);//窗口大小
glutCreateWindow("Bresenham画线法");//创建窗口,参数是窗口的标题
glutDis