Posted By

jajojejeje on 12/08/18


Tagged

Lab7ABcentroid


Versions (?)

Lab7AB_centroid


 / Published in: C++
 

Lab7AB_centroid

  1. #include "pch.h"
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <numeric>
  5. #include <random>
  6. #include <list>
  7. #include <vector>
  8. #include <iterator>
  9. #include <functional>
  10. #include <cmath>
  11.  
  12. using namespace std;
  13.  
  14. class generatorLiczbNorm {
  15. // static – poniewa? ma by? jeden generator dla ca?ego programu:
  16. static default_random_engine rng;
  17. // produkuje liczby o rozk?. normalnym korzystaj?c z generatora rng:
  18. normal_distribution<double> dist;
  19. public:
  20. generatorLiczbNorm(double mi = 0, double sigma = 1) : dist(mi, sigma) {};
  21. double operator()() {
  22. return dist(rng);
  23. }
  24. };
  25. default_random_engine generatorLiczbNorm::rng;
  26.  
  27. class UstalPozycjePunktu {
  28. int n;
  29. public:
  30. UstalPozycjePunktu(int n) : n(n) {}
  31. void operator()(vector<double>& v);
  32. };
  33.  
  34. class Dodawanie_budowaniePunktu{
  35. public:
  36. vector<double> operator()(vector<double> v,double a) {
  37. v.push_back(a);
  38. return v;
  39. }
  40. };
  41.  
  42. class Mnozenie_SumowanieWspolrzednych{
  43. public:
  44. double operator()(double a,double b) {
  45. return a + b;
  46. }
  47. };
  48.  
  49. class Sumuj {
  50. public:
  51. vector<double> operator()(vector<double> x,vector<double> y) {
  52. Dodawanie_budowaniePunktu d;
  53. Mnozenie_SumowanieWspolrzednych m;
  54. vector<double> zero;
  55. //fill(zero.begin(), zero.end(), 0);
  56. vector<double> suma
  57. = inner_product(x.begin(), x.end(), y.begin(), zero, d,m);
  58. return suma;
  59. }
  60.  
  61. };
  62.  
  63. void UstalPozycjePunktu::operator()(vector<double>& v) {
  64. vector<double> tmp(n);
  65. v = tmp;
  66. generatorLiczbNorm gln(5,10);
  67. double d = gln();
  68. generate_n(v.begin(), v.size(), gln);
  69. }
  70.  
  71. void ustalPozycjePunktow(list<vector<double>>& lista,int n) {
  72. UstalPozycjePunktu upp(n);
  73. for_each(lista.begin(), lista.end(), upp);
  74. }
  75.  
  76. vector<double> punktWynikowy(list<vector<double>>& lista) {
  77. //vector<double> zero()
  78. Sumuj sumuj;
  79. //vector<double> zero2 = lista.front.size());
  80. vector<double> zero(lista.front().size());
  81. fill(zero.begin(), zero.end(), 0);
  82. vector<double> wynik = accumulate(lista.begin(), lista.end(), zero, sumuj);
  83. return wynik;
  84. }
  85.  
  86. template <typename Iterator>
  87. void wypisz(Iterator first, Iterator last) {
  88. std::ostream_iterator<double> out_it(std::cout, ", ");
  89. std::copy(first, last, out_it);
  90. cout << endl;
  91. }
  92. //
  93. //class Dodawanie {
  94. //public:
  95. // operator()() {
  96. //
  97. // }
  98. //};
  99. //
  100. //class Mnozenie {
  101. //public:
  102. // operator()(vector<double> a, vector<double> b) {
  103. //
  104. // }
  105. //};
  106.  
  107. double odlegloscPunktuOdSrodka(vector<double> punkt) {
  108. double wynik = accumulate(punkt.begin(), punkt.end(), 0.0, [](double a, double b)->double {
  109. return a + b * b;
  110. });
  111. return sqrt(wynik);
  112. }
  113.  
  114. double maxR(list<vector<double>> punkty) {
  115. vector<double> wynik = accumulate(punkty.begin(), punkty.end(), punkty.front(), [](vector<double> a, vector<double> b)->vector<double> {
  116. double odlegloscA = odlegloscPunktuOdSrodka(a);
  117. double odlrgloscB = odlegloscPunktuOdSrodka(b);
  118. if (odlegloscA > odlrgloscB) {
  119. return a;
  120. }
  121. else {
  122. return b;
  123. }
  124. });
  125. return odlegloscPunktuOdSrodka(wynik);
  126. }
  127.  
  128. //class DzielenieLiczb {
  129. //public:
  130. // double operator()(double dzielna,double dzielnik) {
  131. // return dzielna / dzielnik;
  132. // }
  133. //};
  134. //
  135. //class DzielenieWektorow {
  136. // vector<double> dzielnik;
  137. //public:
  138. // DzielenieWektorow(vector<double> dzielnik) : dzielnik(dzielnik) {}
  139. // vector<double> operator()(const vector<double> v) {
  140. // int n = v.size();
  141. // DzielenieLiczb d;
  142. // vector<double> wynik(n);
  143. // transform(v.begin(), v.end(),v.begin(), wynik.begin(), d);
  144. // }
  145. //};
  146. //
  147. list<vector<double>> skaluj(list<vector<double>> punkty,vector<double> centroid) {
  148. auto lambda = [centroid](vector<double> v)->vector<double> {
  149. auto lambda = [](double a,double b)->double {return 2*a-b; };
  150. transform(v.begin(), v.end(), centroid.begin(), v.begin(), lambda);
  151. return v;
  152. };
  153. transform(punkty.begin(), punkty.end(), punkty.begin(), lambda);
  154. return punkty;
  155. }
  156.  
  157.  
  158. vector<double> podziel(vector<double> dzielna, int dzielnik) {
  159. transform(dzielna.begin(), dzielna.end(), dzielna.begin(), [dzielnik](double a)->double {return a/dzielnik ; });
  160. return dzielna;
  161. }
  162.  
  163. vector<double> obliczCentroid(list<vector<double>> punkty) {
  164. int n = punkty.size();
  165. vector<double> punkt = punktWynikowy(punkty);
  166. vector<double> centroid = podziel(punkt, n);
  167. return centroid;
  168. }
  169.  
  170. int zliczWystajace(list<vector<double>> punkty,double promien) {
  171. int ile=0;
  172. for_each(punkty.begin(), punkty.end(), [&ile,promien](vector<double> v)->void {
  173. if (odlegloscPunktuOdSrodka(v) > promien)
  174. ile++;
  175. });
  176. return ile;
  177. }
  178.  
  179. int main()
  180. {
  181. int LICZBA_PUNKTOW = 3;
  182. int LICZBA_WYMIAROW = 2;
  183. list<vector<double>> punkty(LICZBA_PUNKTOW);
  184. ustalPozycjePunktow(punkty,LICZBA_WYMIAROW);
  185.  
  186. vector<double> centroid = obliczCentroid(punkty);
  187. wypisz(centroid.begin(), centroid.end());
  188.  
  189. list<vector<double>> punkty2=punkty;
  190. punkty2 = skaluj(punkty2, centroid);
  191. vector<double> centroid2 = obliczCentroid(punkty2);
  192. wypisz(centroid2.begin(), centroid2.end());
  193.  
  194. double R = maxR(punkty);
  195.  
  196. int ileWystaje = zliczWystajace(punkty2,R);
  197.  
  198. std::cout << "Hello World!\n";
  199. }

Report this snippet  

You need to login to post a comment.