Advertisement
DarkDevourer

Курсовая ООП (финальная)

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