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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка в функции, график функции 
:(
    Опции темы
betal
Дата 4.6.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброе время суток день всем. Тут у меня програма для вывода на экран графика функции sin(x)*sin(x)-x; По идее должна получаться что-то похожее на синусоиду. А выходить прямая. В чем у меня ошибка ???
Код

//моя функция
float fun(int x)
{return (int)sin(x)*sin(x)-x;
}
Код

//в цикле ставлю пиксели по получившимся координатам.
putpixel(50+i,getmaxy()/2+(int)fun(i),7);


Мне кажется что ошибка именно в округлении. Ктонибудь обьясните в чем ?!?!
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Daevaorn
Дата 4.6.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(betal @  4.6.2007,  16:53 Найти цитируемый пост)
(int)sin(x)

зачем int?
Цитата(betal @  4.6.2007,  16:53 Найти цитируемый пост)
putpixel(50+i,getmaxy()/2+(int)fun(i),7);

заведи некий масштаб. например умножай на 10 или больше.
PM MAIL WWW   Вверх
NightXXX
Дата 4.6.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ты зачем так извращаешься, не приводи типы, он у тебя просто округляет каряво : 
Код

float fun(int x)
{return sin(x)*sin(x)-x*1.0;
}


Вот так вот поэксперементируй

Код

int k=5;//коэффициент маштаба
 putpixel(50+i,getmaxy()/2+fun(i)*k,7);


У тебя чиселко маленькое получается при вычисление ее с размером экрана не сравнить и получается линия, а если использовать коээфициент, то увидешь как изменяется график!! Если работаешь с вещественным типом, ниогда не приводи его к (int) таким образом это не привильно в вычислениях!
PM MAIL ICQ   Вверх
betal
Дата 4.6.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Daevaorn @  4.6.2007,  15:57 Найти цитируемый пост)
зачем int?

Мне кажется так правильнее. Ведь дробных координат не бывает.
Цитата(Daevaorn @  4.6.2007,  15:57 Найти цитируемый пост)
заведи некий масштаб. например умножай на 10 или больше.

Считай что у меня *1 smile

Добавлено через 1 минуту и 24 секунды
Цитата(NightXXX @  4.6.2007,  16:51 Найти цитируемый пост)
У тебя чиселко маленькое получается при вычисление ее с размером экрана не сравнить и получается линия, а если использовать коээфициент, то увидешь как изменяется график!! Если работаешь с вещественным типом, ниогда не приводи его к (int) таким образом это не привильно в вычислениях!

Ага щас попробую.....

--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
betal
Дата 4.6.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



не не вариант. То что оно неправильно его переводит это я уже понял. Но домножение функции на число не помогло. smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
vinter
Дата 4.6.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(betal @  4.6.2007,  20:17 Найти цитируемый пост)
Мне кажется так правильнее. Ведь дробных координат не бывает.

прально кажется, только вот
Цитата

(int)sin(x)*sin(x)-x;

можно смело записать как
Цитата



т.к синус всегда меньше 1, а преобразование к int в результате будет давать 0
Цитата(betal @  4.6.2007,  20:17 Найти цитируемый пост)
Считай что у меня *1 

тогда считай что ты ничего построить не сможешь smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Fazil6
Дата 4.6.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(vinter @  4.6.2007,  19:56 Найти цитируемый пост)
т.к синус всегда меньше 1, а преобразование к int в результате будет давать 0

не всегда
PM MAIL   Вверх
vinter
Дата 4.6.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Fazil6 @  4.6.2007,  22:19 Найти цитируемый пост)
не всегда

когда нет? 


--------------------
Мой блог
PM MAIL WWW   Вверх
Fazil6
Дата 4.6.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(vinter @  4.6.2007,  22:51 Найти цитируемый пост)
когда нет?

а ты разве в школе не учился? Чему равен синус 90 градусов? или 270?
PM MAIL   Вверх
betal
Дата 5.6.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(vinter @  4.6.2007,  19:56 Найти цитируемый пост)
можно смело записать какЦитата-Х

Что-тоя мысли не уловил
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
zkv
Дата 5.6.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



betal, мысль у vinter'а правильная, попробуй построй таким же образом график для 
Код

float fun(int x)
{return (int)sin(x)*sin(x);
}

посмотри, что получится, может наведет на мысли  smile 
PM MAIL   Вверх
vinter
Дата 5.6.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Fazil6 @  4.6.2007,  23:59 Найти цитируемый пост)
а ты разве в школе не учился? Чему равен синус 90 градусов? или 270?

ну вот опять я мыслю не дописал, естественно я говорил о <=, я думал ты имеешь ввиду больше 1..


--------------------
Мой блог
PM MAIL WWW   Вверх
betal
Дата 5.6.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(zkv @  5.6.2007,  09:21 Найти цитируемый пост)
посмотри, что получится, может наведет на мысли   

Ок

Цитата(zkv @  5.6.2007,  09:21 Найти цитируемый пост)
betal, мысль у vinter'а правильная, попробуй построй таким же образом график для 

А у меня он не правильный ????
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
zkv
Дата 5.6.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



betal, все дело в масштабе, то что ты непонятные преобразование туда-обратно проводишь, думаю особо не влияет на работу.

Проблема в том, что это - sin(x)*sin(x) даст отклонение графика от прямой линии максимум в 1 пиксель, да и то крайне редко, по этому, как говорилось раньше, необходимо ввести масштабирование. 
Что-то в этом духе:
Код

putpixel( int x, int y );
//...
float fun(float x)
{
return sin(x)*sin(x)-x;
}
//...
float fScale = 10.; 
//...
for(...)//значения x выбирать исходя из масштаба
  putpixel( (int)(x * fScale), (int)(fun(x) * fScale) );

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


Explorer
****


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

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



зайди в поиск в алгоритмах набери "Преобразование координат", там в принципе неплохо решена проблема масштабирования. Хотя если это не принципиально то я бы заюзал готовый компонент для отрисовки графиков. 


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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