# SortFigure

Sep 30th, 2020
526
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. #include <iostream>
2. #include <cmath>
3. #include <algorithm>                                      // для функции sin
4.
5.
6.
7. #define PI 3.14159265
8. using namespace std;
9.
10.
11.
12. struct Point
13. {
14.     float x;
15.     float y;
16. };
17. struct Figure
18. {  int count_Point;
19.    Point *Points = new Point[count_Point];
20. };
21.
22. struct ArrayFigure
23. {
24.     int count_Figure=0;
25.     Figure *Figures = new Figure[count_Figure];
26. };
27. template<typename T>
28. T max_of_array(T *array)
29. {
30.     int max=0;
31.     int size = sizeof(arr);
32.     for(int i=0;i<size;i++)
33.     {
34.         if (array[i]>array[max])
35.         max=i;
36.     }
37.     return array[max];
38. }
39. Point input_Point()
40. {
41.     Point A;
42.     cout<<"Write x"<<endl;
43.     cin>>A.x;
44.     cout<<"Write y"<<endl;
45.     cin>>A.y;
46.     return A;
47. }
48. void print_Point(Point A)
49. {
50.     cout<<"["<<A.x<<";"<<A.y<<"]"<<endl;
51. }
52. Figure input_Figure()
53. {
54.     Figure A;
55.     cout<<"Write count of Point"<<endl;
56.     cin>>A.count_Point;
57.     for (int i = 0; i < A.count_Point; i++) {
58.     cout<<"Point "<<i+1<<":"<<endl;
59.        A.Points[i]=input_Point();
60.     }
61.     return A;
62. }
63. ArrayFigure input_ArrayFigure()
64. {
65.     ArrayFigure A;
66.     cout<<"Write count of Figure"<<endl;
67.     cin>>A.count_Figure;
68.     for (int i = 0; i < A.count_Figure; i++) {
69.     cout<<"Figure "<<i+1<<":"<<endl;
70.        A.Figures[i]=input_Figure();
71.     }
72.     return A;
73. }
74. void print_ArrayFigure(ArrayFigure array)
75. {
76.     for(int i =0;i<array.count_Figure;i++)
77.     print_Figure(array.Figures[i]);
78. }
79. void print_Figure(Figure A)
80. {
81.     for(int i =0;i<A.count_Point;i++)
82.     print_Point(A.Points[i]);
83. }
84. void rotate(Figure a,int angle)
85. {
86.     double x=0,y=0;
87.     for (int i = 0; i < a.count_Point; i++) {
88.
89.         x=a.Points[i].x*cos(angle * PI / 180)-a.Points[i].y*sin(angle * PI / 180);
90.         y=a.Points[i].x*sin(angle * PI / 180)+a.Points[i].y*cos(angle * PI / 180);
91.         a.Points[i].x=x;
92.         a.Points[i].y=y;
93.     }
94.     cout<<"Rotate Figure"<<endl;
95.     print_Figure(a);
96. }
97.
98. float distace(Point a,Point b)
99. {
100.     return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2))
101. }
102.
103. float *get_y_array_from_figure(Figure figure)
104. {
105.     float *result = new float[figure.count_Point];
106.     for(int i;i<figure.count_Point;i++)
107.     {
108.         result[i]=figure.Points[i].y;
109.     }
110.     return result
111. }
112. float max_y_figure(Figure figure)
113. {
114.     return max_of_array(get_y_array(figure))
115. }
116.
117. Point search_top(ArrayFigure array)
118. {
119.     float *tmp = new float[array.count_Figure];
120.     for(int i;i<array.count_Figure;i++)
121.     {
122.         tmp[i]=max_y_figure(array[i]);
123.     }
124.     Point max;
125.     max.x=0;
126.     max.y=max_of_array(tmp)
127.     return max;
128. }
129.
130. float min_distance_from_figure(Figure figure,Point top)
131. {
132.     float min=0
133.     for(int i=0;i<figure.count_Point;i++)
134.     {
135.         float tmp=distace(figure.Points[i],top);
136.         if(tmp<min)
137.         {
138.             min=tmp;
139.         }
140.     }
141.     return min;
142. }
143. void ArrayFigureSort(ArrayFigure array) // сортировка пузырьком
144. {
145.
146.  int length_array=array.count_Figure
147.  Figure temp; // временная переменная для хранения элемента массива
148.  bool exit = false; // болевая переменная для выхода из цикла, если массив отсортирован
149.  Point top = search_top(array)
150.  while (!exit) // пока массив не отсортирован
151.  {
152.   exit = true;
153.   for (int i = 0; i < (length_array - 1); i++) // внутренний цикл
154.     float a=min_distance_from_figure(array.Figures[i],top)
155.     float b=min_distance_from_figure(array.Figures[i+1],top)
156.     if (a < b) // сравниваем два соседних элемента
157.     {
158.      // выполняем перестановку элементов массива
159.      temp = array.Figures[i];
160.      array.Figures[i] = array.Figures[i + 1];
161.      array.Figures[i + 1] = temp;
162.      exit = false; // на очередной итерации была произведена перестановка элементов
163.     }
164.  }
165. }
166.
167.
168. int main(){
169.
170.
171.     ArrayFigure arr=input_ArrayFigure();
172.
173.     print_ArrayFigure(arr);
174.
175.     ArrayFigureSort(arr);
176.
177.     print_ArrayFigure(arr);
178.
179.     system("pause");
180.
181.
182. }
RAW Paste Data