Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переделать программу с построителем графика 
:(
    Опции темы
romanie
Дата 26.6.2012, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;

PM MAIL   Вверх
math64
Дата 26.6.2012, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Не знаешь формулу для гиперболического синуса?
формула:
sinh(x) = (e^x - e^(-x) ) / 2;
ряд:
sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...
где ^ - возведение в степень, ! - факториал


Это сообщение отредактировал(а) math64 - 26.6.2012, 09:05
PM   Вверх
borisbn
Дата 26.6.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0977 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.