DarkDevourer

Курсовая ЯВУ - рабочая, с графикой, OpenGL подключен

Dec 10th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.95 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <math.h>
  4. #include <string>
  5. #include <fstream>
  6. #include <GL/freeglut.h>
  7. //TODO: Сделать запись изображения в файл
  8. using namespace std;
  9.  
  10. double const pi = 4 * atan(1);
  11.  
  12. void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N); //Подпрограмма для получения элементов массива X[k] из строки x
  13.  
  14. void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N); //Подпрограмма создания массивов H[u] из массива X[k] и массива X(обратное)[k] из массива H[u]
  15.  
  16. void Printing_Arrays_into_Files(double *X, double *H, double *Xobr, int *N); //Подпрограмма, записывающая массивы X[k], H[u] и X(обратное)[k] в файл
  17.  
  18. void Graphics_Creation(); //Подпрограмма, создающая графики массивов X[k], H[u] и X(обратное)[k]
  19.  
  20. void PrintText(float x, float y, int r, int g, int b, string string); //Подпрограмма, показывающая текст на экране (для расположения координат и названий осей графиков)
  21.  
  22. void reshape(int w, int h); //TODO: понять, почему только при её наличии появляется графика и как после закрытия графики продолжить работцу программы
  23.  
  24. double *X, *H, *Xobr; //Указатели на будущие динамические массивы
  25. int N; //Размерность массива
  26.  
  27. int w, h; //w - ширина будущего окна с графиками, h - его высота
  28.  
  29. int main(int argc, char * argv[])
  30. {
  31.  
  32. ifstream in;
  33. setlocale(LC_ALL, "RUSSIAN");
  34. string key, key1, N1, x, temps, w1, h1;
  35. int k, flag;
  36. int i;
  37.  
  38. cout << "Программа для преобразования массива X[k] в массив H[u] по формуле дискретного преобразования Хартли и массива H[u] Xобр[k] по формуле обратного преобразования Хартли" << endl;
  39. while (1)
  40. {
  41. cout << "Выберите режим работы программы:\n1 - ввод элементов массива с клавиатуры.\n2 - создание массива на основе файла.\n0 - выход из программы.\nПримечание: название файла: \"C:\\test\\KursovayaInput.txt\"" << endl << "Выбрано ";
  42. getline(cin, key);
  43.  
  44. if (key == "1")
  45. {
  46. flag = 0;
  47. k = 0;
  48.  
  49. cout << "Введите размерность массива, который хотите заполнить" << endl << "N = ";
  50. cin >> N1;// Ввод размера массива
  51. size_t number1 = N1.find_first_not_of("0123456789");
  52. if (number1 != std::string::npos)// Если найдено что-то помимо цифр
  53. {
  54. cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
  55. cin.ignore();
  56. continue;
  57. }
  58. N = stoi(N1.c_str()); //Получение количества элементов массива
  59.  
  60. X = new double[N]; //Создание динамических массивов (эта и две след. строки)
  61. Xobr = new double[N];
  62. H = new double[N];
  63.  
  64. cout << "Введите с клавиатуры значения элементов массива X[k]. После введения числа нажмите Enter.\n";
  65. while ((k < N))// Заполнение массива X[k]
  66. {
  67. cin >> temps;
  68.  
  69. From_String_To_Double(&flag, temps, &k, X, &N); //Вызов функции, создающей элемент массива X[k] на основе строки
  70.  
  71. if (flag == 1)
  72. {
  73. cin.ignore();
  74. break;
  75. }
  76. }
  77.  
  78. if (flag == 0)
  79. {
  80. Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H[u] из массива X[k] и массива X(обратное)[k] из массива H[u]
  81. }
  82.  
  83. Printing_Arrays_into_Files(X, H, Xobr, &N); //Вывод массивов в файл
  84.  
  85.  
  86. cout << "Введите размеры окна, в котором будут показаны графики функций." << endl << "Окно не должно быть меньше чем 16x153, иначе оно не создастся." << endl << "Введённые данные должны быть целыми числами." << endl;;
  87. cout << "Ширина: ";
  88. cin.ignore();
  89. cin >> w1;
  90. cout << "Высота: ";
  91. cin >> h1;
  92. size_t w_check = w1.find_first_not_of("0123456789");
  93. size_t h_check = h1.find_first_not_of("0123456789");
  94. if (w_check != std::string::npos || h_check != std::string::npos)// Если найдено что-то помимо цифр
  95. {
  96. cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
  97. cin.ignore();
  98. continue;
  99. }
  100. w = stoi(w1.c_str()); //Получения ширины
  101. h = stoi(h1.c_str()); //Получения высоты
  102. if (w < 16 || h < 153)
  103. {
  104. cout << "Введенные размеры меньше допустимых. Возврат в меню." << endl;
  105. cin.ignore();
  106. continue;
  107. }
  108.  
  109. //Создание окна для рисования графиков
  110. glutInit(&argc, argv);
  111. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
  112. glutInitWindowPosition(0, 0);
  113. glutInitWindowSize(w, h);
  114. glutCreateWindow("Графики массивов");
  115.  
  116. glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
  117. GLUT_ACTION_GLUTMAINLOOP_RETURNS);
  118.  
  119. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  120.  
  121. glutReshapeFunc(reshape); //TODO: понять, почему только при её наличии появляется графика и как после закрытия графики продолжить работцу программы
  122.  
  123. glutDisplayFunc(Graphics_Creation); //Подпрограмма, рисующая графики массивов X[k], H[u] и X(обратное)[k]
  124.  
  125. glutMainLoop();
  126.  
  127. cin.ignore();
  128.  
  129. delete[] X;//Очистка памяти от динамических массивов (эта и дву след. строки)
  130. delete[] H;
  131. delete[] Xobr;
  132.  
  133. }
  134.  
  135. else if (key == "2")
  136. {
  137. flag = 0; //Флаг для проверки правильности ввода
  138. k = 0;
  139. N1 = "";
  140.  
  141. in.open("C:\\test\\KursovayaInput.txt"); //Открытие файла
  142. if (!in.is_open()) //Проверка, открылся файл или нет
  143. {
  144. cout << "Файл открыть не удалось. Пожалуйста, проверьте, правильно ли введено имя файла и его наличие.\nИмя файла по умолчанию - C:\\test\\KursovayaInput.txt" << endl;
  145. cin.ignore();
  146. continue;
  147. }
  148. if (in.eof())
  149. {
  150. cout << "Файл пустой. Пожалуйста, заполните его.\nАдрес файла: C:\\test\\KursovayaInput.txt\n";
  151. in.close();
  152. cin.ignore();
  153. continue;
  154. }
  155.  
  156. getline(in, x); //Чтение строки из файла
  157. if (x.find(" ") < x.find("\t") || x.find("\t") == -1) //Берем все символы до первого пробельного символа
  158. {
  159. N1.insert(0, x, 0, x.find(" "));
  160. }
  161. else
  162. {
  163. N1.insert(0, x, 0, x.find("\t"));
  164. }
  165. size_t number1 = N1.find_first_not_of("0123456789");
  166. if (number1 != std::string::npos) //Если найдено что-то помимо цифр
  167. {
  168. cout << "Не удалось создать массив, так как первая лексема в файле - не число целого типа. Возврат в последнее меню.\n" << endl;
  169. in.close();
  170. cin.ignore();
  171. break;
  172. }
  173. N = stoi(N1.c_str()); //Получения количества элементов массива
  174.  
  175. X = new double[N]; //Создание динамических массивов (эта и две след. строки)
  176. Xobr = new double[N];
  177. H = new double[N];
  178.  
  179. x.erase(0, N1.length()); //Удаляем в строке число - количество элементов массива
  180. while ((x.find("\t") == 0 || x.find(" ") == 0) && (x.find("\t") != -1 || x.find(" ") != -1)) //Двигаемся в строке до первого непробельного символа при его наличии
  181. {
  182. x.erase(0, 1);
  183. }
  184.  
  185. k = 0;
  186. if (N > 0) //Если количество элементов массива больше 0
  187. {
  188. do
  189. {
  190. while (1)
  191. {
  192. temps = "";
  193. i = 0;
  194.  
  195. while ((x.find(' ') != 0) && (x.find('\t') != 0) && (x.length() != 0)) //Получения из строки числа
  196. {
  197. temps.insert(i, x, 0, 1);
  198. i++;
  199. x.erase(0, 1);
  200. }
  201.  
  202. From_String_To_Double(&flag, temps, &k, X, &N); //Вызов функции, создающей элемент массива X[k] на основе строки
  203.  
  204. while ((x.find('\t') == 0 || x.find(' ') == 0) && (x.find("\t") != -1 || x.find(" ") != -1))
  205. {
  206. x.erase(0, 1);
  207. }
  208.  
  209. if (x.length() == 0 || k == N) //Выход из цикла анализа строки, если дошли до конца строки
  210. {
  211. break;
  212. }
  213.  
  214. }
  215. if (flag == 1 || k == N) //Если в файле не только числа или массив заполнен
  216. {
  217. break;
  218. }
  219. getline(in, x);
  220. } while (x != "");
  221.  
  222. if ((k < N)) //Если в файле оказалось чисел больше или меньше заявленного
  223. {
  224. cout << "В файле количество элементов, который нужно записать в массив X, меньше заявленного количества элементов.\n";
  225. }
  226. else if (flag == 0)
  227. {
  228. Creating_Arrays_H_and_Xobr(X, H, Xobr, &N); //Создание массивов H[u] из массива X[k] и массива X(обратное)[k] из массива H[u]
  229. }
  230. }
  231.  
  232. in.close(); //Закрытие файла ввода
  233.  
  234. Printing_Arrays_into_Files(X, H, Xobr, &N); //Вывод массивов в файл
  235.  
  236. cout << "Введите размеры окна, в котором будут показаны графики функций." << endl << "Окно не должно быть меньше чем 16x153, иначе оно не создастся." << endl << "Введённые данные должны быть целыми числами." << endl;;
  237. cout << "Ширина: ";
  238. cin >> w1; //Ввод ширины
  239. cout << "Высота: ";
  240. cin >> h1; //Ввод высоты
  241. size_t w_check = w1.find_first_not_of("0123456789");
  242. size_t h_check = h1.find_first_not_of("0123456789");
  243. if (w_check != std::string::npos || h_check != std::string::npos)// Если найдено что-то помимо цифр
  244. {
  245. cout << "Введённое значение не является числом целого типа. Возврат в последнее меню." << endl;
  246. cin.ignore();
  247. continue;
  248. }
  249. w = stoi(w1.c_str()); //Получения ширины
  250. h = stoi(h1.c_str()); //Получения высоты
  251. if (w < 16 || h < 153)
  252. {
  253. cout << "Введенные размеры меньше допустимых. Возврат в меню." << endl;
  254. cin.ignore();
  255. continue;
  256. }
  257.  
  258. //Создание окна для рисования графиков
  259. glutInit(&argc, argv);
  260. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
  261. glutInitWindowPosition(0, 0);
  262. glutInitWindowSize(w, h);
  263. glutCreateWindow("Графики массивов");
  264.  
  265. glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
  266. GLUT_ACTION_GLUTMAINLOOP_RETURNS);
  267.  
  268. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  269.  
  270. glutReshapeFunc(reshape); //TODO: понять, почему только при её наличии появляется графика и как после закрытия графики продолжить работцу программы
  271.  
  272. glutDisplayFunc(Graphics_Creation); //Подпрограмма, рисующая графики массивов X[k], H[u] и X(обратное)[k]
  273.  
  274. glutMainLoop();
  275.  
  276. cin.ignore();
  277.  
  278. delete[] X;//Очистка памяти от динамических массивов (эта и две след. строки)
  279. delete[] H;
  280. delete[] Xobr;
  281. }
  282.  
  283. else if (key == "0")
  284. {
  285. cout << "Завершение работы программы." << endl;
  286. return 0;
  287. }
  288.  
  289. else
  290. {
  291. cout << "Такой команды не существует в данной программе. Возврат в меню." << endl;
  292. }
  293. }
  294. }
  295.  
  296. void From_String_To_Double(int *flag, string &x, int *k, double *X, int *N)
  297. {
  298. size_t number2 = x.find_first_not_of("-,.0123456789");
  299. size_t symbols = x.find_first_not_of("-,.");
  300. size_t point = x.find_first_not_of(".");
  301. if ((number2 != std::string::npos) || (symbols == std::string::npos) || (x.find(".") != x.rfind(".")))
  302. {
  303. cout << "Ошибка. Наличие постороннего символа (написано не число). Возврат в меню." << endl;
  304. *flag = 1;
  305. return;
  306. }
  307.  
  308. while (x.find(".") != -1)
  309. {
  310. x.replace(x.find("."), 1, ",");
  311. }
  312.  
  313. X[*k] = stod(x.c_str());
  314.  
  315. *k += 1;
  316. }
  317.  
  318. void Creating_Arrays_H_and_Xobr(double *X, double *H, double *Xobr, int *N) //Подпрограмма создания массивов H из массива X и массива X [обратное] из массива H
  319. {
  320. int k, u;
  321.  
  322. for (k = 0; k < *N; k++)
  323. cout << "X[" << k << "] = " << X[k] << "\n";
  324.  
  325. for (u = 0; u < *N; u++) // Заполнение массива H[u] по формуле дискретного преобразования Хартли
  326. {
  327. H[u] = 0;
  328. for (k = 0; k < *N; k++)
  329. {
  330. H[u] = H[u] + X[k] * (sin(2 * pi*k*u / *N) + cos(2 * pi*k*u / *N));
  331. }
  332. H[u] = H[u] / sqrt(*N);
  333. cout << "H[" << u << "] = " << H[u] << "\n";
  334. }
  335.  
  336. for (k = 0; k < *N; k++) // Заполнение массива X обратный [k]
  337. {
  338. Xobr[k] = 0;
  339. for (u = 0; u < *N; u++)
  340. {
  341. Xobr[k] = Xobr[k] + H[u] * (sin(2 * pi*k*u / *N) + cos(2 * pi*k*u / *N));
  342. }
  343. Xobr[k] = Xobr[k] / sqrt(*N);
  344. if (fabs(Xobr[k] - X[k]) > 0.00001)
  345. {
  346. cout << "Произошла ошибка в вычислениях.\n";
  347. break;
  348. }
  349. cout << "Xobr[" << k << "] = " << Xobr[k] << "\n";
  350. }
  351. }
  352.  
  353. void Printing_Arrays_into_Files(double *X, double *H, double *Xobr, int *N) //Подпрограмма, записывающая массивы X[k], H[u] и X(обратное)[k] в файл
  354. {
  355. int k;
  356. std::ofstream out;
  357. out.open("C:\\test\\KursovayaOutput.txt"); //Открытие файла вывода
  358. if (!out.is_open()) //Если файл не открылся
  359. {
  360. cout << "Файл для записи массивов: C:\\test\\KursovayaOutput.txt - открыть не удалось." << endl;
  361. return;
  362. }
  363. out << "Изначальный массив X[k]:" << endl;
  364. for (k = 0; k < *N; k++) //Запись массива X[k]
  365. {
  366. out << "X[" << k << "] = " << X[k] << endl;
  367. }
  368. out << endl << "Массив, полученный после дискретного преобразования Хартли, H[u]:" << endl;
  369. for (k = 0; k < *N; k++) //Запись массива H[u]
  370. {
  371. out << "H[" << k << "] = " << H[k] << endl;
  372. }
  373. out << endl << "Массив, полученный после обратного дискретного преобразования Хартли, X(обратный)[k]:" << endl;
  374. for (k = 0; k < *N; k++) //Запись массива X(обратное)[k]
  375. {
  376. out << "X(обратный)[" << k << "] = " << X[k] << endl;
  377. }
  378. out.close(); //Закрытие файла вывода
  379. }
  380.  
  381. void Graphics_Creation() //Подпрограмма, создающая графики массивов X[k], H[u] и X(обратное)[k]
  382. {
  383. int length_x = w - 15; //Длина каждого графика по оси x
  384. int length_y = floor((h - 150)/3);
  385. double y_max, y_min, length;
  386. int k, i, y[3];
  387. int mast_y[3];
  388. int mast_x = floor(w - 15 / N);
  389. glClear(GL_COLOR_BUFFER_BIT);
  390.  
  391. //Создание вертикальных и горизонтальных осей трех графиков
  392.  
  393. for (k = 1; k <= 3; k++)
  394. {
  395. glBegin(GL_LINES); //Построение вертикальной оси
  396. glColor3f(0.0, 0.0, 0.0);
  397. glVertex2i(5, h-30*k-length_y*(k-1));
  398. glColor3f(0.0, 0.0, 0.0);
  399. glVertex2i(5, h-30*k-length_y*k);
  400. glEnd();
  401.  
  402. glBegin(GL_LINES); //Черчение стрелки
  403. glColor3f(0.0, 0.0, 0.0);
  404. glVertex2i(5, h - 30 * k - length_y * (k - 1));
  405. glColor3f(0.0, 0.0, 0.0);
  406. glVertex2i(0, h - 30 * k - length_y * (k - 1) - 10);
  407. glEnd();
  408. glBegin(GL_LINES);
  409. glColor3f(0.0, 0.0, 0.0);
  410. glVertex2i(5, h - 30 * k - length_y * (k - 1));
  411. glColor3f(0.0, 0.0, 0.0);
  412. glVertex2i(10, h - 30 * k - length_y * (k - 1) - 10);
  413. glEnd();
  414.  
  415. if (k == 1) //Находим наибольший и наименьший элементы X[k]
  416. {
  417. y_max = X[0];
  418. y_min = X[0];
  419. for (i = 1; i < N; i++)
  420. {
  421. if (y_max < X[i])
  422. {
  423. y_max = X[i];
  424. }
  425. else if (y_min > X[i])
  426. {
  427. y_min = X[i];
  428. }
  429. }
  430. }
  431. if (k == 2) //Находим наибольший и наименьший элементы H[u]
  432. {
  433. y_max = H[0];
  434. y_min = H[0];
  435. for (i = 1; i < N; i++)
  436. {
  437. if (y_max < H[i])
  438. {
  439. y_max = H[i];
  440. }
  441. else if (y_min > H[i])
  442. {
  443. y_min = H[i];
  444. }
  445. }
  446.  
  447. }
  448. if (k == 3) //Находим наибольший и наименьший элементы X(обратный)[k]
  449. {
  450. y_max = Xobr[0];
  451. y_min = Xobr[0];
  452. for (i = 1; i < N; i++)
  453. {
  454. if (y_max < Xobr[i])
  455. {
  456. y_max = Xobr[i];
  457. }
  458. else if (y_min > Xobr[i])
  459. {
  460. y_min = Xobr[i];
  461. }
  462. }
  463. }
  464.  
  465. //Построение горизонтальной оси для 3 различных случаев
  466. if (y_max <= 0) //Если все значения массива - отрицательные
  467. {
  468. length = fabs(y_min);
  469. mast_y[k-1] = floor(length_y / (length)); //Масштаб оси ординат по кол-ву точек
  470. glBegin(GL_LINES); //Черчение вертикальной оси
  471. glColor3f(0.0, 0.0, 0.0);
  472. glVertex2i(5, h - 30 * k - length_y * (k - 1));
  473. glColor3f(0.0, 0.0, 0.0);
  474. glVertex2i(w, h - 30 * k - length_y * (k - 1));
  475. glEnd();
  476.  
  477. glBegin(GL_LINES); //Черчение стрелки
  478. glColor3f(0.0, 0.0, 0.0);
  479. glVertex2i(w, h - 30 * k - length_y * (k - 1));
  480. glColor3f(0.0, 0.0, 0.0);
  481. glVertex2i(w-10, h - 30 * k - length_y * (k - 1) - 5);
  482. glEnd();
  483. glBegin(GL_LINES);
  484. glColor3f(0.0, 0.0, 0.0);
  485. glVertex2i(w, h - 30 * k - length_y * (k - 1));
  486. glColor3f(0.0, 0.0, 0.0);
  487. glVertex2i(w-10, h - 30 * k - length_y * (k - 1) + 5);
  488. glEnd();
  489.  
  490. y[k-1] = h - 30 * k - length_y * (k - 1); //Запоминание координаты для печати на экран обозначения оси
  491. }
  492. else if (y_min >= 0) //Если все значения массива - положительные
  493. {
  494. length = y_max;
  495. mast_y[k-1] = floor(length_y / (length)); //Масштаб оси ординат по кол-ву точек
  496. glBegin(GL_LINES);
  497. glColor3f(0.0, 0.0, 0.0);
  498. glVertex2i(5, h - 30 * k - length_y * (k));
  499. glColor3f(0.0, 0.0, 0.0);
  500. glVertex2i(w, h - 30 * k - length_y * (k));
  501. glEnd();
  502.  
  503. glBegin(GL_LINES); //Черчение стрелки
  504. glColor3f(0.0, 0.0, 0.0);
  505. glVertex2i(w, h - 30 * k - length_y * (k));
  506. glColor3f(0.0, 0.0, 0.0);
  507. glVertex2i(w-10, h - 30 * k - length_y * (k) - 5);
  508. glEnd();
  509. glBegin(GL_LINES);
  510. glColor3f(0.0, 0.0, 0.0);
  511. glVertex2i(w, h - 30 * k - length_y * (k));
  512. glColor3f(0.0, 0.0, 0.0);
  513. glVertex2i(w-10, h - 30 * k - length_y * (k) + 5);
  514. glEnd();
  515. y[k-1] = h - 30 * k - length_y * (k); //Запоминание координаты для печати на экран обозначения оси
  516. }
  517. else //Если часть значений массива - положителные, остальные - отрицательные
  518. {
  519. length = fabs(y_max - y_min);
  520. mast_y[k-1] = floor(length_y / (length)); //Масштаб оси ординат по кол-ву точек
  521. glBegin(GL_LINES);
  522. glColor3f(0.0, 0.0, 0.0);
  523. glVertex2i(5, h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length));
  524. glColor3f(0.0, 0.0, 0.0);
  525. glVertex2i(w, h - 30 * k - length_y * (k-1) - floor(length_y * y_max / length));
  526. glEnd();
  527.  
  528. glBegin(GL_LINES); //Черчение стрелки
  529. glColor3f(0.0, 0.0, 0.0);
  530. glVertex2i(w, h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length));
  531. glColor3f(0.0, 0.0, 0.0);
  532. glVertex2i(w - 10, h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length) -5);
  533. glEnd();
  534. glBegin(GL_LINES);
  535. glColor3f(0.0, 0.0, 0.0);
  536. glVertex2i(w, h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length));
  537. glColor3f(0.0, 0.0, 0.0);
  538. glVertex2i(w - 10, h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length) +5);
  539. glEnd();
  540. y[k-1] = h - 30 * k - length_y * (k - 1) - floor(length_y * y_max / length);
  541. }
  542. }
  543.  
  544. //Подписывание осей графиков
  545. PrintText(15, h - 30, 0, 0, 0, "X[k]");
  546. PrintText(w-10, y[0]-15, 0, 0, 0, "k");
  547. PrintText(15, h - 60 - length_y, 0, 0, 0, "H[u]");
  548. PrintText(w-10, y[1]-15, 0, 0, 0, "u");
  549. PrintText(15, h - 90 - 2*length_y, 0, 0, 0, "X(obr)[k]");
  550. PrintText(w-10, y[2]-15, 0, 0, 0, "k");
  551.  
  552. //Построение штрихов на горизонтальной оси
  553. //TODO: Сделать вертикальные штрихи и придумать, как их обозначать
  554. for (k = 0; k < N; k++)
  555. {
  556. glBegin(GL_LINES); //X[k]
  557. glColor3f(0.0, 0.0, 0.0);
  558. glVertex2i(5 + mast_x * k/N, y[0]+5);
  559. glColor3f(0.0, 0.0, 0.0);
  560. glVertex2i(5 + mast_x * k/N, y[0]-5);
  561. glEnd();
  562. PrintText(5 + mast_x * k/N, y[0]-25, 0, 0, 0, to_string(k));
  563.  
  564. glBegin(GL_LINES); //H[u]
  565. glColor3f(0.0, 0.0, 0.0);
  566. glVertex2i(5 + mast_x * k/N, y[1]+5);
  567. glColor3f(0.0, 0.0, 0.0);
  568. glVertex2i(5 + mast_x * k/N, y[1]-5);
  569. glEnd();
  570. PrintText(5 + mast_x * k / N, y[1]-25, 0, 0, 0, to_string(k));
  571.  
  572. glBegin(GL_LINES); //X(обратный)[k]
  573. glColor3f(0.0, 0.0, 0.0);
  574. glVertex2i(5 + mast_x * k/N, y[2] + 5);
  575. glColor3f(0.0, 0.0, 0.0);
  576. glVertex2i(5 + mast_x * k/N, y[2] - 5);
  577. glEnd();
  578. PrintText(5 + mast_x * k / N, y[2] - 25, 0, 0, 0, to_string(k));
  579. }
  580.  
  581. //Построение штрихов на вертикальной оси
  582. for (k = 0; k < N; k++)
  583. {
  584. if (y[0]-k*length_y/N >= h - 30 - length_y)
  585. {
  586. glBegin(GL_LINES); //X[k]
  587. glColor3f(0.0, 0.0, 0.0);
  588. glVertex2i(0, y[0]- k * length_y / N);
  589. glColor3f(0.0, 0.0, 0.0);
  590. glVertex2i(10, y[0] - k * length_y / N);
  591. glEnd();
  592. }
  593. else
  594. {
  595. glBegin(GL_LINES); //X[k]
  596. glColor3f(0.0, 0.0, 0.0);
  597. glVertex2i(0, y[0] + (N-k) * length_y / N);
  598. glColor3f(0.0, 0.0, 0.0);
  599. glVertex2i(10, y[0] + (N-k) * length_y / N);
  600. glEnd();
  601. }
  602.  
  603. if (y[1] - k * length_y/N >= h - 60 - 2*length_y)
  604. {
  605. glBegin(GL_LINES); //H[u]
  606. glColor3f(0.0, 0.0, 0.0);
  607. glVertex2i(0, y[1] - k * length_y / N);
  608. glColor3f(0.0, 0.0, 0.0);
  609. glVertex2i(10, y[1] - k * length_y / N);
  610. glEnd();
  611. }
  612. else
  613. {
  614. glBegin(GL_LINES); //H[u]
  615. glColor3f(0.0, 0.0, 0.0);
  616. glVertex2i(0, y[1] + (N- k) * length_y / N);
  617. glColor3f(0.0, 0.0, 0.0);
  618. glVertex2i(10, y[1] + (N - k) * length_y / N);
  619. glEnd();
  620. }
  621.  
  622. if (y[2] - k * length_y /N >= h - 90 - 3*length_y)
  623. {
  624. glBegin(GL_LINES); //X(обратный)[k]
  625. glColor3f(0.0, 0.0, 0.0);
  626. glVertex2i(0, y[2] - k * length_y / N);
  627. glColor3f(0.0, 0.0, 0.0);
  628. glVertex2i(10, y[2] - k * length_y / N);
  629. glEnd();
  630. }
  631. else
  632. {
  633. glBegin(GL_LINES); //X(обратный)[k]
  634. glColor3f(0.0, 0.0, 0.0);
  635. glVertex2i(0, y[2] + (N-k) * length_y / N);
  636. glColor3f(0.0, 0.0, 0.0);
  637. glVertex2i(10, y[2] + (N - k) * length_y / N);
  638. glEnd();
  639. }
  640. }
  641.  
  642. //Построение графиков
  643.  
  644. for (k = 0; k < N; k++)
  645. {
  646. if (k != N - 1)
  647. {
  648. glBegin(GL_LINES); //X[k]
  649. glColor3f(0.0, 0.0, 0.0);
  650. glVertex2i(5 + k * mast_x/N, y[0] + floor(X[k] * mast_y[0]));
  651. glColor3f(0.0, 0.0, 0.0);
  652. glVertex2i(5 + (k + 1) * mast_x/N, y[0] + floor(X[k + 1] * mast_y[0]));
  653. glEnd();
  654. }
  655.  
  656. glBegin(GL_LINES); //H[u]
  657. glColor3f(0.0, 0.0, 0.0);
  658. glVertex2i(5 + mast_x * k/N, y[1]);
  659. glColor3f(0.0, 0.0, 0.0);
  660. glVertex2i(5 + mast_x * k/N, y[1] + floor(H[k] * mast_y[1]));
  661. glEnd();
  662.  
  663. if (k != N - 1)
  664. {
  665. glBegin(GL_LINES); //X(обратный)[k]
  666. glColor3f(0.0, 0.0, 0.0);
  667. glVertex2i(5 + k * mast_x/N, y[2] + floor(Xobr[k] * mast_y[2]));
  668. glColor3f(0.0, 0.0, 0.0);
  669. glVertex2i(5 + (k+1) * mast_x/N, y[2] + floor(Xobr[k + 1] * mast_y[2]));
  670. glEnd();
  671. }
  672.  
  673. glPointSize(5);
  674.  
  675. glBegin(GL_POINTS); //X[k] - выделение точек
  676. glColor3f(0.0, 0.0, 0.0);
  677. glVertex2i(5 + mast_x * k/N, y[0] + floor(X[k] * mast_y[0]));
  678. glEnd();
  679.  
  680. glBegin(GL_POINTS); //H[u] - выделение точек
  681. glColor3f(0.0, 0.0, 0.0);
  682. glVertex2i(5 + mast_x * k/N, y[1] + floor(H[k] * mast_y[1]));
  683. glEnd();
  684.  
  685. glBegin(GL_POINTS); //X(обратный)[k] - выделение точек
  686. glColor3f(0.0, 0.0, 0.0);
  687. glVertex2i(5 + mast_x * k/N, y[2] + floor(Xobr[k] * mast_y[2]));
  688. glEnd();
  689.  
  690. }
  691.  
  692. glutSwapBuffers();
  693. }
  694.  
  695. void PrintText(float x, float y, int r, int g, int b, string string) //Подпрограмма, показыающая текст на экране (для расположения координат и названий осей графиков)
  696. {
  697. char *text = new char[string.length()];
  698. glColor3f(r, g, b);
  699. glRasterPos2f(x, y);
  700. for (int i = 0; i < string.length(); i++)
  701. text[i] = string[i];
  702. for (int i = 0; i < string.length(); i++)
  703. {
  704. glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]);
  705. x += 2;
  706. }
  707. delete[] text;
  708. }
  709.  
  710.  
  711. void reshape(int w, int h) //TODO: понять, почему только при её наличии появляется графика и как после закрытия графики продолжить работу программы
  712. {
  713. glViewport(0, 0, w, h);
  714.  
  715. glMatrixMode(GL_PROJECTION);
  716. glLoadIdentity();
  717. gluOrtho2D(0, w, 0, h);
  718.  
  719. glMatrixMode(GL_MODELVIEW);
  720. glLoadIdentity();
  721. }
Add Comment
Please, Sign In to add comment