Advertisement
mon0l1t

SortFigure

Sep 30th, 2020
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement