icatalin

tema 2.2 [GRAFICA]

Mar 17th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. Scrieti un program care sa rezolve urmatoarea cerinta: Se da un sir de n varfuri, P1, ..., Pn. Programul detecteaza eventualele autointersectii ale liniei poligonale P1...Pn si deseneaza folosind sabloane si culori diferite muchiile cu intersectii si muchiile fara intersectii.
  2.  
  3. #include <windows.h>  // sunt mentionate fisiere (biblioteci) care urmeaza sa fie incluse
  4. #include <gl/freeglut.h> // nu trebuie uitat freeglut.h (sau glut.h sau gl.h & glu.h)
  5. #include <iostream>
  6.  
  7. double Y[1000], X[1000], nr_puncte = 0;
  8. int k = 0;
  9. int V[1000];
  10. int x, y;
  11.  
  12. void init(void)  // initializare fereastra de vizualizare
  13. {
  14.     glClearColor(1.0, 1.0, 1.0, 0.0); // precizeaza culoarea de fond a ferestrei de vizualizare
  15.     glMatrixMode(GL_PROJECTION);  // se precizeaza este vorba de o reprezentare 2D, realizata prin proiectie ortogonala
  16.     gluOrtho2D(0.0, 800.0, 0.0, 800.0); // sunt indicate coordonatele extreme ale ferestrei de vizualizare
  17. }
  18.  
  19. void functie_pentru_click(int button, int state, int x, int y) {
  20.  
  21.     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  22.     {
  23.         X[k] = x;
  24.         Y[k] = 800 - y;
  25.         for (int i = 0; i < k - 2; i++)
  26.         {
  27.         //if()
  28.             double fc = ((X[k-1] - X[i]) / (X[i+1] - X[i])) * (Y[i+1] - Y[i]) - (Y[k-1] - Y[i]);
  29.             double fd = ((X[k] - X[i]) / (X[i+1] - X[i])) * (Y[i+1] - Y[i]) - (Y[k] - Y[i]);
  30.             std::cout << fc << ' ' << fd << '\n';
  31.             if (fc * fd < 0) {
  32.                 double a1 = Y[i+1] - Y[i];
  33.                 double b1 = X[i] - X[i+1];
  34.                 double c1 = a1 * X[i] + b1 * Y[i];
  35.  
  36.                 double a2 = Y[k] - Y[k-1];
  37.                 double b2 = X[k-1] - X[k];
  38.                 double c2 = a2 * X[k-1] + b2 * Y[k-1];
  39.  
  40.                 double denom = a1 * b2 - a2 * b1;
  41.  
  42.                 if (denom == 0)
  43.                 {
  44.                     std::cout << "Same Line i guees";
  45.                 }
  46.                 else
  47.                 {
  48.                     double xi = (b2 * c1 - b1 * c2) / denom;
  49.                     double yi = (a1 * c2 - a2 * c1) / denom;
  50.                     if ((xi <= max(X[i], X[i + 1]) && xi >= min(X[i], X[i + 1]) &&
  51.                         yi <= max(Y[i], Y[i + 1]) && yi >= min(Y[i], Y[i + 1]) &&
  52.                         xi <= max(X[k - 1], X[k]) && xi >= min(X[k - 1], X[k]) &&
  53.                         yi <= max(Y[k - 1], Y[k]) && yi >= min(Y[k - 1], Y[k])) == 1) {
  54.                         V[i] = 1;
  55.                         V[k - 1] = 1;
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.  
  61.         glutPostRedisplay();
  62.         k++;
  63.     }
  64. }
  65.  
  66. void desen(void) // procedura desenare  
  67. {
  68.     glutMouseFunc(functie_pentru_click);
  69.     glPointSize(10.0);
  70.     //Puncte
  71.     std::cout << x <<"-"<<y<<'\n';
  72.  
  73.  
  74.     glEnable(GL_POINT_SMOOTH);
  75.     glBegin(GL_POINTS);
  76.     glColor3f(1.0, 1.0, 0.0);
  77.     glVertex2i(X[k], Y[k]);
  78.     glEnd();
  79.     glDisable(GL_POINT_SMOOTH);
  80.  
  81.     for (int i = 0; i < k - 1; i++)
  82.     {
  83.         if (V[i] == 1)
  84.         {
  85.             glBegin(GL_LINES);
  86.             glColor3f(1.0, 0.0, 0.0);
  87.             glVertex2i(X[i + 1], Y[i + 1]);
  88.             glColor3f(1.0, 0.0, 0.0);
  89.             glVertex2i(X[i], Y[i]);
  90.             glEnd();
  91.         }
  92.         else
  93.         {
  94.             glBegin(GL_LINES);
  95.             glColor3f(1.0, 1.0, 0.0);
  96.             glVertex2i(X[i + 1], Y[i + 1]);
  97.             glColor3f(1.0, 1.0, 0.0);
  98.             glVertex2i(X[i], Y[i]);
  99.             glEnd();
  100.         }
  101.     }
  102.     glFlush(); // proceseaza procedurile OpenGL cat mai rapid
  103. }
  104. void main(int argc, char** argv)
  105. {
  106.     glutInit(&argc, argv); // initializare GLUT
  107.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // se utilizeaza un singur buffer | modul de colorare RedGreenBlue (= default)
  108.     glutInitWindowPosition(100, 100); // pozitia initiala a ferestrei de vizualizare (in coordonate ecran)
  109.     glutInitWindowSize(800, 800); // dimensiunile ferestrei
  110.     glutCreateWindow("Puncte & Segmente"); // creeaza fereastra, indicand numele ferestrei de vizualizare - apare in partea superioara
  111.  
  112.     init(); // executa procedura de initializare
  113.     glClear(GL_COLOR_BUFFER_BIT); // reprezentare si colorare fereastra de vizualizare
  114.     glutDisplayFunc(desen); // procedura desen este invocata ori de cate ori este nevoie
  115.     glutMainLoop(); // ultima instructiune a programului, asteapta (eventuale) noi date de intrare
  116. }
Advertisement
Add Comment
Please, Sign In to add comment