sure, this is the code:
#define BLACK 0
#include <GL/glut.h>
#include <stdio.h>
void draw_pixel(int ix, int iy, int value)
{
glBegin(GL_POINTS);
glVertex2i( ix, iy);
glEnd();
}
void bres(int x1,int y1,int x2,int y2)
{
int dx, dy, i, e;
int incx, incy, inc1, inc2;
int x,y;
dx = x2 - x1;
dy = y2 - y1;
if(dx < 0) dx = -dx;
if(dy < 0) dy = -dy;
incx = 1;
if(x2 < x1) incx = -1;
incy = 1;
if(y2 < y1) incy = -1;
x=x1;
y=y1;
if(dx > dy)
{
draw_pixel(x,y, BLACK);
e = 2*dy - dx;
inc1 = 2*( dy -dx);
inc2 = 2*dy;
for(i = 0; i < dx; i++)
{
if(e >= 0)
{
y += incy;
e += inc1;
}
else e += inc2;
x += incx;
draw_pixel(x,y, BLACK);
}
}
else
{
draw_pixel(x,y, BLACK);
e = 2*dx - dy;
inc1 = 2*( dx - dy);
inc2 = 2*dx;
for(i = 0; i < dy; i++)
{
if(e >= 0)
{
x += incx;
e += inc1;
}
else e += inc2;
y += incy;
draw_pixel(x,y, BLACK);
}
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
bres(200, 200, 100, 50); //EDGE 1
bres(100, 50, 20, 20); //EDGE 2
bres(20, 20, 80, 50); //EDGE 3
bres(80, 50, 30, 30); //EDGE 4
bres(30,30,200,200); //EDGE 5
glFlush();
}
int inPolygon(int x, int y, int px1, int py1, int px2, int py2, int crossings){
if(((px1 < x && px2 > x)||(px1 > x && px2 < x)) && py1 > y && py2 > y){
int cross = crossings + 1;
return cross;
}
else if(((px1 < x && px2 > x)||(px1 > x && px2 < x)) && ((py1 < y && py2 > y) ||(py1 > y && py2 < y) )){
int ypoint = py1 + ((py2-py1)/(px2-px1)) * (x-px1);
if(ypoint > y){
int cross = crossings + 1;
return cross;
}
}
else return crossings;
}
void mouse(int btn, int state, int x, int y)
{
/* mouse callback, checks if point is in polygon */
if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
y=500-y;
int crossings = 0;
crossings = inPolygon(x,y,200,200,100,50,crossings);
crossings = inPolygon(x,y,100,50,20,20,crossings);
crossings = inPolygon(x,y,20,20,80,50,crossings);
crossings = inPolygon(x,y,80,50,30,30,crossings);
crossings = inPolygon(x,y,30,30,200,200,crossings);
if(crossings % 2 !=0){
bres(x-1.5,y+1.5,x+1.5,y+1.5);
bres(x+1.5,y+1.5,x+1.5,y-1.5);
bres(x+1.5,y-1.5,x-1.5,y-1.5);
bres(x-1.5,y-1.5,x-1.5,y+1.5);
}
}
}
void myinit()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(1.0, 0.0, 0.0);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 499.0, 0.0, 499.0);
}
int main(int argc, char** argv)
{
/* standard GLUT initialization */
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* default, not needed */
glutInitWindowSize(500,500); /* 500x500 pixel window */
glutInitWindowPosition(0,0); /* place window top left on display */
glutCreateWindow("Bresenham's Algorithm"); /* window title */
glutDisplayFunc(display); /* display callback invoked when window opened */
glutMouseFunc(mouse);
myinit(); /* set attributes */
glutMainLoop(); /* enter event loop */
}