Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точность при построении графика, что использовать? 
V
    Опции темы
Grief
Дата 6.2.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



Ситуация следующая: необходимо построить график функции. Использовала для этого
Код

for (j = 0; j <= Mm; j++){
        T = 2*(j-Mm/2)*Tm/Mm;
        
        y = (((cosh(3*T)+3*cos4*cosh(T))*(cosh(3*T)+3*cos4*cosh(T))+sin4*cosh(T)*cosh(T))*8)/((cosh(4*T)+4*cosh(2*T)+3*cos4)*(cosh(4*T)+4*cosh(2*T)+3*cos4));
        y = y*10;
        T = T*10;
        y = -y;
                
        dc.LineTo((int)T, (int)y);
            
    }

В результате конечно график строит, но получается совсем не то, что хотелось бы.  smile  Формулу проверила несколько раз - все правильно, а значит скорее всего дело в точности (в LineTo ведь используются значения int). Какую функцию использовать? Пыталась воспользоваться этим  примером но не получилось - вообще не строит (руки-то не оттуда, откуда хотелось бы). Подскажите, пожалуйста, как построить? Или ткните носом где прочитать?
PM MAIL   Вверх
_hunter
Дата 6.2.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



Цитата(Grief @  6.2.2007,  14:30 Найти цитируемый пост)
В результате конечно график строит, но получается совсем не то, что хотелось бы.

а что получается? в чем проблема?
еще перед LineTo MoveTo не помешало бы (на предыдущее значение)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Grief
Дата 6.2.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



В результате получается треугольник, а по идее график должен быть сглаженным...
Цитата

еще перед LineTo MoveTo не помешало бы (на предыдущее значение)

вот так?
Код

dc.LineTo((int)T, (int)y);
dc.MoveTo((int)T, (int)y);    

PM MAIL   Вверх
zkv
Дата 6.2.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Grief, а задание какое (какая функция), что то по коду не очень понятно. Задача как я понимаю сводится к тому чтобы минимизировать шаг по одной из координат, а затем отобразить правильный масштаб. 

а MoveTo() надо использовать только перед самым первым вызовом LineTo() далее позиция будет меняться автоматом. 
PM MAIL   Вверх
Anikmar
Дата 6.2.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: нет
Всего: 59



Цитата(Grief @  6.2.2007,  15:06 Найти цитируемый пост)
В результате получается треугольник, а по идее график должен быть сглаженным...

Вы полюбому строите график отрезками.
Чтобы он выглядел сглаженным надо уменьшить шаг по х (т.е. точки по y вычислять с наибольшей частотой).

Чем больше у вас точек отсчета по x тем более сглаженным график получится.
PM MAIL ICQ   Вверх
_hunter
Дата 6.2.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



Цитата(Grief @  6.2.2007,  15:06 Найти цитируемый пост)
вот так?

нет. я же написал -- на предыдущее значение. или MoveTo на текущее, потом LineTo -- на следующее.
Цитата(zkv @  6.2.2007,  15:17 Найти цитируемый пост)
а MoveTo() надо использовать только перед самым первым вызовом LineTo() далее позиция будет меняться автоматом.

насколько я помню -- LineTo позицию не меняет. и если MoveTo выполнить только один раз -- получится пучек прямых к узлам графика.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Grief
Дата 6.2.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



zkv, формула такая, как указано, только я не весь код показала:
Код

dc.MoveTo(0, 120);
dc.LineTo(240, 120);
dc.MoveTo(120, 0);
dc.LineTo(120, 240);
dc.MoveTo(0, 120);

Ks = 16/Nm*pi/2;                //
cos4 = cos(4*Ks);
sin4 = 9*(sin(4*Ks)*sin(4*Ks));

for (j = 0; j <= Mm; j++){
    T = 2*(j-Mm/2)*Tm/Mm;
        
    y = (((cosh(3*T)+3*cos4*cosh(T))*(cosh(3*T)+3*cos4*cosh(T))+sin4*cosh(T)*cosh(T))*8)/((cosh(4*T)+4*cosh(2*T)+3*cos4)*(cosh(4*T)+4*cosh(2*T)+3*cos4));
    y = y*10;
    T = T*10;
    y = -y;
    y = y + 120.;

    dc.LineTo((int)T, (int)y);
    dc.MoveTo((int)T, (int)y);    
    }

}

