Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <math.h>
- #include <errno.h>
- #include <stdlib.h>
- #include "graphics.h"
- double f(double x); //Подпрограмма, вычисляющая значение функции x^2*exp(-x)
- void draw_chart(double a, double b, int x_steps, int y_steps); //Подпрограмма, рисующая график функции x^2*exp(-x)
- void draw_histogram(double a, double b, int x_steps, int y_steps); //Подпрограмма, рисующая гистограмму функции x^2*exp(-x)
- void save_chart(); //Подпрограмма, рисующая и сохраняющая гистограмму функции x^2*exp(-x)
- int main()
- {
- int res;
- double a = -1, b = 2;
- int gdriver = DETECT, gmode;
- initgraph(&gdriver, &gmode, ""); //Инициализация графического режима
- res = graphresult();
- if (res != grOk)
- {
- printf("An error has occured while initializing graphicsl output.");
- return -1;
- }
- draw_chart(a, b, 78, 25);
- draw_histogram(a, b, 60, 80);
- save_chart();
- closegraph(); //Выход из графического режима
- return 0;
- }
- double f(double x) //Подпрограмма, вычисляющая значение функции x^2*exp(-x)
- {
- double ctrl, result;
- result = x * x;
- /*if (fabs(ctrl = result / x - x) >= 0.00001)
- {
- //TODO: посмотреть, нужно ли errno
- errno = ERANGE;
- return -1;
- }*/
- return (result / exp(x));
- }
- void draw_chart(double a, double b, int x_steps, int y_steps) //Подпрограмма, рисующая график функции x^2*exp(-x)
- {
- int i, max_x, max_y, zero_x, zero_y;
- double x, y;
- int poly[6];
- char str[10];
- double top_y, x_inc, del_x, del_y;
- double len = b - a; //Длина отрезка
- double offset_percent; //Процент от максимальных координат, который отступается от осей.
- max_x = getmaxx();
- max_y = getmaxy();
- //Сделать фон белым, а цвет рисования чёрным.
- setfillstyle(1, 15);
- bar(0, 0, max_x, max_y);
- setcolor(BLACK);
- setlinestyle(0, 0, 1);
- setbkcolor(WHITE);
- offset_percent = 0.1;
- //Вычисляем положение нуля на оси x
- zero_x = max_x * offset_percent;
- if (a < 0)
- {
- zero_x += (fabs(a)/len) * (max_x * (1 - 2 * offset_percent)); //TODO
- }
- zero_y = max_y * (1 - offset_percent);
- line(max_x * offset_percent, zero_y, max_x * (1 - offset_percent), zero_y); //Ось x
- del_x = (max_x * (1 - 2 * offset_percent)) / x_steps;
- for (i = 0; i < x_steps; i++)
- {
- line(max_x * offset_percent + i * del_x, zero_y + 1, max_x * offset_percent + i * del_x, zero_y - 1);
- if (i % 10 == 0)
- {
- sprintf(str, "%3.2f", del_x * i); //TODO: переделать
- outtextxy(max_x * offset_percent + i * del_x - 10, zero_y + 10, str);
- }
- }
- poly[0] = max_x * (1 - offset_percent);
- poly[1] = zero_y + 3;
- poly[2] = max_x * (1 - offset_percent);
- poly[3] = zero_y - 3;
- poly[4] = max_x * (1 - offset_percent) + 5;
- poly[5] = zero_y;
- drawpoly(3, poly);
- outtextxy(max_x * (1 - offset_percent), zero_y + 5, "x");
- line(zero_x, zero_y, zero_x, max_y * offset_percent); //Ось y
- del_y = (max_y * (1 - 2 * offset_percent)) / y_steps;
- for (i = 0; i < y_steps; i++)
- {
- line(zero_x - 1, zero_y - del_y * i, zero_x + 1, zero_y - del_y * i);
- }
- poly[0] = zero_x;
- poly[1] = max_y * offset_percent - 5;
- poly[2] = zero_x + 3;
- poly[3] = max_y * offset_percent;
- poly[4] = zero_x - 3;
- poly[5] = max_y * offset_percent;
- drawpoly(3, poly);
- outtextxy(zero_x - 15, max_y * offset_percent - 10, "y");
- //TODO: добавить стрелки
- //TODO: добавить деления
- //TODO: добавить подписи
- offset_percent += 0.03;
- del_x = (max_x * (1 - 2 * offset_percent)) / len; //Цена делания по оси x
- x_inc = len / x_steps;
- top_y = (f(a) > f(b)) ? f(a) : f (b); //Наибольшее значение по y. TODO: исправить
- del_y = (zero_y - max_y * offset_percent) / top_y; //Цена деления по оси y;
- double prev_x, prev_y, cur_x, cur_y;
- x = a;
- prev_x = x * del_x + zero_x;
- prev_y = zero_y - f(x) * del_y;
- x += x_inc;
- for (i = 1; i < x_steps; i++, x += x_inc)
- {
- cur_x = x * del_x + zero_x;
- cur_y = zero_y - f(x) * del_y;
- line(prev_x, prev_y, cur_x, cur_y);
- prev_x = cur_x;
- prev_y = cur_y;
- }
- system("pause");
- }
- void draw_histogram(double a, double b, int x_steps, int y_steps)
- {
- int i, max_x, max_y, zero_x, zero_y;
- double x, y;
- int poly[6];
- char str[10];
- double top_y, x_inc, del_x, del_y;
- double len = b - a; //Длина отрезка
- double offset_percent; //Процент от максимальных координат, который отступается от осей.
- max_x = getmaxx();
- max_y = getmaxy();
- //Сделать фон белым, а цвет рисования чёрным.
- setfillstyle(1, 15);
- bar(0, 0, max_x, max_y);
- setcolor(0);
- setlinestyle(0, 0, 1);
- offset_percent = 0.1;
- //Вычисляем положение нуля по вертикали (на оси y)
- zero_x = max_y * offset_percent;
- if (a < 0)
- {
- zero_x += (fabs(a) / len) * (max_y * (1 - 2 * offset_percent)); //TODO
- }
- zero_y = max_x * offset_percent;
- line(max_x * offset_percent, zero_x, max_x * (1 - offset_percent), zero_x); //Ось y (горизонтальная)
- //offset_percent += 0.03;
- del_y = (max_x * (1 - 2 * offset_percent)) / y_steps;
- for (i = 0; i < y_steps; i++)
- {
- line(max_x * offset_percent + i * del_y, zero_x + 1, max_x * offset_percent + i * del_y, zero_x - 1);
- }
- //offset_percent -= 0.03;
- poly[0] = max_x * (1 - offset_percent);
- poly[1] = zero_x + 3;
- poly[2] = max_x * (1 - offset_percent);
- poly[3] = zero_x - 3;
- poly[4] = max_x * (1 - offset_percent) + 5;
- poly[5] = zero_x;
- drawpoly(3, poly);
- outtextxy(max_x * (1 - offset_percent), zero_x + 5, "y");
- line(zero_y, max_y * offset_percent, zero_y, max_y * (1 - offset_percent)); //Ось x (вертикальная)
- //offset_percent += 0.03;
- del_x = (max_y * (1 - 2 * offset_percent)) / x_steps;
- for (i = 0; i < x_steps; i++)
- {
- line(zero_y - 1, max_y * offset_percent + del_x * i, zero_y + 1, max_y * offset_percent + del_x * i);
- }
- //offset_percent -= 0.03;
- poly[0] = zero_y;
- poly[1] = max_y * offset_percent - 5;
- poly[2] = zero_y + 3;
- poly[3] = max_y * offset_percent;
- poly[4] = zero_y - 3;
- poly[5] = max_y * offset_percent;
- drawpoly(3, poly);
- outtextxy(zero_y - 15, max_y * offset_percent - 10, "x");
- offset_percent += 0.03;
- del_x = (max_y * (1 - 2 * offset_percent)) / len; //Цена деления по оси x (вертикальная)
- x_inc = len / x_steps;
- top_y = (f(a) > f(b)) ? f(a) : f(b); //Наибольшее значение по y. TODO: исправить
- del_y = (max_x * (1 - 2 * offset_percent)) / top_y; //Цена делания по оси y (горизонтальная)
- double prev_x, prev_y, cur_x, cur_y;
- //setbkcolor(WHITE);
- settextstyle(SMALL_FONT, HORIZ_DIR, 3);
- for (x = a, i = 0; i < x_steps; i++, x += x_inc)
- {
- cur_y = zero_y + f(x) * del_y;
- cur_x = zero_x + x * del_x;
- line(zero_y, cur_x, cur_y, cur_x);
- sprintf(str, "%f", f(x));
- outtextxy(cur_y + 10, cur_x - 3, str);
- prev_x = cur_x;
- prev_y = cur_y;
- }
- system("pause");
- }
- void save_chart()
- {
- writeimagefile(NULL, 0, 0, getmaxx() - 1, getmaxy() - 1, 1, NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement