Новичок
Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.5.2012
Репутация: нет Всего: нет
|
Люди добрые, нужна помощь, заранее спасибо. Написана программа которая рисует два графика(один внутренней функцией программы, другой по ряду, т.е. по введенной формуле) одной и той же функции разными цветами, они должны максимально совпадать, задается только х начальное и конечное и точность с которой будет рисоваться график. Мне нужно переделать чтобы программа рисовала график гиперболического синуса. Вот собственно код: Код | #include <stdio.h> #include <conio.h> #include <graph.h> #include <math.h>
double interface(double x_start, double x_finish, double y_min, double y_max, double eps); double function_of_X(double x, double eps);
int main(void) { double x, x_start, x_finish, y_max, y_min, eps; double cost_x;
while (printf("Введи x start, x finish, где |x|>1\n eps\n "), fflush(stdin), scanf("%lf%lf%lf", &x_start, &x_finish, &eps) != EOF) { y_max=function_of_X(x_finish,eps); //вычестляем максимум по ряду if (y_max < atan(x_finish)) y_max = atan(x_finish); //сравниваем с результатом библиотечной функции, нужна для //установки верхней границы отображаемой полскости y_min = function_of_X(x_start,eps); //для нижней границы
if (atan(x_start) > y_min)
y_min = atan(x_start);
_setvideomode(_VRES16COLOR); //видео режим 640*480 _setwindow(1, x_start, y_min, x_finish, y_max); //устанавливаем "реальные" координаты
cost_x = interface(x_start, x_finish, y_min, y_max, eps); //отрисовываем оси и подписи, также получаем цену //одного пикселя для оси Х for (x = x_start; x <= x_finish + cost_x / 4.0; x += cost_x) //цикл вычесления значений У и отрисовки графика { _setcolor(4); //нарисовали кусочек функции вычесленной библиотечной функцией _setpixel_w(x, atan(x)); _setcolor(2); ////нарисовали кусочек функции вычесленной нашей функцией _setpixel_w(x, function_of_X(x,eps)); }
getch(); _setvideomode(_DEFAULTMODE); } return 0; }
double function_of_X(double x, double eps) //(2) { double y = x, n = 1.0, var; //собственно вычесляет значения ряда от Х с заданной eps while (fabs(var = pow(-1.0, n) * pow(x, 2.0 * n + 1.0) / (2.0 * n + 1.0)) >= eps) { y += var; ++n; } return y; }
double interface(double x_start, double x_finish, double y_min, double y_max, double eps) {
struct _fontinfo my_font; struct videoconfig my_vc; double cost_x, cost_y, x_center, y_center, font_height, border_x, border_y; double y_draw_x_line, y_draw_x_text; double x_draw_y_text_min, x_draw_y_text_max, x_draw_y_line; char rab[255], rab_2[255];
_getvideoconfig(&my_vc);
cost_x = (x_finish - x_start) / my_vc.numxpixels; cost_y = (y_max - y_min) / my_vc.numypixels;
border_x = cost_x * 5; border_y = cost_y * 5;
//без регистрации шрифта не получиться вывести текст в графическом режиме, в //заданном месте
_registerfonts("COURB.FON"); _setfont("'COURB'"); _getfontinfo(&my_font); font_height = cost_y * my_font.pixheight;
/* отрисовывает ось Х и значения x_start, x_finish*/ //работает и слава богу if (y_min > 0.0) { y_draw_x_line = y_min + border_y; y_draw_x_text = y_min + font_height * 2 + border_y; } else if (y_max < 0.0) { y_draw_x_line = y_max - border_y; y_draw_x_text = y_max - font_height - border_y; } else { y_draw_x_line = 0.0;
if (fabs(y_min) > y_max) y_draw_x_text = 0.0; else y_draw_x_text = font_height; }
_setcolor(7); _moveto_w(x_start, y_draw_x_line); _lineto_w(x_finish, y_draw_x_line);
_setcolor(1); sprintf(rab, "x_start=%g", x_start); _moveto_w(x_start, y_draw_x_text); _outgtext(rab);
sprintf(rab, "x_finish=%g", x_finish); _moveto_w(x_finish - cost_x * _getgtextextent(rab), y_draw_x_text); _outgtext(rab);
/*отрисовываем ось Y и значения y_min, y_max*/ if (x_start > 0.0) { x_draw_y_line = x_start + border_x; x_draw_y_text_min = x_start + border_x; x_draw_y_text_max = x_start + border_x; } else if (x_finish < 0.0) { x_draw_y_line = x_finish - border_x; x_draw_y_text_min = x_finish - border_x - _getgtextextent(rab) * cost_x; x_draw_y_text_max = x_finish - border_x - _getgtextextent(rab_2) * cost_x; } else { x_draw_y_line = 0.0;
if (x_finish > fabs(x_start)) { x_draw_y_text_min = 0.0; x_draw_y_text_max = 0.0; } else { x_draw_y_text_min = -_getgtextextent(rab) * cost_x; x_draw_y_text_max = -_getgtextextent(rab_2) * cost_x; } }
_setcolor(7); _moveto_w(x_draw_y_line, y_max); _lineto_w(x_draw_y_line, y_min);
_setcolor(5); sprintf(rab, "y_min=%g", y_min); _moveto_w(x_draw_y_text_min, y_max); _outgtext(rab);
sprintf(rab_2, "y_max=%g", y_max); _moveto_w(x_draw_y_text_max, y_min + font_height); _outgtext(rab_2);
//рисуем atan и тейлора нужным цветом в нужном месте, и точнось _setcolor(4); _moveto_w(x_start + border_x, y_max - font_height * 2); _outgtext("atan(x)"); //(3) _setcolor(2); _moveto_w(x_start + border_x, y_max - font_height * 3); sprintf(rab_2, "tailor, eps=%g", eps);
return cost_x; } |
|