Advertisement
CherMi

Lab 14 0.9

Dec 6th, 2019
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.50 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <errno.h>
  5. #include <stdlib.h>
  6. #include "graphics.h"
  7.  
  8. double f(double x); //Подпрограмма, вычисляющая значение функции x^2*exp(-x)
  9. void draw_chart(double a, double b, int x_steps, int y_steps); //Подпрограмма, рисующая график функции x^2*exp(-x)
  10. void draw_histogram(double a, double b, int x_steps, int y_steps); //Подпрограмма, рисующая гистограмму функции x^2*exp(-x)
  11. void save_chart(); //Подпрограмма, рисующая и сохраняющая гистограмму функции x^2*exp(-x)
  12.  
  13. int main()
  14. {
  15.     int res;
  16.     double a = -1, b = 2;
  17.  
  18.     int gdriver = DETECT, gmode;
  19.     initgraph(&gdriver, &gmode, ""); //Инициализация графического режима
  20.     res = graphresult();
  21.     if (res != grOk)
  22.     {
  23.         printf("An error has occured while initializing graphicsl output.");
  24.         return -1;
  25.     }
  26.  
  27.     draw_chart(a, b, 78, 25);
  28.     draw_histogram(a, b, 60, 80);
  29.     save_chart();
  30.     closegraph(); //Выход из графического режима
  31.     return 0;
  32. }
  33.  
  34. double f(double x) //Подпрограмма, вычисляющая значение функции x^2*exp(-x)
  35. {
  36.     double ctrl, result;
  37.     result = x * x;
  38.     /*if (fabs(ctrl = result / x - x) >= 0.00001)
  39.     {
  40.         //TODO: посмотреть, нужно ли errno
  41.         errno = ERANGE;
  42.         return -1;
  43.     }*/
  44.     return (result / exp(x));
  45. }
  46.  
  47. void draw_chart(double a, double b, int x_steps, int y_steps) //Подпрограмма, рисующая график функции x^2*exp(-x)
  48. {
  49.     int i, max_x, max_y, zero_x, zero_y;
  50.     double x, y;
  51.     int poly[6];
  52.     char str[10];
  53.     double top_y, x_inc, del_x, del_y;
  54.     double len = b - a; //Длина отрезка
  55.     double offset_percent; //Процент от максимальных координат, который отступается от осей.
  56.  
  57.     max_x = getmaxx();
  58.     max_y = getmaxy();
  59.  
  60.     //Сделать фон белым, а цвет рисования чёрным.
  61.     setfillstyle(1, 15);
  62.     bar(0, 0, max_x, max_y);
  63.     setcolor(BLACK);
  64.     setlinestyle(0, 0, 1);
  65.     setbkcolor(WHITE);
  66.  
  67.     offset_percent = 0.1;
  68.  
  69.     //Вычисляем положение нуля на оси x
  70.     zero_x = max_x * offset_percent;
  71.     if (a < 0)
  72.     {
  73.         zero_x += (fabs(a)/len) * (max_x * (1 - 2 * offset_percent)); //TODO
  74.     }
  75.  
  76.     zero_y = max_y * (1 - offset_percent);
  77.  
  78.     line(max_x * offset_percent, zero_y, max_x * (1 - offset_percent), zero_y); //Ось x
  79.     del_x = (max_x * (1 - 2 * offset_percent)) / x_steps;
  80.     for (i = 0; i < x_steps; i++)
  81.     {
  82.         line(max_x * offset_percent + i * del_x, zero_y + 1, max_x * offset_percent + i * del_x, zero_y - 1);
  83.         if (i % 10 == 0)
  84.         {
  85.             sprintf(str, "%3.2f", del_x * i); //TODO: переделать
  86.             outtextxy(max_x * offset_percent + i * del_x - 10, zero_y + 10, str);
  87.         }
  88.     }
  89.     poly[0] = max_x * (1 - offset_percent);
  90.     poly[1] = zero_y + 3;
  91.     poly[2] = max_x * (1 - offset_percent);
  92.     poly[3] = zero_y - 3;
  93.     poly[4] = max_x * (1 - offset_percent) + 5;
  94.     poly[5] = zero_y;
  95.     drawpoly(3, poly);
  96.     outtextxy(max_x * (1 - offset_percent), zero_y + 5, "x");
  97.  
  98.     line(zero_x, zero_y, zero_x, max_y * offset_percent); //Ось y
  99.     del_y = (max_y * (1 - 2 * offset_percent)) / y_steps;
  100.     for (i = 0; i < y_steps; i++)
  101.     {
  102.         line(zero_x - 1, zero_y - del_y * i, zero_x + 1, zero_y - del_y * i);
  103.     }
  104.     poly[0] = zero_x;
  105.     poly[1] = max_y * offset_percent - 5;
  106.     poly[2] = zero_x + 3;
  107.     poly[3] = max_y * offset_percent;
  108.     poly[4] = zero_x - 3;
  109.     poly[5] = max_y * offset_percent;
  110.     drawpoly(3, poly);
  111.     outtextxy(zero_x - 15, max_y * offset_percent - 10, "y");
  112.     //TODO: добавить стрелки
  113.     //TODO: добавить деления
  114.     //TODO: добавить подписи
  115.  
  116.     offset_percent += 0.03;
  117.     del_x = (max_x * (1 - 2 * offset_percent)) / len; //Цена делания по оси x
  118.     x_inc = len / x_steps;
  119.  
  120.     top_y = (f(a) > f(b)) ?  f(a) : f (b); //Наибольшее значение по y. TODO: исправить
  121.     del_y = (zero_y - max_y * offset_percent) / top_y; //Цена деления по оси y;
  122.  
  123.     double prev_x, prev_y, cur_x, cur_y;
  124.     x = a;
  125.     prev_x = x * del_x + zero_x;
  126.     prev_y = zero_y - f(x) * del_y;
  127.     x += x_inc;
  128.     for (i = 1; i < x_steps; i++, x += x_inc)
  129.     {
  130.         cur_x = x * del_x + zero_x;
  131.         cur_y = zero_y - f(x) * del_y;
  132.         line(prev_x, prev_y, cur_x, cur_y);
  133.         prev_x = cur_x;
  134.         prev_y = cur_y;
  135.     }
  136.     system("pause");
  137. }
  138.  
  139. void draw_histogram(double a, double b, int x_steps, int y_steps)
  140. {
  141.     int i, max_x, max_y, zero_x, zero_y;
  142.     double x, y;
  143.     int poly[6];
  144.     char str[10];
  145.     double top_y, x_inc, del_x, del_y;
  146.     double len = b - a; //Длина отрезка
  147.     double offset_percent; //Процент от максимальных координат, который отступается от осей.
  148.  
  149.     max_x = getmaxx();
  150.     max_y = getmaxy();
  151.  
  152.     //Сделать фон белым, а цвет рисования чёрным.
  153.     setfillstyle(1, 15);
  154.     bar(0, 0, max_x, max_y);
  155.     setcolor(0);
  156.     setlinestyle(0, 0, 1);
  157.  
  158.     offset_percent = 0.1;
  159.  
  160.     //Вычисляем положение нуля по вертикали (на оси y)
  161.     zero_x = max_y * offset_percent;
  162.     if (a < 0)
  163.     {
  164.         zero_x += (fabs(a) / len) * (max_y * (1 - 2 * offset_percent)); //TODO
  165.     }
  166.  
  167.     zero_y = max_x * offset_percent;
  168.  
  169.     line(max_x * offset_percent, zero_x, max_x * (1 - offset_percent), zero_x); //Ось y (горизонтальная)
  170.     //offset_percent += 0.03;
  171.     del_y = (max_x * (1 - 2 * offset_percent)) / y_steps;
  172.     for (i = 0; i < y_steps; i++)
  173.     {
  174.         line(max_x * offset_percent + i * del_y, zero_x + 1, max_x * offset_percent + i * del_y, zero_x - 1);
  175.     }
  176.     //offset_percent -= 0.03;
  177.     poly[0] = max_x * (1 - offset_percent);
  178.     poly[1] = zero_x + 3;
  179.     poly[2] = max_x * (1 - offset_percent);
  180.     poly[3] = zero_x - 3;
  181.     poly[4] = max_x * (1 - offset_percent) + 5;
  182.     poly[5] = zero_x;
  183.     drawpoly(3, poly);
  184.     outtextxy(max_x * (1 - offset_percent), zero_x + 5, "y");
  185.  
  186.     line(zero_y, max_y * offset_percent, zero_y, max_y *  (1 - offset_percent)); //Ось x (вертикальная)
  187.     //offset_percent += 0.03;
  188.     del_x = (max_y * (1 - 2 * offset_percent)) / x_steps;
  189.     for (i = 0; i < x_steps; i++)
  190.     {
  191.         line(zero_y - 1, max_y * offset_percent + del_x * i, zero_y + 1, max_y * offset_percent + del_x * i);
  192.     }
  193.     //offset_percent -= 0.03;
  194.     poly[0] = zero_y;
  195.     poly[1] = max_y * offset_percent - 5;
  196.     poly[2] = zero_y + 3;
  197.     poly[3] = max_y * offset_percent;
  198.     poly[4] = zero_y - 3;
  199.     poly[5] = max_y * offset_percent;
  200.     drawpoly(3, poly);
  201.     outtextxy(zero_y - 15, max_y * offset_percent - 10, "x");
  202.  
  203.     offset_percent += 0.03;
  204.     del_x = (max_y * (1 - 2 * offset_percent)) / len; //Цена деления по оси x (вертикальная)
  205.     x_inc = len / x_steps;
  206.  
  207.     top_y = (f(a) > f(b)) ? f(a) : f(b); //Наибольшее значение по y. TODO: исправить
  208.     del_y = (max_x * (1 - 2 * offset_percent)) / top_y; //Цена делания по оси y (горизонтальная)
  209.  
  210.  
  211.     double prev_x, prev_y, cur_x, cur_y;
  212.     //setbkcolor(WHITE);
  213.     settextstyle(SMALL_FONT, HORIZ_DIR, 3);
  214.  
  215.     for (x = a, i = 0; i < x_steps; i++, x += x_inc)
  216.     {
  217.         cur_y = zero_y + f(x) * del_y;
  218.         cur_x = zero_x + x * del_x;
  219.         line(zero_y, cur_x, cur_y, cur_x);
  220.         sprintf(str, "%f", f(x));
  221.         outtextxy(cur_y + 10, cur_x - 3, str);
  222.         prev_x = cur_x;
  223.         prev_y = cur_y;
  224.     }
  225.  
  226.     system("pause");
  227.  
  228. }
  229.  
  230.  
  231. void save_chart()
  232. {
  233.     writeimagefile(NULL, 0, 0, getmaxx() - 1, getmaxy() - 1, 1, NULL);
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement