Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.79 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement