/*
3.feladat
Illusztráljuk az alap inkrementális szakaszrajzoló algoritmust.
(A megoldás annyi pluszt tartalmaz, hogy az i, k, j illetve l billentyû lenyomására módosulnak a szakasz második végpontjának a koordinátái, így a szakasz is.)
*/

#include "stdafx.h"

static double X1 = 0.0;
static double Y1 = 0.0;
static double X2 = 10.0;
static double Y2 = 15.0;

void init(void) {
     glClearColor(0.7,0.7,0.7,1.0);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluOrtho2D(0,20,0,20);
}
void keyboard(unsigned char key, int x, int y) {
     switch(key) {
     case 27:
          exit(0);
          break;
     case 'i':
          Y2++;
          glutPostRedisplay();
/*a glutPostRedisplay() eljárás hatására a képernyõ újra kirajzolódik (meghívódik a display függvény)*/
          break;
     case 'k':
          Y2--;
          glutPostRedisplay();
          break;
     case 'j':
          X2--;
          glutPostRedisplay();
     break;
     case 'l':
          X2++;
          glutPostRedisplay();
          break;
     default:
          break;
     }
}
int round(double mit) {
     return floor(mit+0.5);
}
void display(void) {
     double m,y,x;
     int X;
     int Y;
     glClear(GL_COLOR_BUFFER_BIT);
     glLineWidth(2.0);
     glBegin(GL_LINES);
           glColor3f(1.0,0.0,0.0);
           for(int i=0;i<20;i++) {
                glVertex2i(0,i);
                glVertex2i(20,i);
                glVertex2i(i,0);
                glVertex2i(i,20);
           }
     glEnd();
     glPointSize(15.0);
     glBegin(GL_POINTS);
           glColor3d(0.0,0.0,1.0);
           double dx = X2-X1;
           double dy = Y2-Y1;
           if(dx>=dy) {
              m=dy/dx;
              y=Y1;
              for(X=X1;X<=X2;X++) {
                  Y=round(y);
                   glVertex2i(X,Y);
                   y+=m;
              }
           }
           else {
              m=dx/dy;
              x=X1;
              for(Y=Y1;Y<=Y2;Y++) {
                   X=round(x);
                   glVertex2i(X,Y);
                   x+=m;
              }
           }
         glEnd();
         glFlush();
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
     glutInitWindowSize(400,400);
     glutInitWindowPosition(100,100);
     glutCreateWindow("");
     init();
     glutDisplayFunc(display);
     glutKeyboardFunc(keyboard);
     glutMainLoop();
     return 0;
}