DarkDevourer

Курсовая ООП с классом (нерабочая)

May 20th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.75 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <math.h>
  4. #include <cstdlib>
  5. #include <string>
  6. #include <fstream>
  7. #include <GL/freeglut.h>
  8. #include <windows.h>
  9. #include <ctime>
  10.  
  11. using namespace std;
  12.  
  13.  
  14. class Graphics
  15. {
  16. private:
  17. double *X; //Указатели на будущий динамический массив
  18. int N, w, h; //Размерность массива и графика
  19. static Graphics* currentInstance;
  20. string changer; //Строка для рисования числа-масштаба на экран. Нужна для того, чтобы убрать 0 после ",", если дробная часть равна 0 или бесконечно мала
  21. public:
  22. Graphics(int);
  23. ~Graphics();
  24. void Fill_Rand(int, int);
  25. void Fill_File();
  26. void Printing_Arrays_into_Files(); //Метод, записывающий массив X[k] в файл
  27. void Graph_Draw1(int argc, char * argv[]); //Подпрограмма, создающая график массива X[k]
  28. void Graph_Draw2(int argc, char * argv[]); //Подпрограмма, создающая частотную характеристику массива X[k]
  29. void Graph_Draw3(int argc, char * argv[]); //Подпрограмма, создающая гистограмму массива X[k]
  30. private:
  31. static void drawCallback1()
  32. {
  33. currentInstance->Graphics_Creation1();
  34. }
  35. static void drawCallback2()
  36. {
  37. currentInstance->Graphics_Creation2();
  38. }
  39. static void drawCallback3()
  40. {
  41. currentInstance->Graphics_Creation3();
  42. }
  43. void Graphics_Creation1(); //Подпрограмма, создающая график массива X[k]
  44. void Graphics_Creation2(); //Подпрограмма, создающая частотную характеристику массива X[k]
  45. void Graphics_Creation3(); //Подпрограмма, создающая гистограмму массива X[k]
  46. void PrintText(float x, float y, int r, int g, int b, string string); //Подпрограмма, показывающая текст на экране (для расположения координат и названий осей графиков)
  47. //void reshape();
  48. void ScreenShot1(int W, int H); //Подпрограмма, сохраняющая график X[k] функции в bmp-файл
  49. void ScreenShot2(int W, int H); //Подпрограмма, сохраняющая частотный график в bmp-файл
  50. void ScreenShot3(int W, int H); //Подпрограмма, сохраняющая гистограмму в bmp-файл
  51. };
  52.  
  53. Graphics::Graphics(int N1)
  54. {
  55. this->N = N1;
  56. this->w = 1900;
  57. this->h = 1000;
  58. X = new double[N1];
  59. }
  60.  
  61. Graphics::~Graphics()
  62. {
  63. delete[] X;
  64. }
  65.  
  66. void Graphics::Fill_Rand(int range, int min)
  67. {
  68. srand(time(NULL));
  69. for (int i = 0; i < N; i++)
  70. X[i] = rand() % range - min;
  71. }
  72.  
  73. void Graphics::Fill_File()
  74. {
  75. ifstream in("C:\\Kursovaya\\KursovayaInput.txt");
  76. string tmp;
  77. if (!in.is_open()) //Проверка, открылся файл или нет
  78. {
  79. cout << "Файл открыть не удалось. Пожалуйста, проверьте, правильно ли введено имя файла и его наличие.\nИмя файла по умолчанию - C:\\test\\KursovayaInput.txt" << endl;
  80. cin.ignore();
  81. return;
  82. }
  83. for (int i = 0; i < N; i++)
  84. {
  85. in >> tmp;
  86. try
  87. {
  88. X[i] = stod(tmp);
  89. }
  90. catch (...)
  91. {
  92. cout << "Произошла ошибка.";
  93. in.close();
  94. }
  95. in.close();
  96. }
  97. }
  98.  
  99. void Graphics::Graph_Draw1(int argc, char * argv[])
  100. {
  101. currentInstance = this;
  102. glutInit(&argc, argv);
  103. glutInitDisplayMode(GLUT_DOUBLE);
  104. glutInitWindowPosition(0, 0);
  105. glutInitWindowSize(w, h);
  106. glutCreateWindow("Графики массивов");
  107.  
  108. glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
  109. GLUT_ACTION_GLUTMAINLOOP_RETURNS);
  110.  
  111. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  112.  
  113. //glutReshapeFunc(reshape);
  114.  
  115. ::glutDisplayFunc(Graphics::drawCallback1);
  116.  
  117. glutMainLoop();
  118. }
  119.  
  120. void Graphics::Graph_Draw2(int argc, char * argv[])
  121. {
  122. currentInstance = this;
  123. glutInit(&argc, argv);
  124. glutInitDisplayMode(GLUT_DOUBLE);
  125. glutInitWindowPosition(0, 0);
  126. glutInitWindowSize(w, h);
  127. glutCreateWindow("Графики массивов");
  128.  
  129. glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
  130. GLUT_ACTION_GLUTMAINLOOP_RETURNS);
  131.  
  132. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  133.  
  134. //glutReshapeFunc(reshape);
  135.  
  136. ::glutDisplayFunc(Graphics::drawCallback2);
  137.  
  138. glutMainLoop();
  139. }
  140.  
  141. void Graphics::Graph_Draw3(int argc, char * argv[])
  142. {
  143. currentInstance = this;
  144. glutInit(&argc, argv);
  145. glutInitDisplayMode(GLUT_DOUBLE);
  146. glutInitWindowPosition(0, 0);
  147. glutInitWindowSize(w, h);
  148. glutCreateWindow("Графики массивов");
  149.  
  150. glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
  151. GLUT_ACTION_GLUTMAINLOOP_RETURNS);
  152.  
  153. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  154.  
  155. //glutReshapeFunc(reshape);
  156.  
  157. ::glutDisplayFunc(Graphics::drawCallback3);
  158.  
  159. glutMainLoop();
  160. }
  161.  
  162. void Graphics::Printing_Arrays_into_Files() //Подпрограмма, записывающая массив X[k] в файл
  163. {
  164. int k;
  165. std::ofstream out;
  166. string tmp;
  167. out.open("C:\\Kursovaya\\KursovayaOutput.txt"); //Открытие файла вывода
  168. if (!out.is_open()) //Если файл не открылся
  169. {
  170. cout << "Файл для записи массивов: C:\\Kursovaya\\KursovayaOutput.txt - открыть не удалось." << endl;
  171. return;
  172. }
  173. out << "Массив X[k]:" << endl;
  174. for (k = 0; k < N; k++) //Запись массива X[k]
  175. {
  176. out << "X[" << k << "] = " << X[k] << endl;
  177. }
  178. out.close(); //Закрытие файла вывода
  179. }
  180.  
  181. /*void Graphics::reshape()
  182. {
  183. glViewport(0, 0, w, h);
  184.  
  185. glMatrixMode(GL_PROJECTION);
  186. glLoadIdentity();
  187. gluOrtho2D(0, w, 0, h);
  188.  
  189. glMatrixMode(GL_MODELVIEW);
  190. glLoadIdentity();
  191. }*/
  192.  
  193. void Graphics :: Graphics_Creation1() //Подпрограмма, создающая графики массивf X[k]
  194. {
  195. int length_x = w - 15; //Длина каждого графика по оси x
  196. int length_y = floor(h - 60);
  197. double y_max, y_min, length;
  198. int k, i, y;
  199. double mast_y;
  200. double mast_x = floor(w - 15 / N);
  201. glClear(GL_COLOR_BUFFER_BIT);
  202.  
  203. //Создание вертикальных и горизонтальных осей двух графиков
  204.  
  205.  
  206. glBegin(GL_LINES); //Построение вертикальной оси
  207. glColor3f(0.0, 0.0, 0.0);
  208. glVertex2i(5, h - 30);
  209. glColor3f(0.0, 0.0, 0.0);
  210. glVertex2i(5, h - 30 - length_y);
  211. glEnd();
  212.  
  213. glBegin(GL_LINES); //Черчение стрелки
  214. glColor3f(0.0, 0.0, 0.0);
  215. glVertex2i(5, h - 30);
  216. glColor3f(0.0, 0.0, 0.0);
  217. glVertex2i(0, h - 30 - 10);
  218. glEnd();
  219. glBegin(GL_LINES);
  220. glColor3f(0.0, 0.0, 0.0);
  221. glVertex2i(5, h - 30);
  222. glColor3f(0.0, 0.0, 0.0);
  223. glVertex2i(10, h - 30 - 10);
  224. glEnd();
  225.  
  226. y_max = 200;
  227. y_min = -200;
  228.  
  229. //Находим наибольший и наименьший элементы X[k]
  230. {
  231.  
  232. for (i = 1; i < N; i++)
  233. {
  234. if (y_max < X[i])
  235. {
  236. y_max = X[i];
  237. }
  238. else if (y_min > X[i])
  239. {
  240. y_min = X[i];
  241. }
  242. }
  243. }
  244.  
  245. //Построение горизонтальной оси
  246. length = y_max - y_min;
  247. mast_y = length_y / length; //Масштаб оси ординат по кол-ву точек
  248. y = h - 30 - length_y * y_max / length;
  249. glBegin(GL_LINES);
  250. glColor3f(0.0, 0.0, 0.0);
  251. glVertex2i(5, y);
  252. glColor3f(0.0, 0.0, 0.0);
  253. glVertex2i(w, y);
  254. glEnd();
  255.  
  256. glBegin(GL_LINES); //Черчение стрелки
  257. glColor3f(0.0, 0.0, 0.0);
  258. glVertex2i(w, y);
  259. glColor3f(0.0, 0.0, 0.0);
  260. glVertex2i(w - 10, y - 5);
  261. glEnd();
  262. glBegin(GL_LINES);
  263. glColor3f(0.0, 0.0, 0.0);
  264. glVertex2i(w, y);
  265. glColor3f(0.0, 0.0, 0.0);
  266. glVertex2i(w - 10, y + 5);
  267. glEnd();
  268.  
  269.  
  270. //Подписывание осей графиков
  271. PrintText(15, h - 30, 0, 0, 0, "X[k]");
  272. PrintText(w - 10, y - 15, 0, 0, 0, "k");
  273.  
  274. //Построение штрихов на горизонтальной оси
  275. for (i = 0; i < N; i++)
  276. {
  277. glBegin(GL_LINES); //X[k]
  278. glColor3f(0.0, 0.0, 0.0);
  279. glVertex2i(5 + mast_x * i / N, y + 5);
  280. glColor3f(0.0, 0.0, 0.0);
  281. glVertex2i(5 + mast_x * i / N, y - 5);
  282. glEnd();
  283. PrintText(5 + mast_x * i / N, y - 17, 0, 0, 0, to_string(i));
  284. }
  285.  
  286. //Построение штрихов на вертикальной оси
  287. //Количество штрихов фиксированно - 20. При -200<=y<=200 шаг равен 20. Иначе - меняется.
  288. //Если заменить 20 на N, а 19 - на N-1, число штрихов по вертикали станет равным числу штрихов по горизонтали
  289. for (k = 1; k <= 19; k++)
  290. {
  291.  
  292. if (y - k * length_y / 20 >= h - 30 - length_y)
  293. {
  294. glBegin(GL_LINES); //X[k]
  295. glColor3f(0.0, 0.0, 0.0);
  296. glVertex2i(0, y - k * length_y / 20);
  297. glColor3f(0.0, 0.0, 0.0);
  298. glVertex2i(10, y - k * length_y / 20);
  299. glEnd();
  300. changer = to_string(-(y_max - y_min) / 20 * k);
  301. if (-(y_max - y_min) / 20 * k + floor(-(y_max - y_min) / 20 * k) <= 0.000001)
  302. {
  303. changer.erase(changer.find(","), changer.length() - changer.find(","));
  304. }
  305. if (k != 0)
  306. {
  307. PrintText(15, y - k * length_y / 20 - 5, 0, 0, 0, changer);
  308. }
  309. }
  310. else
  311. {
  312. glBegin(GL_LINES); //X[k]
  313. glColor3f(0.0, 0.0, 0.0);
  314. glVertex2i(0, y + (20 - k) * length_y / 20);
  315. glColor3f(0.0, 0.0, 0.0);
  316. glVertex2i(10, y + (20 - k) * length_y / 20);
  317. glEnd();
  318. changer = to_string((y_max - y_min) / 20 * (20 - k));
  319. if ((y_max - y_min) / 20 * (20 - k) - floor((y_max - y_min) / 20 * (20 - k)) <= 0.000001)
  320. {
  321. changer.erase(changer.find(","), changer.length() - changer.find(","));
  322. }
  323. PrintText(15, y + (20 - k) * length_y / 20 - 5, 0, 0, 0, changer);
  324. }
  325.  
  326. }
  327.  
  328. //Построение графиков
  329.  
  330. for (k = 0; k < N; k++)
  331. {
  332. if (k != N - 1)
  333. {
  334. glBegin(GL_LINES); //X[k]
  335. glColor3f(0.0, 0.0, 0.0);
  336. glVertex2i(5 + k * mast_x / N, y + X[k] * mast_y);
  337. glColor3f(0.0, 0.0, 0.0);
  338. glVertex2i(5 + (k + 1) * mast_x / N, y + X[k + 1] * mast_y);
  339. glEnd();
  340.  
  341. }
  342.  
  343. glPointSize(5);
  344.  
  345. glBegin(GL_POINTS); //X[k] - выделение точек
  346. glColor3f(0.0, 0.0, 0.0);
  347. glVertex2i(5 + mast_x * k / N, y + X[k] * mast_y);
  348. glEnd();
  349.  
  350. }
  351.  
  352. ScreenShot1(w, h);
  353. glutSwapBuffers();
  354. }
  355.  
  356. //Подпрограмма, рисующая частотный график X[k]
  357. void Graphics::Graphics_Creation2()
  358. {
  359. int length_x = w - 15; //Длина оси x
  360. int length_y = h - 60; //Длина оси y
  361. double y_max, y_min, length;
  362. int u, i, y;
  363. double mast_y;
  364. double mast_x = floor(w - 15 / N);
  365. glClear(GL_COLOR_BUFFER_BIT);
  366.  
  367. //Создание вертикальных и горизонтальных осей графика
  368.  
  369. glBegin(GL_LINES); //Построение вертикальной оси
  370. glColor3f(0.0, 0.0, 0.0);
  371. glVertex2i(5, h - 30);
  372. glColor3f(0.0, 0.0, 0.0);
  373. glVertex2i(5, h - 30 - length_y);
  374. glEnd();
  375.  
  376. glBegin(GL_LINES); //Черчение стрелки
  377. glColor3f(0.0, 0.0, 0.0);
  378. glVertex2i(5, h - 30);
  379. glColor3f(0.0, 0.0, 0.0);
  380. glVertex2i(0, h - 40);
  381. glEnd();
  382. glBegin(GL_LINES);
  383. glColor3f(0.0, 0.0, 0.0);
  384. glVertex2i(5, h - 30);
  385. glColor3f(0.0, 0.0, 0.0);
  386. glVertex2i(10, h - 40);
  387. glEnd();
  388.  
  389. y_max = 200;
  390. y_min = -200;
  391. for (i = 1; i < N; i++)
  392. {
  393. if (y_max < X[i])
  394. {
  395. y_max = X[i];
  396. }
  397. else if (y_min > X[i])
  398. {
  399. y_min = X[i];
  400. }
  401. }
  402. //Построение горизонтальной оси
  403. length = y_max - y_min;
  404. mast_y = length_y / length; //Масштаб оси ординат по кол-ву точек
  405. y = h - 30 - length_y * y_max / length;
  406.  
  407. glBegin(GL_LINES);
  408. glColor3f(0.0, 0.0, 0.0);
  409. glVertex2i(5, y);
  410. glColor3f(0.0, 0.0, 0.0);
  411. glVertex2i(w, y);
  412. glEnd();
  413.  
  414. glBegin(GL_LINES); //Черчение стрелки
  415. glColor3f(0.0, 0.0, 0.0);
  416. glVertex2i(w, y);
  417. glColor3f(0.0, 0.0, 0.0);
  418. glVertex2i(w - 10, y - 5);
  419. glEnd();
  420. glBegin(GL_LINES);
  421. glColor3f(0.0, 0.0, 0.0);
  422. glVertex2i(w, y);
  423. glColor3f(0.0, 0.0, 0.0);
  424. glVertex2i(w - 10, y + 5);
  425. glEnd();
  426.  
  427.  
  428. //Подписывание осей графиков
  429. PrintText(15, h - 30, 0, 0, 0, "H[u]");
  430. PrintText(w - 10, y - 15, 0, 0, 0, "u");
  431.  
  432. //Построение штрихов на горизонтальной оси
  433. for (u = 0; u < N; u++)
  434. {
  435. glBegin(GL_LINES); //X[k]
  436. glColor3f(0.0, 0.0, 0.0);
  437. glVertex2i(5 + mast_x * u / N, y + 5);
  438. glColor3f(0.0, 0.0, 0.0);
  439. glVertex2i(5 + mast_x * u / N, y - 5);
  440. glEnd();
  441. PrintText(5 + mast_x * u / N, y - 17, 0, 0, 0, to_string(u));
  442. }
  443.  
  444. //Построение штрихов на вертикальной оси
  445. //Количество штрихов фиксированно - 20. При -200<=y<=200 шаг равен 20. Иначе - меняется.
  446. //Если заменить 20 на N, а 19 - на N-1, число штрихов по вертикали станет равным числу штрихов по горизонтали
  447. for (u = 1; u <= 19; u++)
  448. {
  449. if (y - u * length_y / 20 >= h - 30 - length_y)
  450. {
  451. glBegin(GL_LINES); //X[k]
  452. glColor3f(0.0, 0.0, 0.0);
  453. glVertex2i(0, y - u * length_y / 20);
  454. glColor3f(0.0, 0.0, 0.0);
  455. glVertex2i(10, y - u * length_y / 20);
  456. glEnd();
  457. if (u != 0)
  458. {
  459. changer = to_string(-(y_max - y_min) / 20 * u);
  460. if (-(y_max - y_min) / 20 * u + floor(-(y_max - y_min) / 20 * u) <= 0.000001)
  461. {
  462. changer.erase(changer.find(","), changer.length() - changer.find(","));
  463. }
  464. PrintText(15, y - u * length_y / 20 - 5, 0, 0, 0, changer);
  465. }
  466. }
  467. else
  468. {
  469. glBegin(GL_LINES); //X[k]
  470. glColor3f(0.0, 0.0, 0.0);
  471. glVertex2i(0, y + (20 - u) * length_y / 20);
  472. glColor3f(0.0, 0.0, 0.0);
  473. glVertex2i(10, y + (20 - u) * length_y / 20);
  474. glEnd();
  475. changer = to_string((y_max - y_min) / 20 * (20 - u));
  476. if ((y_max - y_min) / 20 * (20 - u) - floor((y_max - y_min) / 20 * (20 - u)) <= 0.000001)
  477. {
  478. changer.erase(changer.find(","), changer.length() - changer.find(","));
  479. }
  480. PrintText(15, y + (20 - u) * length_y / 20 - 5, 0, 0, 0, changer);
  481. }
  482. }
  483.  
  484. //Построение графиков
  485.  
  486. for (u = 0; u < N; u++)
  487. {
  488. glBegin(GL_LINES); //H[k]
  489. glColor3f(0.0, 0.0, 0.0);
  490. glVertex2i(5 + u * mast_x / N, y);
  491. glColor3f(0.0, 0.0, 0.0);
  492. glVertex2i(5 + (u)* mast_x / N, y + X[u] * mast_y);
  493. glEnd();
  494.  
  495. glPointSize(5);
  496.  
  497. glBegin(GL_POINTS); //H[k] - выделение точек
  498. glColor3f(0.0, 0.0, 0.0);
  499. glVertex2i(5 + mast_x * u / N, y + X[u] * mast_y);
  500. glEnd();
  501.  
  502. }
  503.  
  504. ScreenShot2(w, h);
  505. glutSwapBuffers();
  506. }
  507.  
  508. void Graphics::Graphics_Creation3() //Подпрограмма, создающая графики массивf X[k]
  509. {
  510. int length_x = w - 15; //Длина каждого графика по оси x
  511. int length_y = floor(h - 60);
  512. double y_max, y_min, length;
  513. int k, i, y;
  514. double mast_y;
  515. double mast_x = floor(w - 15 / N);
  516. glClear(GL_COLOR_BUFFER_BIT);
  517.  
  518. //Создание вертикальных и горизонтальных осей двух графиков
  519.  
  520.  
  521. glBegin(GL_LINES); //Построение вертикальной оси
  522. glColor3f(0.0, 0.0, 0.0);
  523. glVertex2i(5, h - 30);
  524. glColor3f(0.0, 0.0, 0.0);
  525. glVertex2i(5, h - 30 - length_y);
  526. glEnd();
  527.  
  528. glBegin(GL_LINES); //Черчение стрелки
  529. glColor3f(0.0, 0.0, 0.0);
  530. glVertex2i(5, h - 30);
  531. glColor3f(0.0, 0.0, 0.0);
  532. glVertex2i(0, h - 30 - 10);
  533. glEnd();
  534. glBegin(GL_LINES);
  535. glColor3f(0.0, 0.0, 0.0);
  536. glVertex2i(5, h - 30);
  537. glColor3f(0.0, 0.0, 0.0);
  538. glVertex2i(10, h - 30 - 10);
  539. glEnd();
  540.  
  541. y_max = 200;
  542. y_min = -200;
  543.  
  544. //Находим наибольший и наименьший элементы X[k]
  545. {
  546.  
  547. for (i = 1; i < N; i++)
  548. {
  549. if (y_max < X[i])
  550. {
  551. y_max = X[i];
  552. }
  553. else if (y_min > X[i])
  554. {
  555. y_min = X[i];
  556. }
  557. }
  558. }
  559.  
  560. //Построение горизонтальной оси
  561. length = y_max - y_min;
  562. mast_y = length_y / length; //Масштаб оси ординат по кол-ву точек
  563. y = h - 30 - length_y * y_max / length;
  564. glBegin(GL_LINES);
  565. glColor3f(0.0, 0.0, 0.0);
  566. glVertex2i(5, y);
  567. glColor3f(0.0, 0.0, 0.0);
  568. glVertex2i(w, y);
  569. glEnd();
  570.  
  571. glBegin(GL_LINES); //Черчение стрелки
  572. glColor3f(0.0, 0.0, 0.0);
  573. glVertex2i(w, y);
  574. glColor3f(0.0, 0.0, 0.0);
  575. glVertex2i(w - 10, y - 5);
  576. glEnd();
  577. glBegin(GL_LINES);
  578. glColor3f(0.0, 0.0, 0.0);
  579. glVertex2i(w, y);
  580. glColor3f(0.0, 0.0, 0.0);
  581. glVertex2i(w - 10, y + 5);
  582. glEnd();
  583.  
  584.  
  585. //Подписывание осей графиков
  586. PrintText(15, h - 30, 0, 0, 0, "X[k]");
  587. PrintText(w - 10, y - 15, 0, 0, 0, "k");
  588.  
  589. //Построение штрихов на горизонтальной оси
  590. for (i = 0; i < N; i++)
  591. {
  592. glBegin(GL_LINES); //X[k]
  593. glColor3f(0.0, 0.0, 0.0);
  594. glVertex2i(5 + mast_x * i / N, y + 5);
  595. glColor3f(0.0, 0.0, 0.0);
  596. glVertex2i(5 + mast_x * i / N, y - 5);
  597. glEnd();
  598. PrintText(5 + mast_x * i / N, y - 17, 0, 0, 0, to_string(i));
  599. }
  600.  
  601. //Построение штрихов на вертикальной оси
  602. //Количество штрихов фиксированно - 20. При -200<=y<=200 шаг равен 20. Иначе - меняется.
  603. //Если заменить 20 на N, а 19 - на N-1, число штрихов по вертикали станет равным числу штрихов по горизонтали
  604. for (k = 1; k <= 19; k++)
  605. {
  606.  
  607. if (y - k * length_y / 20 >= h - 30 - length_y)
  608. {
  609. glBegin(GL_LINES); //X[k]
  610. glColor3f(0.0, 0.0, 0.0);
  611. glVertex2i(0, y - k * length_y / 20);
  612. glColor3f(0.0, 0.0, 0.0);
  613. glVertex2i(10, y - k * length_y / 20);
  614. glEnd();
  615. changer = to_string(-(y_max - y_min) / 20 * k);
  616. if (-(y_max - y_min) / 20 * k + floor(-(y_max - y_min) / 20 * k) <= 0.000001)
  617. {
  618. changer.erase(changer.find(","), changer.length() - changer.find(","));
  619. }
  620. if (k != 0)
  621. {
  622. PrintText(15, y - k * length_y / 20 - 5, 0, 0, 0, changer);
  623. }
  624. }
  625. else
  626. {
  627. glBegin(GL_LINES); //X[k]
  628. glColor3f(0.0, 0.0, 0.0);
  629. glVertex2i(0, y + (20 - k) * length_y / 20);
  630. glColor3f(0.0, 0.0, 0.0);
  631. glVertex2i(10, y + (20 - k) * length_y / 20);
  632. glEnd();
  633. changer = to_string((y_max - y_min) / 20 * (20 - k));
  634. if ((y_max - y_min) / 20 * (20 - k) - floor((y_max - y_min) / 20 * (20 - k)) <= 0.000001)
  635. {
  636. changer.erase(changer.find(","), changer.length() - changer.find(","));
  637. }
  638. PrintText(15, y + (20 - k) * length_y / 20 - 5, 0, 0, 0, changer);
  639. }
  640.  
  641. }
  642.  
  643. //Построение графиков
  644.  
  645. for (k = 0; k < N; k++)
  646. {
  647. if (k != N - 1)
  648. {
  649. glBegin(GL_LINES); //X[k]
  650. glColor3f(0.0, 0.0, 0.0);
  651. glVertex2i(5 + k * mast_x / N, y);
  652. glColor3f(0.0, 0.0, 0.0);
  653. glVertex2i(5 + k * mast_x / N, y + X[k] * mast_y);
  654. glEnd();
  655.  
  656. glBegin(GL_LINES);
  657. glColor3f(0.0, 0.0, 0.0);
  658. glVertex2i(5 + (k + 1) * mast_x / N, y);
  659. glColor3f(0.0, 0.0, 0.0);
  660. glVertex2i(5 + (k + 1)* mast_x / N, y + X[k] * mast_y);
  661. glEnd();
  662.  
  663. glBegin(GL_LINES); //X[k]
  664. glColor3f(0.0, 0.0, 0.0);
  665. glVertex2i(5 + k * mast_x / N, y + X[k] * mast_y);
  666. glColor3f(0.0, 0.0, 0.0);
  667. glVertex2i(5 + (k + 1)* mast_x / N, y + X[k] * mast_y);
  668. glEnd();
  669.  
  670. }
  671.  
  672. }
  673.  
  674. ScreenShot3(w, h);
  675. glutSwapBuffers();
  676. }
  677.  
  678. //Подпрограмма, показывающая текст на экране (для расположения координат и названий осей графиков)
  679. void Graphics::PrintText(float x, float y, int r, int g, int b, string string)
  680. {
  681. char *text = new char[string.length()];
  682. glColor3f(r, g, b);
  683. glRasterPos2f(x, y);
  684. for (int i = 0; i < string.length(); i++)
  685. text[i] = string[i];
  686. for (int i = 0; i < string.length(); i++)
  687. {
  688. glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]);
  689. x += 2;
  690. }
  691. delete[] text;
  692. }
  693.  
  694.  
  695. /*void Graphics::reshape(int w, int h)
  696. {
  697. glViewport(0, 0, w, h);
  698.  
  699. glMatrixMode(GL_PROJECTION);
  700. glLoadIdentity();
  701. gluOrtho2D(0, w, 0, h);
  702.  
  703. glMatrixMode(GL_MODELVIEW);
  704. glLoadIdentity();
  705. }*/
  706.  
  707. void Graphics::ScreenShot1(int W, int H)
  708. {
  709. FILE *F = fopen("C:\\Kursovaya\\Graphs1.bmp", "w");
  710. if (F == NULL)
  711. {
  712. cout << "Файл для записи графика массива X[k] открыть/создать не удалось." << endl;
  713. return;
  714. }
  715.  
  716. const int imSize = W * H * 3;
  717. unsigned char *image = new unsigned char[imSize];
  718.  
  719. if (!image) //Проверка, выделилиась ли память
  720. {
  721. cout << "Не удалось выделить память под массивы." << endl;
  722. return;
  723. }
  724.  
  725. memset(image, 0, imSize);
  726. glReadPixels(0, 0, W, H, GL_RGB, GL_UNSIGNED_BYTE, image);
  727. BITMAPINFO bmi;
  728. unsigned char BMI = sizeof(BITMAPINFOHEADER);
  729. unsigned char BMF = sizeof(BITMAPFILEHEADER);
  730. memset(&bmi, 0, BMI);
  731. bmi.bmiHeader.biSize = BMI;
  732. bmi.bmiHeader.biHeight = H;
  733. bmi.bmiHeader.biWidth = W;
  734. bmi.bmiHeader.biPlanes = 1;
  735. bmi.bmiHeader.biBitCount = 24;
  736. bmi.bmiHeader.biCompression = BI_RGB;
  737. bmi.bmiHeader.biSizeImage = imSize;
  738.  
  739. int nBitsOffset = BMF + BMI;
  740. LONG lImageSize = imSize;
  741. LONG lFileSize = nBitsOffset + lImageSize;
  742. BITMAPFILEHEADER bmfh;
  743. bmfh.bfType = 0x4D42;
  744. bmfh.bfOffBits = nBitsOffset;
  745. bmfh.bfSize = lFileSize;
  746. bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
  747.  
  748. UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1, BMF, F);
  749. UINT nWrittenInfoHeaderSize = fwrite(&bmi, 1, BMI, F);
  750. UINT nWrittenDIBDataSize = fwrite(image, 1, imSize, F);
  751. UINT total = nWrittenDIBDataSize + nWrittenInfoHeaderSize + nWrittenFileHeaderSize;
  752. delete[]image;
  753. fclose(F);
  754. }
  755.  
  756. void Graphics::ScreenShot2(int W, int H)
  757. {
  758. FILE *F = fopen("C:\\Kursovaya\\Graphs2.bmp", "w");
  759. if (F == NULL)
  760. {
  761. cout << "Файл для записи частотного графика массива X[k] открыть/создать не удалось." << endl;
  762. return;
  763. }
  764.  
  765. const int imSize = W * H * 3;
  766. unsigned char *image = new unsigned char[imSize];
  767.  
  768. if (!image) //Проверка, выделилиась ли память
  769. {
  770. cout << "Не удалось выделить память под массивы." << endl;
  771. return;
  772. }
  773.  
  774. memset(image, 0, imSize);
  775. glReadPixels(0, 0, W, H, GL_RGB, GL_UNSIGNED_BYTE, image);
  776. BITMAPINFO bmi;
  777. unsigned char BMI = sizeof(BITMAPINFOHEADER);
  778. unsigned char BMF = sizeof(BITMAPFILEHEADER);
  779. memset(&bmi, 0, BMI);
  780. bmi.bmiHeader.biSize = BMI;
  781. bmi.bmiHeader.biHeight = H;
  782. bmi.bmiHeader.biWidth = W;
  783. bmi.bmiHeader.biPlanes = 1;
  784. bmi.bmiHeader.biBitCount = 24;
  785. bmi.bmiHeader.biCompression = BI_RGB;
  786. bmi.bmiHeader.biSizeImage = imSize;
  787.  
  788. int nBitsOffset = BMF + BMI;
  789. LONG lImageSize = imSize;
  790. LONG lFileSize = nBitsOffset + lImageSize;
  791. BITMAPFILEHEADER bmfh;
  792. bmfh.bfType = 0x4D42;
  793. bmfh.bfOffBits = nBitsOffset;
  794. bmfh.bfSize = lFileSize;
  795. bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
  796.  
  797. UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1, BMF, F);
  798. UINT nWrittenInfoHeaderSize = fwrite(&bmi, 1, BMI, F);
  799. UINT nWrittenDIBDataSize = fwrite(image, 1, imSize, F);
  800. UINT total = nWrittenDIBDataSize + nWrittenInfoHeaderSize + nWrittenFileHeaderSize;
  801. delete[]image;
  802. fclose(F);
  803. }
  804.  
  805. void Graphics::ScreenShot3(int W, int H)
  806. {
  807. FILE *F = fopen("C:\\Kursovaya\\Graphs3.bmp", "w");
  808. if (F == NULL)
  809. {
  810. cout << "Файл для записи гистограммы массива X[k] открыть/создать не удалось." << endl;
  811. return;
  812. }
  813.  
  814. const int imSize = W * H * 3;
  815. unsigned char *image = new unsigned char[imSize];
  816.  
  817. if (!image) //Проверка, выделилиась ли память
  818. {
  819. cout << "Не удалось выделить память под массивы." << endl;
  820. return;
  821. }
  822.  
  823. memset(image, 0, imSize);
  824. glReadPixels(0, 0, W, H, GL_RGB, GL_UNSIGNED_BYTE, image);
  825. BITMAPINFO bmi;
  826. unsigned char BMI = sizeof(BITMAPINFOHEADER);
  827. unsigned char BMF = sizeof(BITMAPFILEHEADER);
  828. memset(&bmi, 0, BMI);
  829. bmi.bmiHeader.biSize = BMI;
  830. bmi.bmiHeader.biHeight = H;
  831. bmi.bmiHeader.biWidth = W;
  832. bmi.bmiHeader.biPlanes = 1;
  833. bmi.bmiHeader.biBitCount = 24;
  834. bmi.bmiHeader.biCompression = BI_RGB;
  835. bmi.bmiHeader.biSizeImage = imSize;
  836.  
  837. int nBitsOffset = BMF + BMI;
  838. LONG lImageSize = imSize;
  839. LONG lFileSize = nBitsOffset + lImageSize;
  840. BITMAPFILEHEADER bmfh;
  841. bmfh.bfType = 0x4D42;
  842. bmfh.bfOffBits = nBitsOffset;
  843. bmfh.bfSize = lFileSize;
  844. bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
  845.  
  846. UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1, BMF, F);
  847. UINT nWrittenInfoHeaderSize = fwrite(&bmi, 1, BMI, F);
  848. UINT nWrittenDIBDataSize = fwrite(image, 1, imSize, F);
  849. UINT total = nWrittenDIBDataSize + nWrittenInfoHeaderSize + nWrittenFileHeaderSize;
  850. delete[]image;
  851. fclose(F);
  852. }
  853.  
  854. int main(int argc, char * argv[])
  855. {
  856. setlocale(LC_ALL, "RUSSIAN");
  857. string key, key1;
  858. int N, range, min;
  859.  
  860. cout << "Программа, рисующая график, частотную характеристику и гистограмму" << endl;
  861. while (1)
  862. {
  863. cout << "Выберите режим работы программы:\n1 - создание массива.\n0 - выход из программы.\nПримечание: название файла: \"C:\\test\\KursovayaInput.txt\"" << endl << "Выбрано ";
  864. getline(cin, key);
  865.  
  866. if (key == "1")
  867. {
  868. cout << "Введите размер массива:" << endl;
  869. cin >> N;
  870. Graphics *Mas;
  871. Mas = new Graphics(N);
  872. cout << "Введите режим создания массива:\n1 - массив, созданный генератором случайных чисел.\n2 - массив, полученный из файла." << endl;
  873. getline(cin, key1);
  874. if (key1 == "1")
  875. {
  876. cout << "Введите диапазон массива:" << endl;
  877. cin >> range;
  878. cout << "Введите минимальное возможное значение массива:" << endl;
  879. cin >> min;
  880. Mas->Fill_Rand(range, min);
  881. Mas->Printing_Arrays_into_Files();
  882. Mas->Graph_Draw1(argc, argv);
  883. Mas->Graph_Draw2(argc, argv);
  884. Mas->Graph_Draw3(argc, argv);
  885. cin.ignore();
  886. continue;
  887. }
  888. else if (key1 == "2")
  889. {
  890. Mas->Fill_File();
  891. Mas->Printing_Arrays_into_Files();
  892. Mas->Graph_Draw1(argc, argv);
  893. Mas->Graph_Draw2(argc, argv);
  894. Mas->Graph_Draw3(argc, argv);
  895. cin.ignore();
  896. continue;
  897. }
  898. else
  899. {
  900. cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
  901. cin.ignore();
  902. continue;
  903. }
  904.  
  905. }
  906. else if (key == "0")
  907. {
  908. cout << "Завершение работы программы." << endl;
  909. return 0;
  910. }
  911.  
  912. else
  913. {
  914. cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
  915. }
  916. }
  917. }
Add Comment
Please, Sign In to add comment