#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <GL/glut.h>
#define ESC 27
int Height=400, Width=400;
void swapd(int *a, int *b)
{
int tmp;
tmp=*a;*a=*b;*b=tmp;
}
void writepixel(int x, int y, int flag)
{
glBegin(GL_POINTS);
if (flag==0) glVertex2i (x,y);
else if (flag==1) glVertex2i (y,x);
else if (flag==10) glVertex2i (x,-y);
else if (flag==11) glVertex2i (y,-x);
glEnd();
}
void line(int x0,int y0,int xn,int yn)
{ /* Bresenham's midpoint line algorithm */
int dx, dy, incrE, incrNE, d, x, y, flag = 0;
if (xn<x0) { swapd(&x0,&xn); swapd(&y0,&yn); }
if (yn<y0) { y0 = -y0; yn = -yn; flag=10; }
dy=yn-y0; dx=xn-x0;
if (dx<dy) { swapd(&x0,&y0); swapd(&xn,&yn); swapd(&dy,&dx); flag++;}
x=x0; y=y0;
d=2*dy-dx; incrE=2*dy; incrNE=2*(dy-dx);
while (x<xn+1) {
writepixel(x,y,flag); /* write framebuffer */
x++; /* consider next pixel */
if (d<=0) { d+=incrE; }
else { y++; d+=incrNE; };
}
}
void display(void)
{
int x0, y0, xn, yn;
printf(" Please enter coordinate of x0 and y0
");
scanf("%d %d", &x0,&y0);
printf(" Please enter coordinate of x1 and y1
");
scanf("%d %d", &xn,&yn);
x0 = (x0 % Width) - Width/2;
y0 = (y0 % Height) - Height/2;
xn = (xn % Width) - Width/2;
yn = (yn % Height) - Height/2;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 1, 1);
line(x0, y0, xn, yn);
glFlush();
}
static void Reshape(int w, int h)
{
//1. clear the framebuffer to black color
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
//2. coordinate adjusted if window reshaped
Width = w; Height = h;
//3. adjust the size of the drawing area
glViewport (0, 0, Width, Height);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho(-Width/2, Width/2, -Height/2, Height/2, -1.0, 1.0);
}
static void Key(unsigned char key, int x, int y)
{
switch (key) {
case ESC:
exit(0);
default: display();
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(Width, Height);
glutCreateWindow("Bresenham Line");
glutKeyboardFunc(Key);
glutReshapeFunc(Reshape);
glutDisplayFunc(display);
glutMainLoop();
}