Advertisement
mateuspl

CG: DDA e Bresenham OPENGL Trabalho

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