Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 03.03.2016, 11:24   #1
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Движение объекта и другие действия при помощи формулы sin()

Для того, чтобы объект двигался вверх/вниз можно использовать формулу sin(). Например, так:


var angle=0;
var range=10;
var speed = 0.25;
var y0 = circle.y;


circle = y0 + Math.sin(angle)*range;
angle+=speed;

Вопрос такой, нужно ли обнулять переменную angle , так как объект движется, а она возрастает, или переменная обнулится сама, как только достигнет предела значений типа? Во многих примерах рассматривают этот алгоритм движения, также как и масштабирования, вращения, но про то, что переменная постоянно возрастает не говорят ничего конкретного.
(Offline)
 
Ответить с цитированием
Старый 03.03.2016, 11:28   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Ну по идее нужно ограничить переменную, но я думаю ты долго будешь ждать, пока double переполнится и станет отрицательным, так что не обязательно,хотя я бы ограничивал угол от 0до 2PI, нафиг больше.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 03.03.2016, 11:42   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Сообщение от JeanWinters Посмотреть сообщение
Для того, чтобы объект двигался вверх/вниз можно использовать формулу sin(). Например, так:


var angle=0;
var range=10;
var speed = 0.25;
var y0 = circle.y;


circle = y0 + Math.sin(angle)*range;
angle+=speed;

Вопрос такой, нужно ли обнулять переменную angle , так как объект движется, а она возрастает, или переменная обнулится сама, как только достигнет предела значений типа? Во многих примерах рассматривают этот алгоритм движения, также как и масштабирования, вращения, но про то, что переменная постоянно возрастает не говорят ничего конкретного.
Вопрос переполнений редко рассматривается всерьёз (что оборачивается потенциальными дырами в безопасности), т.к. для большинства применений переполнение либо не происходит, либо не является недопустимым/критичным.
Переменная, в данном случае, конечно, обнулится (ОС не упадёт), но только это приведёт к скачку значений и некорректному моделированию движения.
Разумеется, обвязка (идентификации, объявления, коррекции), обеспечивающая согласование участка кода с остальной системой, в теоретических конспектах не упоминается за ненадобностью.
В указанном фрагменте кода, отбрасывание периода у аргумента периодической функции - хороший стиль написания отказоустойчивого кода.

См. ещё Откидывание периода угла
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 03.03.2016, 12:16   #4
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

angle = (angle+speed) % 360.0;
(Offline)
 
Ответить с цитированием
Старый 05.03.2016, 16:36   #5
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Не совсем понял. Сделал в BlitzMax'е , только вместо процентов так: "angle = (angle+speed) * 360.0 / 100;" . Объект странно повел себя и "побежал"...

RegIon , это как будет выглядеть в коде?

impersonalis, функция работает, помогла.
(Offline)
 
Ответить с цитированием
Старый 06.03.2016, 15:32   #6
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?
(Offline)
 
Ответить с цитированием
Старый 06.03.2016, 16:01   #7
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Сообщение от JeanWinters Посмотреть сообщение
Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?
Потому что передавать нужно в радианах. 180 = Pi=3.141526
__________________
Сайт: http://iexpo.ml

Последний раз редактировалось RegIon, 06.03.2016 в 20:36.
(Offline)
 
Ответить с цитированием
Старый 06.03.2016, 16:31   #8
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение объекта и другие действия при помощи формулы sin()

Так в эту формулу передаются значения в градусах.
Вложения
Тип файла: rar test_.rar (865 байт, 585 просмотров)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 15:56.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com