SHARE
TWEET

Untitled

a guest Apr 19th, 2019 89 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. const double EPS = 1.084202e-19; //константа точности, необходима так как происходит сравнение чисел с плавающей запятой
  6.  
  7. class Point {
  8. public:
  9.     double x; //х-координата точки
  10.     double y; //y-координата точки
  11.     Point(double x = 0, double y = 0) { //конструктор с параметрами, одновременно выполянющий
  12.         //роль конструктора по умолчанию
  13.         this->x = x;
  14.         this->y = y;
  15.     }
  16.     ~Point() {} //деструктор
  17. };
  18.  
  19.  
  20. class Polygon {
  21.     //класс содержит защищенные, то есть видимые только внутри класса и наследуемые поля:
  22. protected:
  23.     int len; //число вершин
  24.     vector<double> x; //вектор х-координат вершин полигона
  25.     vector<double> y; //вектор y-координат вершин полигона
  26.     //также в классе реализованы публичные методы
  27. public:
  28.     int getNumbVert() { return this->len; } //число вершин
  29.     Polygon() {}
  30.     Polygon(int len, vector<double> x, vector<double> y) { //конструктор инициализации
  31.         //принимает число вершин и их координаты и присваивает полученные аргументы полям экземпляра класса
  32.         //этот конструктор нужен для инициализации объектов класса Полигон
  33.         this->len = len;
  34.         this->x = x;
  35.         this->y = y;
  36.     }
  37.  
  38.     Polygon(const Polygon& tmp) { //конструктор копирования
  39.         //принимает в качестве параметра постоянную ссылку на объект класса Полигон
  40.         //и копирует его содержимое в наш экземпляр
  41.         //этот конструктор нужен для копирования экземпляров класса Полигон
  42.         len = tmp.len;
  43.         x = tmp.x;
  44.         y = tmp.y;
  45.     }
  46.  
  47.     ~Polygon() { //деструктор
  48.         // метод, вызывающийся после того, как экземпляр класса перестает использоваться
  49.         //необходим для освобождени памяти
  50.         while (x.size() > 0 && y.size() > 0) {
  51.             x.pop_back();
  52.             y.pop_back();
  53.         }
  54.     }
  55.  
  56.     Polygon& addVert(Point point) { //метод добавления вершины
  57.         //принимает точку
  58.         //добавляет ее координаты к координатам вершин Полигона
  59.         x.push_back(point.x);
  60.         y.push_back(point.y);
  61.         len++; //увеличивает на 1 число вершин
  62.         return *this; //возвращает измененную ссылку на наш экземпляр Полигон
  63.     }
  64.  
  65.     Polygon& delVert(Point point) { //удаление вершины
  66.         int q = len;
  67.         for (int i = 0; i < x.size(); i++) {
  68.             if (x[i] == point.x && y[i] == point.y) {
  69.                 x.erase(x.begin() + i);
  70.                 y.erase(y.begin() + i);
  71.                 break;
  72.             }
  73.         }
  74.         if (q != x.size())
  75.             len--;
  76.         return *this;
  77.     }
  78.  
  79.     bool belong(const Point point) {
  80.         double w;
  81.         int pos = x.size() - 1;
  82.         bool result = false;
  83.         double q = point.x * (y[0] - y[pos]) - point.y * (x[0] - x[pos]) - x[pos] * (y[0] - y[pos]) + y[pos] * (x[0] - x[pos]);
  84.         for (int i = 0; i < x.size() - 1; i++) {
  85.             w = point.x * (y[i + 1] - y[i]) - point.y * (x[i + 1] - x[i]) - x[i] * (y[i + 1] - y[i]) + y[i] * (x[i + 1] - x[i]);
  86.             if ((q >= 0 && w >= 0) || (q < 0 && w < 0))
  87.                 result = true;
  88.             else
  89.                 return false;
  90.         }
  91.         return result;
  92.     }
  93.  
  94.     bool intersect(Polygon obj) {
  95.         bool result = false;
  96.         Point t1, t2, t3, t4, t5;
  97.         double w1, w2, w3, w4, a1, a2, b1, b2, c1, c2;
  98.         for (int i = 0; i < x.size() - 1; i++)
  99.             for (int j = 0; j < obj.x.size() - 1; j++) {
  100.                 a1 = y[i + 1] - y[i];
  101.                 a2 = obj.y[j + 1] - obj.y[j];
  102.                 b1 = x[i + 1] - x[i];
  103.                 b2 = obj.x[j + 1] - obj.x[j];
  104.                 c1 = -x[i] * a1 + y[i] * b1;
  105.                 c2 = -obj.x[j] * a2 + obj.y[j] * b2;
  106.                 w1 = (b2*c1 - b1 * c2);
  107.                 w2 = (b1*a2 - b2 * a1);
  108.                 w3 = (a2*c1 - a1 * c2);
  109.                 t5.x = w1 / w2;
  110.                 t5.y = w3 / w2;
  111.                 if (w1 != 0 && w2 != 0 && w3 != 0 &&
  112.                     belong(t5) == true && obj.belong(t5) == true)
  113.                     return true;
  114.             }
  115.         return result;
  116.     }
  117.  
  118.     Polygon& operator=(Polygon obj) {
  119.         this->x = obj.x;
  120.         this->y = obj.x;
  121.         this->len = obj.len;
  122.         return *this;
  123.     }
  124.  
  125.     bool operator > (Polygon obj) {
  126.         if ((this->len - obj.len) > EPS)
  127.             return true;
  128.         return false;
  129.     }
  130.  
  131.     bool operator < (Polygon obj) {
  132.         if ((this->len - obj.len) < EPS)
  133.             return true;
  134.         return false;
  135.     }
  136.  
  137.     bool operator != (Polygon obj) {
  138.         if (abs(this->len - obj.len) > EPS)
  139.             return true;
  140.         return false;
  141.     }
  142.  
  143.     bool operator >= (Polygon obj) {
  144.         if ((this->len - obj.len) < EPS)
  145.             return false;
  146.         return true;
  147.     }
  148.  
  149.     bool operator <= (Polygon obj) {
  150.         if ((this->len - obj.len) > EPS)
  151.             return false;
  152.         return true;
  153.     }
  154.  
  155.     bool operator == (Polygon obj) {
  156.         if (abs(this->len - obj.len) > EPS)
  157.             return false;
  158.         return true;
  159.     }
  160.     friend ostream& operator << (ostream&, Polygon&); //оператор вывода в поток
  161.     friend istream& operator >> (istream&, Polygon&); //оператор ввода в поток
  162. };
  163.  
  164.  
  165.  
  166. istream& operator >> (istream& in, Polygon& obj) {
  167.     Point point;
  168.     cout << "Введите число вершин полигона(не меньше трех): ";
  169.     in >> obj.len;
  170.     cout << "Введите вершины в последовательном порядке" << endl;
  171.     for (int i = 0; i < obj.len; i++)
  172.     {
  173.         cout << "Введите координаты " << i + 1 << " вершины (x,y):";
  174.         in >> point.x;
  175.         obj.x.push_back(point.x);
  176.         in >> point.y;
  177.         obj.y.push_back(point.y);
  178.     }
  179.     return in;
  180. }
  181.  
  182. ostream& operator << (ostream& out, Polygon& obj) {
  183.     out << "Число вершин полигона = ";
  184.     out << obj.len << endl;
  185.     for (int i = 0; i < obj.len; i++) {
  186.         out << "Координаты " << i + 1 << " вершины:" << endl;
  187.         out << "x=" << obj.x[i] << endl;
  188.         out << "y=" << obj.y[i] << endl;
  189.     }
  190.     return out;
  191. }
  192.  
  193.  
  194. class MyPolygon :
  195.     public Polygon
  196. {
  197. public:
  198.     MyPolygon() : Polygon() {}
  199.     MyPolygon(int len, vector<double>x, vector<double>y) : Polygon(len, x, y) {}
  200.     MyPolygon(const Polygon& tmp) : Polygon(tmp) {}
  201.     ~MyPolygon() { Polygon::~Polygon(); }
  202.  
  203.     double perimeter() {
  204.         double l = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
  205.         return l * len;
  206.     }
  207.  
  208.     double square() {
  209.         double l = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
  210.         return (this->len * l * l) / (4 * tan(3.14 / this->len));
  211.     }
  212. };
  213.  
  214.  
  215.  
  216.  
  217.  
  218. int main() {
  219.     setlocale(LC_ALL, "RUS"); //переводим консоль в русскую кодировку
  220.     Point A; // объявление точки А
  221.     vector<double>x1 = { 0,0,5,5 }; //вектор х-координат
  222.     vector<double>y1 = { 0, 10, 10,0 }; //вектор y-координат
  223.     // по заданию требуется зайдействовать все реализованные методы
  224.     Polygon qwerty1; //конструктор по умолчанию
  225.     Polygon qwerty2(4, x1, y1); //конструктор инициализации
  226.     Polygon qwerty3(qwerty2); //конструктор копирования
  227.     Polygon qwerty5;
  228.     qwerty5 = qwerty3; // оператор присваивания
  229.     cin >> qwerty1; //оператор ввода в поток
  230.     cout << qwerty1; //оператор вывода в поток
  231.     cout << "Введите точку" << endl;
  232.     cin >> A.x >> A.y; //вводим координаты точки А
  233.     if (qwerty1.belong(A)) //проверка принадлежноости точки полигону
  234.         cout << "Точка внутри полигона" << endl;
  235.     else cout << "Точка вне полигона" << endl;
  236.     if (qwerty2.intersect(qwerty1)) //проверка пересечания полигонов
  237.         cout << "Полиномы пересекаются" << endl;
  238.     else cout << "Полиномы не пересекаются" << endl;
  239.     MyPolygon qwerty6 = qwerty1; //инициализация экземпляра класса наследника
  240.     cout << "Perimeter " << qwerty6.perimeter() << endl; //рассчет периметра полигона
  241.     cout << "Number of vertex " << qwerty6.getNumbVert() << endl; //число вершин полигона
  242.     //проверка всех операторов сравнения для полигонов
  243.     if (qwerty1 > qwerty2) //оператор больше
  244.         cout << "1 больше 2" << endl;
  245.     else
  246.         cout << "1 меньше 2" << endl;
  247.     if (qwerty1 <= qwerty2) //оператор меньше равно
  248.         cout << "1 меньше или равно 2" << endl;
  249.     else
  250.         cout << "1 больше 2" << endl;
  251.     if (qwerty1 != qwerty2) //оператор неравно
  252.         cout << "1 не равен 2" << endl;
  253.     else
  254.         cout << "1 равен 2" << endl;
  255.     if (qwerty6 == qwerty1) //оператор сравнения
  256.         cout << "1 равен 2" << endl;
  257.     else
  258.         cout << "1 не равен 2" << endl;
  259.     //добавление вершины
  260.     cout << "До добавления вершины вершины" << endl;
  261.     cout << qwerty1;
  262.     qwerty1.addVert(A); //добавление вершины А
  263.     cout << "После добавления вершины вершины" << endl;
  264.     cout << qwerty1;
  265.     //удаление вершины
  266.     cout << "До удаления вершины вершины" << endl;
  267.     cout << qwerty1;
  268.     qwerty1.delVert(A); //удаление вершины А
  269.     cout << "После удаления вершины вершины" << endl;
  270.     cout << qwerty1;
  271.     system("pause");
  272. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top