PM MAIL   Вверх
SergeCpp
Дата 6.2.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 5
Всего: 124



Цитата(_hunter @  6.2.2007,  17:28 Найти цитируемый пост)
насколько я помню -- LineTo позицию не меняет. и если MoveTo выполнить только один раз -- получится пучек прямых к узлам графика.

LineTo
Цитата
If LineTo succeeds, the current position is set to the specified ending point.


PM MAIL WWW ICQ   Вверх
Grief
Дата 6.2.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



Упс, раньше времени оправила, хотела сказать, что если использую
Код

for (j = 0; j <= Mm; j+=0.5){

например, то программа безнадежно повисает при расчетах на той самой строчке с формулой...
PM MAIL   Вверх
Anikmar
Дата 6.2.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: нет
Всего: 59



Цитата(Grief @  6.2.2007,  15:38 Найти цитируемый пост)

например, то программа безнадежно повисает при расчетах на той самой строчке с формулой... 

Так оно и будет, если у вас j это int, то прибавляя к нему 0.5 дробная часть отбрасывается.

В результате цикл выглядит так:
for (j = 0; j <= Mm; j+=0)
PM MAIL ICQ   Вверх
Grief
Дата 6.2.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



Anikmar, спасибо! на это я почему-то упорно не смотрела   smile  тормоз... что поделаешь  smile 
PM MAIL   Вверх
zkv
Дата 6.2.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(Grief @  6.2.2007,  15:32 Найти цитируемый пост)
zkv, формула такая, как указано, только я не весь код показала:

Grief, мне лично очень трудно понять ваши действия, например строки 
Цитата(Grief @  6.2.2007,  15:32 Найти цитируемый пост)
for (j = 0; j <= Mm; j++){
    T = 2*(j-Mm/2)*Tm/Mm;

совершенно непонятны, так как я не знаю что такое Mm, Tm, могу только догадываться, но гадать как то нет настроения, а дальше я уже даже не пытаюсь проследить что происходит. 

вы можете показать функцию, как она дана в задании 
e.g. 
  y = x^2 
или 
    / x = t^2
   |
    \ y = cos( t )   
или еще каким нибудь понятным способом? smile
PM MAIL   Вверх
Grief
Дата 6.2.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



поправила - намного лучше, но все-таки не так хорошо... даже при
Код

for (j = 0; j <= Mm; j+=0.001){

угловатый график, что же я не так делаю?  smile 
PM MAIL   Вверх
Anikmar
Дата 6.2.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: нет
Всего: 59



Цитата(Grief @  6.2.2007,  16:20 Найти цитируемый пост)
на это я почему-то упорно не смотрела


Для таких вещей очень нужен отладчик. Если бы прошлись по шагам сразу бы увидели в чем дело.

Добавлено @ 16:45 
Цитата(Grief @  6.2.2007,  16:39 Найти цитируемый пост)
угловатый график, что же я не так делаю? 

Почему вы думаете, что что-то неправильно делаете? Все зависит от функции. Может быть даже на такой маленькой дискретности ее значение прыгает очень сильно? Я не понял что за функция...


PM MAIL ICQ   Вверх
Grief
Дата 6.2.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.2.2007
Где: СПб

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



zkv, могу вот так: 

y(t,z) =((cosh(3t) + 3cos(4z)cosh(1t))^2 + 9((sin(4z))^2)cosh(1t)^2))*8 / (cosh(4t) + 4cosh(2t) +3cos(4z)^2

дана она мне была вообще-то в виде куска кода, но не работающего (работающий видимо потеряли)

Anikmar
я знаю, какие графики в итоге должны получится... ладно, буду думать)))

Это сообщение отредактировал(а) Grief - 6.2.2007, 16:57
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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