#include<iostream>
#include<windows.h>
#include<math.h>
#include<GL/glut.h>
using namespace std;
void myDisplay(void);//用这个函数来调用lineDDA
void setPixel(int x, int y);//教科书里画点的函数,在0penGL中可以用glVertex来实现
// lint round( const float a)
void ChangeSize(GLsizei w, GLsizei h);
void lineDDA(int xo,int yo,int xEnd,int yEnd);
void myDisplay(void) {
lineDDA(50, 50, 200, 200);
}
void setPixel(int x, int y) {
//用opengl实现setPixel函数
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
glFlush();
}
void ChangeSize(GLsizei w, GLsizei h) {
if (h == 0)
h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(0.0f, 250.0f, 0.0f, 250.0f * h / w, 1.0, -1.0);
else
glOrtho(0.0f, 250.0f * w / h, 0.0f, 250.0f, 1.0, -1.0);
}
void lineDDA(int x0, int y0, int xEnd, int yEnd) {
glPointSize(1.0f); //像素点大小
int dx = xEnd - x0, dy = yEnd - y0, steps, k;
float xIncrement, yIncrement, x = x0, y = y0;
if (abs(dx) > abs(dy))
steps = abs(dx);
else
steps = abs(dy);
xIncrement = float(dx) / float(steps);
yIncrement = float(dy) / float(steps);
setPixel(round(x), round(y));
for ( k = 0; k < steps; k++)
{
x+= xIncrement;
y += yIncrement;
setPixel(round(x), round(y));
}
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(200, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("Daily Practice");
glutDisplayFunc(&myDisplay);
glutReshapeFunc(ChangeSize);
glutMainLoop();
return 0;
}
结果图