olexander_dan

Лаборатора робота 1.1

Oct 9th, 2018
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.50 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. //бібліотека для cin, яка дозволяє уникнути введення нечислових значень
  6. #include <limits>
  7.  
  8. //локалізація терміналу
  9. #include <locale>
  10. #include <windows.h>
  11.  
  12. //виводить інфорацію щодо цієї лабораторної роботи
  13. void aboutA (void);
  14.  
  15. //передає дійсні координати точки та повертає ознаку успішного введення координат
  16. bool getP (double &x, double &y);
  17.  
  18. //виводить координати точки на екран
  19. void putP (double &x, double &y);
  20.  
  21. //повертає ознаку розташування –1, 0, або 1, якщо, відповідно,
  22. //точка всередині контуру, на контурі, або за межами контуру
  23. int whereP (double x, double y, double X1, double Y1, double X2, double Y2, double X3, double Y3,
  24.                      double X4, double Y4, double X5, double Y5, double X6, double Y6);
  25. //беремо параметри за значеннями, бо в функції будуть відбуватися обчислення, які не повинні вплинути на значення змінних в main
  26.  
  27. //за допомогою викликів інших функцій виводить координати точки,
  28. //одне з повідомлень IN_C, ON_C, OUT_C («всередині контуру», «на контурі», «за межами контуру») та
  29. //значення параметра контуру
  30. void processP (double &x, double &y, double &a, int &pointPosition);
  31. //беремо параметри за посиланням, щоб не створювати тимчасові змінні в пам'яті
  32.  
  33. int main(void)
  34. {
  35.     //локалізація терміналу
  36.     SetConsoleCP(1251);
  37.     SetConsoleOutputCP(1251);
  38.  
  39.     //виведення інформації про програму
  40.     aboutA();
  41.  
  42.     //значення параметра контуру
  43.     double a = 5.0;
  44.  
  45.     //ініціалізуємо координати вершин шестикутника
  46.     //використаємо тип double для уникнення проблем з конвертацією значень
  47.     double X1 = 0.0, Y1 = 0.0, X2 = a, Y2 = 0.0, X3 = 2.0 * a, Y3 = a, X4 = 2.0 * a, Y4 = 2.0 * a, X5 = a, Y5 = 2.0 * a, X6 = 0.0, Y6 = a;
  48.  
  49.     //ініціалізуємо дійсні координати точки
  50.     double x, y;
  51.  
  52.     //програма продовжує виконання при коректному введенні координат точки
  53.     if (getP (x, y))
  54.     {
  55.         int pointPosition = whereP(x, y, X1, Y1, X2, Y2, X3, Y3, X4, Y4, X5, Y5, X6, Y6);
  56.         processP(x, y, a, pointPosition);
  57.     }
  58. }
  59.  
  60. void aboutA (void)
  61. {
  62.     cout << "Лабораторна робота 1-1. Точка та контур" << "; " << "Версія 1 («точка та зафіксований контур»)" << endl;
  63.     cout << "Група К-14" << ' ' << "Данильченко Олександр" << endl;
  64. }
  65.  
  66. bool getP (double &x, double &y)
  67. {
  68.     //булеанівське значення, яке відповідає за коректність вводу
  69.     bool inFail = false;
  70.  
  71.     cout << '\n' <<" Уведіть координати точки:"<< endl;
  72.     do
  73.     {
  74.         cout << "x: ";
  75.         cin >> x;
  76.         inFail = cin.fail();
  77.         cin.clear();
  78.         cin.ignore(numeric_limits<streamsize>::max(), '\n');
  79.     }
  80.     while (inFail == true);
  81.     do
  82.     {
  83.         cout << "y: ";
  84.         cin >> y;
  85.         inFail = cin.fail();
  86.         cin.clear();
  87.         cin.ignore(numeric_limits<streamsize>::max(), '\n');
  88.     }
  89.     while (inFail == true);
  90.  
  91.     //повертає true, якщо помилок при введенні не виявлено
  92.     return true;
  93. }
  94.  
  95. void putP (double &x, double &y)
  96. {
  97.     cout << '\n' << " Точка X має координати (" << x << ";" << y << ')' << endl;
  98. }
  99.  
  100. int whereP (double x, double y, double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4, double X5, double Y5, double X6, double Y6)
  101. {
  102.     //Логіка перевірки:
  103.     //підставляємо координати шуканої точки в рівняння кожної прямої, заданої вершинами шестикутника
  104.     // якщо точка лежить вище будь-якого з ребер
  105.     //     return 1 (ззовні шестикутника)
  106.     // якщо точка лежить нижче усіх ребер одночасно
  107.     //     return -1 (всередині шестикутника)
  108.     // якщо не виконується жоден з вищенаведених варіантів, залишається лише одна можливість розташування точки
  109.     //     return 0 (лежить на шестикутнику)
  110.  
  111.     if (((Y1 - Y2) * x + (X2 - X1) * y + (X1*Y2 - X2*Y1) < 0) ||
  112.         ((Y2 - Y3) * x + (X3 - X2) * y + (X2*Y3 - X3*Y2) < 0) ||
  113.         ((Y3 - Y4) * x + (X4 - X3) * y + (X3*Y4 - X4*Y3) < 0) ||
  114.         ((Y4 - Y5) * x + (X5 - X4) * y + (X4*Y5 - X5*Y4) < 0) ||
  115.         ((Y5 - Y6) * x + (X6 - X5) * y + (X5*Y6 - X6*Y5) < 0) ||
  116.         ((Y6 - Y1) * x + (X1 - X6) * y + (X6*Y1 - X1*Y6) < 0))
  117.     {
  118.         return 1; //лежить ззовні
  119.     }
  120.     else if (((Y1 - Y2) * x + (X2 - X1) * y + (X1*Y2 - X2*Y1) > 0) &&
  121.              ((Y2 - Y3) * x + (X3 - X2) * y + (X2*Y3 - X3*Y2) > 0) &&
  122.              ((Y3 - Y4) * x + (X4 - X3) * y + (X3*Y4 - X4*Y3) > 0) &&
  123.              ((Y4 - Y5) * x + (X5 - X4) * y + (X4*Y5 - X5*Y4) > 0) &&
  124.              ((Y5 - Y6) * x + (X6 - X5) * y + (X5*Y6 - X6*Y5) > 0) &&
  125.              ((Y6 - Y1) * x + (X1 - X6) * y + (X6*Y1 - X1*Y6) > 0))
  126.     {
  127.         return -1; //лежить всередині
  128.     }
  129.     else
  130.     {
  131.         return 0; //на шестикутнику
  132.     }
  133. }
  134.  
  135. void processP (double &x, double &y, double &a, int &pointPosition)
  136. {
  137.     putP(x, y);
  138.  
  139.     if (pointPosition == -1)
  140.         cout << '\n' << " IN_C" << endl;
  141.     else if (pointPosition == 0)
  142.         cout << '\n' << " ON_C" << endl;
  143.     else if (pointPosition == 1)
  144.         cout << '\n' << " OUT_C" << endl;
  145.  
  146.     cout << '\n' << " Параметр кривої дорівнює " << a << endl;
  147. }
  148.  
  149. Лаборатора робота 1.1
Advertisement
Add Comment
Please, Sign In to add comment