Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- //бібліотека для cin, яка дозволяє уникнути введення нечислових значень
- #include <limits>
- //локалізація терміналу
- #include <locale>
- #include <windows.h>
- //виводить інфорацію щодо цієї лабораторної роботи
- void aboutA (void);
- //передає дійсні координати точки та повертає ознаку успішного введення координат
- bool getP (double &x, double &y);
- //виводить координати точки на екран
- void putP (double &x, double &y);
- //повертає ознаку розташування –1, 0, або 1, якщо, відповідно,
- //точка всередині контуру, на контурі, або за межами контуру
- 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);
- //беремо параметри за значеннями, бо в функції будуть відбуватися обчислення, які не повинні вплинути на значення змінних в main
- //за допомогою викликів інших функцій виводить координати точки,
- //одне з повідомлень IN_C, ON_C, OUT_C («всередині контуру», «на контурі», «за межами контуру») та
- //значення параметра контуру
- void processP (double &x, double &y, double &a, int &pointPosition);
- //беремо параметри за посиланням, щоб не створювати тимчасові змінні в пам'яті
- int main(void)
- {
- //локалізація терміналу
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- //виведення інформації про програму
- aboutA();
- //значення параметра контуру
- double a = 5.0;
- //ініціалізуємо координати вершин шестикутника
- //використаємо тип double для уникнення проблем з конвертацією значень
- 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;
- //ініціалізуємо дійсні координати точки
- double x, y;
- //програма продовжує виконання при коректному введенні координат точки
- if (getP (x, y))
- {
- int pointPosition = whereP(x, y, X1, Y1, X2, Y2, X3, Y3, X4, Y4, X5, Y5, X6, Y6);
- processP(x, y, a, pointPosition);
- }
- }
- void aboutA (void)
- {
- cout << "Лабораторна робота 1-1. Точка та контур" << "; " << "Версія 1 («точка та зафіксований контур»)" << endl;
- cout << "Група К-14" << ' ' << "Данильченко Олександр" << endl;
- }
- bool getP (double &x, double &y)
- {
- //булеанівське значення, яке відповідає за коректність вводу
- bool inFail = false;
- cout << '\n' <<" Уведіть координати точки:"<< endl;
- do
- {
- cout << "x: ";
- cin >> x;
- inFail = cin.fail();
- cin.clear();
- cin.ignore(numeric_limits<streamsize>::max(), '\n');
- }
- while (inFail == true);
- do
- {
- cout << "y: ";
- cin >> y;
- inFail = cin.fail();
- cin.clear();
- cin.ignore(numeric_limits<streamsize>::max(), '\n');
- }
- while (inFail == true);
- //повертає true, якщо помилок при введенні не виявлено
- return true;
- }
- void putP (double &x, double &y)
- {
- cout << '\n' << " Точка X має координати (" << x << ";" << y << ')' << endl;
- }
- 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)
- {
- //Логіка перевірки:
- //підставляємо координати шуканої точки в рівняння кожної прямої, заданої вершинами шестикутника
- // якщо точка лежить вище будь-якого з ребер
- // return 1 (ззовні шестикутника)
- // якщо точка лежить нижче усіх ребер одночасно
- // return -1 (всередині шестикутника)
- // якщо не виконується жоден з вищенаведених варіантів, залишається лише одна можливість розташування точки
- // return 0 (лежить на шестикутнику)
- if (((Y1 - Y2) * x + (X2 - X1) * y + (X1*Y2 - X2*Y1) < 0) ||
- ((Y2 - Y3) * x + (X3 - X2) * y + (X2*Y3 - X3*Y2) < 0) ||
- ((Y3 - Y4) * x + (X4 - X3) * y + (X3*Y4 - X4*Y3) < 0) ||
- ((Y4 - Y5) * x + (X5 - X4) * y + (X4*Y5 - X5*Y4) < 0) ||
- ((Y5 - Y6) * x + (X6 - X5) * y + (X5*Y6 - X6*Y5) < 0) ||
- ((Y6 - Y1) * x + (X1 - X6) * y + (X6*Y1 - X1*Y6) < 0))
- {
- return 1; //лежить ззовні
- }
- else if (((Y1 - Y2) * x + (X2 - X1) * y + (X1*Y2 - X2*Y1) > 0) &&
- ((Y2 - Y3) * x + (X3 - X2) * y + (X2*Y3 - X3*Y2) > 0) &&
- ((Y3 - Y4) * x + (X4 - X3) * y + (X3*Y4 - X4*Y3) > 0) &&
- ((Y4 - Y5) * x + (X5 - X4) * y + (X4*Y5 - X5*Y4) > 0) &&
- ((Y5 - Y6) * x + (X6 - X5) * y + (X5*Y6 - X6*Y5) > 0) &&
- ((Y6 - Y1) * x + (X1 - X6) * y + (X6*Y1 - X1*Y6) > 0))
- {
- return -1; //лежить всередині
- }
- else
- {
- return 0; //на шестикутнику
- }
- }
- void processP (double &x, double &y, double &a, int &pointPosition)
- {
- putP(x, y);
- if (pointPosition == -1)
- cout << '\n' << " IN_C" << endl;
- else if (pointPosition == 0)
- cout << '\n' << " ON_C" << endl;
- else if (pointPosition == 1)
- cout << '\n' << " OUT_C" << endl;
- cout << '\n' << " Параметр кривої дорівнює " << a << endl;
- }
- Лаборатора робота 1.1
Advertisement
Add Comment
Please, Sign In to add comment