Advertisement
mateuspl

CG: DDA e Bresenham OPENGL

Mar 8th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. /* gcc -o file file.c -lglut -lGL -lGLU */
  2.  
  3. #include <GL/glut.h>
  4.  
  5. int abs(int n) { return n > 0 ? n : -n; }
  6. int rnd(float n) { return (int) (n + 0.5); }
  7.  
  8. void display();
  9. void drawLineBres(int xa, int ya, int xb, int yb, int inverted);
  10. void drawLineDDA(int xa, int ya, int xb, int yb);
  11. void drawLine(int xa, int ya, int xb, int yb, int reversed);
  12.  
  13. int main(int argc, char **argv)
  14. {
  15.     glutInit(&argc, argv);
  16.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  17.     glutInitWindowSize(800, 480);
  18.     int windowID = glutCreateWindow("a0307");
  19.     glutDisplayFunc(display);
  20.     glutMainLoop();
  21.  
  22.     return 0;
  23. }
  24.  
  25. void display()
  26. {
  27.     glClearColor(0, 0, 0, 0);
  28.     glClear(GL_COLOR_BUFFER_BIT);
  29.    
  30.     glMatrixMode(GL_PROJECTION);
  31.     glLoadIdentity();
  32.     gluOrtho2D(-50, 50, -50, 50);
  33.  
  34.     glMatrixMode(GL_MODELVIEW);
  35.     glLoadIdentity();
  36.  
  37.     glBegin(GL_POINTS);
  38.         glColor3d(1, 0, 0);
  39.         glVertex2d(0, 0);
  40.         glVertex2d(0, 30);
  41.         drawLineBres(10, 0, 25, 5, 0);
  42.         drawLineDDA(20, 0, 35, 5);
  43.         drawLine(30, 0, 45, 5, 0);
  44.     glEnd();
  45.  
  46.     glFlush();
  47. }
  48.  
  49. void drawLineBres(int xa, int ya, int xb, int yb, int inverted)
  50. {
  51.     int dx = xb - xa,
  52.         dy = yb - ya,
  53.         slope;
  54.    
  55.     if (xa > xb)
  56.         return drawLineBres(xb, yb, xa, ya, inverted);
  57.     if (abs(dy) > abs(dx))
  58.         return drawLineBres(ya, xa, yb, xb, ! inverted);
  59.  
  60.     if (dy < 0)
  61.     {
  62.         slope = -1;
  63.         dy = -dy;
  64.     }
  65.     else slope = 1;
  66.  
  67.     int incE = 2 * dy,
  68.         incNE = 2 * (dy - dx),
  69.         p = 2 * dy - dx;
  70.  
  71.     for (; xa <= xb; xa++)
  72.     {
  73.         if (inverted)
  74.             glVertex2d(ya, xa);
  75.         else
  76.             glVertex2d(xa, ya);
  77.  
  78.         if (p < 0)
  79.             p += incE;
  80.         else {
  81.             p += incNE;
  82.             ya += slope;
  83.         }
  84.     }
  85. }
  86.  
  87.  
  88. void drawLineDDA(int xa, int ya, int xb, int yb)
  89. {
  90.     int dx = xb - xa,
  91.         dy = yb - ya;
  92.  
  93.     int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
  94.  
  95.     float   xIncrement = dx / (float) steps,
  96.             yIncrement = dy / (float) steps,
  97.             x = xa,
  98.             y = ya;
  99.  
  100.     glVertex2d(rnd(x), rnd(y));
  101.  
  102.     for (int k = 0; k < steps; k++)
  103.     {
  104.         x += xIncrement;
  105.         y += yIncrement;
  106.  
  107.         glVertex2d(rnd(x), rnd(y));
  108.     }
  109. }
  110.  
  111. void drawLine(int xa, int ya, int xb, int yb, int reversed)
  112. {
  113.     int dx = xb - xa,
  114.         dy = yb - ya;
  115.  
  116.     if (dx < 0)
  117.         drawLine(xb, yb)
  118.  
  119.     if (abs(dx) >= abs(dy))
  120.     {  
  121.         double  m = (double) (yb - ya) / (xa - xb);
  122.  
  123.         for (; dx > 0 ? xb > xa : xb < xa; xa += xInc)
  124.         {
  125.             if (reversed)
  126.                 glVertex2d((int) y, xa);
  127.             else
  128.                 glVertex2d(xa, (int) y);
  129.  
  130.             y += yInc;
  131.         }
  132.  
  133.         if (reversed)
  134.             glVertex2d((int) y, xa);
  135.         else
  136.             glVertex2d(xa, (int) y);
  137.     }
  138.     else return drawLine(ya, xa, yb, xb, ! reversed);
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement