icatalin

tema2.1 [GRAFICA]

Mar 17th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. Scrieti o procedura / un program care sa rezolve urmatoarea cerinta: Se dau patru puncte A, B, C, D (se presupune ca sunt necoliniare - eventual procedura verifica acest lucru) in plan. Sa se determine daca segmentele [AB] si [CD] se intersecteaza si, in caz afirmativ, sa se calculeze acest punct. Reprezentare grafica. Indicatie: se va folosi reprezentarea punctelor unui segment folosind combinatii baricentrice. In suportul de curs (pag. 7) sunt detalii, inclusiv un exemplu numeric.
  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[10], X[10], nr_puncte = 0;
  8. int k = 0;
  9.  
  10. void init(void)  // initializare fereastra de vizualizare
  11. {
  12.     glClearColor(1.0, 1.0, 1.0, 0.0); // precizeaza culoarea de fond a ferestrei de vizualizare
  13.  
  14.     glMatrixMode(GL_PROJECTION);  // se precizeaza este vorba de o reprezentare 2D, realizata prin proiectie ortogonala
  15.     gluOrtho2D(0.0, 800.0, 0.0, 800.0); // sunt indicate coordonatele extreme ale ferestrei de vizualizare
  16. }
  17.  
  18. void functie_pentru_click(int button, int state, int x, int y) {
  19.  
  20.     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && k<=3)
  21.     {
  22.         X[k] = x;
  23.         Y[k] = 800-y;
  24.         k++;
  25.     }
  26. }
  27.  
  28. void desen(void) // procedura desenare  
  29. {
  30.     glutMouseFunc(functie_pentru_click);
  31.     glPointSize(10);
  32.     glBegin(GL_POINTS);
  33.         for (int i = 0; i < k; i++)
  34.         {
  35.             glColor3f(1.0, 1.0, 0.0);
  36.             glVertex2i(X[i], Y[i]);
  37.             // segmentele
  38.             if (k == 2 ) {
  39.                 glLineWidth(2.0);
  40.                 glBegin(GL_LINES);
  41.                 glColor3f(1.0, 1.0, 0.0);
  42.                 glVertex2i(X[0], Y[0]);
  43.                 glColor3f(1.0, 1.0, 0.0);
  44.                 glVertex2i(X[1], Y[1]);
  45.                 glEnd();
  46.             }
  47.  
  48.             if (k == 4)
  49.             {
  50.                 glLineWidth(2.0);
  51.                 glBegin(GL_LINES);
  52.                 glColor3f(1.0, 1.0, 0.0);
  53.                 glVertex2i(X[2], Y[2]);
  54.                 glColor3f(1.0, 1.0, 0.0);
  55.                 glVertex2i(X[3], Y[3]);
  56.                 glEnd();
  57.             }
  58.         }
  59.     glEnd();
  60.  
  61.     if (k == 4) {
  62.         double fc = ((X[2] - X[0]) / (X[1] - X[0])) * (Y[1] - Y[0]) - (Y[2] - Y[0]);
  63.         double fd = ((X[3] - X[0]) / (X[1] - X[0])) * (Y[1] - Y[0]) - (Y[3] - Y[0]);
  64.         std::cout << fc << ' ' << fd <<'\n';
  65.         if (fc * fd < 0) {
  66.             std::cout << "Se intersecteaza"<<'\n';
  67.             double a1 = Y[1] - Y[0];
  68.             double b1 = X[0] - X[1];
  69.             double c1 = a1 * X[0] + b1 * Y[0];
  70.  
  71.             double a2 = Y[3] - Y[2];
  72.             double b2 = X[2] - X[3];
  73.             double c2 = a2 * X[2] + b2 * Y[2];
  74.  
  75.             double denom = a1 * b2 - a2 * b1;
  76.  
  77.             if (denom == 0)
  78.             {
  79.                 std::cout << "Same Line i guees";
  80.             }
  81.             else
  82.             {
  83.                 double xi = (b2*c1 - b1*c2)/denom;
  84.                 double yi = (a1*c2 - a2*c1)/denom;
  85.                 if ((xi <= max(X[0], X[1]) && xi >= min(X[0], X[1]) &&
  86.                     yi <= max(Y[0], Y[1]) && yi >= min(Y[0], Y[1]) &&
  87.                     xi <= max(X[2], X[3]) && xi >= min(X[2], X[3]) &&
  88.                     yi <= max(Y[2], Y[3]) && yi >= min(Y[2], Y[3])) == 1)
  89.  
  90.                 {
  91.                     glBegin(GL_POINTS);
  92.                     glColor3f(0.0, 1.0, 0.0);
  93.                     glVertex2i(xi, yi);
  94.                     glEnd();
  95.                     for (int i = 0; i < 4; i++)
  96.                         std::cout << "x: " << X[i] << " y: " << Y[i] << '\n';
  97.                     std::cout << xi << "    " << yi;
  98.                 }
  99.                
  100.             }
  101.             k++;
  102.         }
  103.         else
  104.         {
  105.             std::cout << "Nu se intersecteaza";
  106.             k++;
  107.         }
  108.     }
  109.  
  110.     glFlush(); // proceseaza procedurile OpenGL cat mai rapid
  111. }
  112.  
  113. void main(int argc, char** argv)
  114. {
  115.     glutInit(&argc, argv); // initializare GLUT
  116.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // se utilizeaza un singur buffer | modul de colorare RedGreenBlue (= default)
  117.     glutInitWindowPosition(100, 100); // pozitia initiala a ferestrei de vizualizare (in coordonate ecran)
  118.     glutInitWindowSize(800, 800); // dimensiunile ferestrei
  119.     glutCreateWindow("Puncte & Segmente"); // creeaza fereastra, indicand numele ferestrei de vizualizare - apare in partea superioara
  120.  
  121.     init(); // executa procedura de initializare
  122.     glClear(GL_COLOR_BUFFER_BIT); // reprezentare si colorare fereastra de vizualizare
  123.     glutDisplayFunc(desen); // procedura desen este invocata ori de cate ori este nevoie
  124.     glutMainLoop(); // ultima instructiune a programului, asteapta (eventuale) noi date de intrare
  125. }
Advertisement
Add Comment
Please, Sign In to add comment