计算机图形学笔记之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;
}
运行结果: