Advertisement
Quebonamade

Untitled

Jan 26th, 2020
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. //ALGO2 IS1 213B LAB10
  2. //Nataniel Antosik
  3. //an44260@zut.edu.pl
  4.  
  5. #include<iostream>
  6. #include<vector>
  7. #include<fstream>
  8. #include<time.h>
  9. #include<string>
  10. #include<vector>
  11.  
  12. using namespace std;
  13.  
  14. class Punkty {
  15. public:
  16. double x, y; //współrzędne
  17. int indeks; //numer obiektu
  18. Punkty(double x, double y, int indeks) { //przekazujemy dane do tworzenia obiektu
  19. this->x = x; //nadajemy im wartości i numer danemu obiektowi
  20. this->y = y;
  21. this->indeks = indeks;
  22. }
  23. Punkty() {} //pusty konstruktor dla tablicy
  24. ~Punkty() {} //destruktor
  25. };
  26.  
  27. int CMP(Punkty point1, Punkty point2) { //Comparator Graham, przekazujemy dwa obiekty z tablicy
  28. double cross_prod = (point1.y * point2.x) - (point2.y * point1.x); //cross, sprawdzamy czy punkt, jest na lewo czy na prawo od poprzedniego
  29. if (cross_prod > 0.0) //jest na lewo
  30. return 1;
  31. if (cross_prod < 0.0) //jest na prawo
  32. return -1;
  33. return 0;
  34. }
  35.  
  36. int CMP3pkt(Punkty point1, Punkty point2, Punkty point3) { //komperator 3 punktowy, działa tak samo jak 2 pkt tylko sprawdza kąt od punktu (0.0,0.0)
  37. double cross_prod = (point1.y - point3.y) * (point2.x - point3.x) - (point2.y - point3.y) * (point1.x - point3.x);
  38. if (cross_prod > 0.0) //jest na lewo podwzględem kąta
  39. return 1;
  40. if (cross_prod < 0.0) //jest na prawo podwzględem kąta
  41. return -1;
  42. return 0;
  43. }
  44.  
  45. void merge(Punkty * tablica, int start, int s, int koniec)
  46. {
  47. Punkty* tmp1 = new Punkty[(s - start + 1)]; // utworzenie tablicy pomocniczej lewej
  48. Punkty* tmp2 = new Punkty[(koniec - s)]; // utworzenie tablicy pomocniczej prawej
  49. int i = start, j = s + 1, k = 0; // zmienne pomocnicze
  50.  
  51. while (i <= s && j <= koniec) { // Skopiowanie danych do tablicy pomocniczej
  52. if (CMP3pkt(tablica[i], tablica[j], tablica[0]) < 0) { //sprawdzamy kąt i, j podwzględem kątu elementu 0
  53. tmp1[k] = tablica[j]; //przypisujemy do prawego
  54. j++;
  55. }
  56. else {
  57. tmp1[k] = tablica[i]; //przypisujemy do lewego
  58. i++;
  59. }
  60. k++;
  61. }
  62.  
  63. if (i <= s) {
  64. while (i <= s) {
  65. tmp1[k] = tablica[i]; //do tablicy przypisujemy wartości z tmp
  66. i++;
  67. k++;
  68. }
  69. }
  70. else {
  71. while (j <= koniec) {
  72. tmp2[k] = tablica[j]; //przypisujemy do lewego
  73. j++;
  74. k++;
  75. }
  76. }
  77. }
  78.  
  79. void merge_Sort(Punkty * tablica, int start, int koniec)
  80. {
  81. int s; //środek
  82. if (start != koniec) {
  83. s = (start + koniec) / 2;
  84. merge_Sort(tablica, start, s); // Dzielenie lewej części
  85. merge_Sort(tablica, s + 1, koniec); // Dzielenie prawej części
  86. merge(tablica, start, s, koniec); // Łączenie części lewej i prawej
  87. }
  88. }
  89.  
  90. vector<Punkty> convex_Hull(Punkty * tab, int N) { //przekazujemy tablice obiektów (czyli punkty), i rozmiar
  91. vector<Punkty> wynik; //wetkor wynikowy
  92. wynik.push_back(tab[0]); //dodajemy pierszwe trzy elementy do naszego wektora wynikowego
  93. wynik.push_back(tab[1]);
  94. wynik.push_back(tab[2]);
  95. merge_Sort(tab, 1, N);
  96. if (CMP(wynik[1], wynik[2]) > 0) { //Comperator dla pierwszego i drugiego elementu, jeżeli zwróci 1 to
  97. swap(wynik[1], wynik[2]); //zamieniamy miejscami obiekty w wektorze
  98. wynik.pop_back(); //usuwamy ostatni element w wektorze
  99. }
  100. for (int i = 3; i < N; i++) { //przypadek dla kolejnych elementów
  101. int rozmiar = wynik.size() - 1; //rozmiar dla naszego wektora wynikowego
  102. if (CMP(wynik[rozmiar], tab[i]) < 0) { //Comperator dla pierwszego i drugiego elementu, jeżeli zwróci 1 to
  103. wynik.pop_back(); //nowy element jest na prawo więc usuwamy
  104. wynik.push_back(tab[i]); //dodajemy kolejny element do sprawdzania
  105. }
  106. else { wynik.push_back(tab[i]); } //przypadek nowy punkt jest na lewo czyli działa poprawnie
  107. }
  108. return wynik;
  109. }
  110.  
  111. void znajdzMIN(Punkty tab[], int N) {
  112. int minimum = tab[0].indeks; //zapisujemy sobie pierwszy indeks jako minimum
  113. for (int i = 1; i < N; i++) { //pętla po każdym obiekcie
  114. if (tab[i].y < tab[minimum].y) { //szukamy najmniejszego y
  115. minimum = tab[i].indeks;
  116. }
  117. else if (tab[i].y == tab[minimum].y) { //przypadek kiedy y są równe
  118. if (tab[i].x < tab[minimum].x) { //szukamy najmniejszego x
  119. minimum = tab[i].indeks;
  120. }
  121. }
  122. }
  123.  
  124. swap(tab[minimum].x, tab[0].x); //zamieniamy wszystkie dane z znalezionego minimum
  125. swap(tab[minimum].y, tab[0].y);
  126. swap(tab[minimum].indeks, tab[0].indeks);
  127.  
  128. for (int j = N - 1; j >= 0; j--) { //przechodzimy od końca do początku i odejmujemy wartości od minimum
  129. tab[j].x = tab[j].x - tab[0].x;
  130. tab[j].y = tab[j].y - tab[0].y;
  131. }
  132. }
  133.  
  134.  
  135. int main()
  136. {
  137. vector<Punkty> convex;
  138. int n, x, y, indeks;
  139. fstream plik;
  140. plik.open("points1.txt");
  141. if (plik.good())
  142. {
  143. cout << "Znaleziono plik" << endl;
  144. }
  145. else {
  146. cout << "Nie znaleziono pliku" << endl;
  147. exit(0);
  148. }
  149.  
  150. plik >> n; //ilość wszystkich punktów
  151. Punkty* tablica = new Punkty[n]; //tworzymy wskaźnik na tablice obiektów o rozmiarze podanym jako pierwsza wartość z pliku
  152. for (int i = 0; i < n; i++) { //pętla dodająca nowe obiekty
  153. plik >> tablica[i].x; //przypisujemy do nowego obiektu wartości x i y z układu współrzędnych
  154. plik >> tablica[i].y;
  155. tablica[i].indeks = i; //nadajemy indeks nowemu obiektowi
  156. }
  157. plik.close(); //zamykamy plik
  158.  
  159. cout << "Ilosc elementow: " << n << endl;
  160. for (int i = 0; i < n; i++) {
  161. cout << "Wartosci w indeksie " << tablica[i].indeks << " x: " << tablica[i].x << " y: " << tablica[i].y << endl;
  162. }
  163. cout << "MIN" << endl;
  164. znajdzMIN(tablica, n);
  165. cout << "Ilosc elementow: " << n << endl;
  166. for (int i = 0; i < n; i++) {
  167. cout << "Wartosci w indeksie " << tablica[i].indeks << " x: " << tablica[i].x << " y: " << tablica[i].y << endl;
  168. }
  169. convex = convex_Hull(tablica, n);
  170.  
  171. cout << "Ilosc elementow: " << n << endl;
  172. for (int i = 0; i < n; i++) {
  173. cout << "Wartosci w indeksie " << convex[i].indeks << " x: " << convex[i].x << " y: " << convex[i].y << endl;
  174. }
  175.  
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement