#include <GL/glut.h>
#include <stdlib.h>

float zoom;
GLint windW=600, windH=600;
GLint xcoor,ycoor;
int bayrak=1;
int x1=0,y1=0,x2=30,y2=30;
int index;

GLubyte rasters[24] = {
    0xc0, 0x00,
    0xc0, 0x00
};

GLubyte rasters1[24] = {
    0xff, 0x00,
    0xff, 0x00,
    0xff, 0x00,
    0xff, 0x00
};

void init(void)
{
   glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
   glClearColor (0.0, 0.0, 0.0, 0.0);
}

void display(void)
{
	int dx,dy;
	float xinc,yinc;
	float xbuf,ybuf;
	int x,y;
	int step;
	int k;
//   glClear(GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
//	x1=windW-x1;
	y1=windH-y1;
//	x2=windW-x2;
	y2=windH-y2;
//	printf("Enter numbers x1 y1 x2 y2\n");
//	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	dx=x2-x1;
	if(dx==0)
		dx++;
	dy=y2-y1;
	if(dy==0)
		dy++;
printf("%d %d",abs(dx),abs(dy));
	if(abs(dx)>abs(dy))
		step=abs(dy);
	else
		step=abs(dx);
	xinc=(float)dx/(float)step;
	yinc=(float)dy/(float)step;
	x=x1;
	y=y1;
	printf("\nCore numbers are: x1 %d y1 %d x2 %d y2 %d dx %d dy %d step %d xinc %f yinc %f x %f y %f",x1,y1,x2,y2,dx,dy,step,xinc,yinc,x,y);
	ciz(x,y);
	ciznokta(x,y);
	xbuf=(float)x;ybuf=(float)y;
	for(k=1;k<step;k++)
	{
		xbuf=xbuf+xinc;
		ybuf=ybuf+yinc;
		x=(int)xbuf;
		y=(int)ybuf;
		ciz(x,y);
	}
	ciznokta(x,y);
//   glFlush();
}

void ciz(int x,int y){
   glRasterPos2i (x,y);
   glBitmap (2, 2, 0.0, 0.0, 0.0, 0.0,rasters);
}

void ciznokta(int x, int y){
   glRasterPos2i (x,y);
   printf ("\nNokta: %d , %d\n",(int)x,(int)y);
   glBitmap (4, 4, 0.0, 0.0, 0.0, 0.0,rasters1);
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho (0, w, 0, h, -1.0, 1.0);
   glMatrixMode(GL_MODELVIEW);
}

static void keyboard(unsigned char key, int x, int y)
{

    switch (key) {
      case 27:
        exit(1);
      case 'Z':
	zoom += 0.2;
	printf("zoom\n");
	break;
      case 'z':
	zoom -= 0.2;
	if (zoom < 0.2) {
	    zoom = 0.2;
	}
	printf("uzoom\n");
	break;
      default:
	return;
}
}

static void Reshape(int width, int height)
{

    windW = (GLint)width;
    windH = (GLint)height;

    glViewport(0, 0, windW, windH);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, windW/index, 0, windH/index);
    glMatrixMode(GL_MODELVIEW);
}

void mouse(int button,int state, int mX , int mY){
	switch(button){
			case GLUT_RIGHT_BUTTON:
				 glClear(GL_COLOR_BUFFER_BIT);
			break;
		
		case GLUT_LEFT_BUTTON:
				xcoor = (GLint)mX;
   				ycoor = (GLint)mY;
			if(state==GLUT_DOWN){
				ciznokta(mX,windH-mY);
				if(bayrak==1){
					x1=mX;
					y1=mY;
					bayrak=0;
				}
				else {
					x2=mX;
					y2=mY;
					bayrak=1;
					display();
				}
				printf("gl:%d,%d\n",xcoor,ycoor);
				printf("int:%d,%d\n",mX,mY);
				printf("actual:x1:%d,y1:%d,x2:%d,y2:%d\n",x1,y1,x2,y2);
			}
			break;
		case GLUT_MIDDLE_BUTTON:
		//		 glClear(GL_COLOR_BUFFER_BIT);
			break;
		default:
			break;
	}
}

int main(int argc, char** argv)
{
  index=0;
  while (index==0){
   printf("Please enter ortogonality");
   scanf("%d",&index);
  }
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(windW, windH);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(argv[0]);
   init();
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMouseFunc(mouse);
				 glClear(GL_COLOR_BUFFER_BIT);
   glutDisplayFunc(display);
   glutMainLoop();
   return 0;
}
