|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
03.03.2016, 11:24
|
#1
|
Знающий
Регистрация: 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
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Движение объекта и другие действия при помощи формулы sin()
Ну по идее нужно ограничить переменную, но я думаю ты долго будешь ждать, пока double переполнится и станет отрицательным, так что не обязательно,хотя я бы ограничивал угол от 0до 2PI, нафиг больше.
|
(Offline)
|
|
03.03.2016, 11:42
|
#3
|
Зануда с интернетом
Регистрация: 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
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение объекта и другие действия при помощи формулы sin()
Не совсем понял. Сделал в BlitzMax'е , только вместо процентов так: "angle = (angle+speed) * 360.0 / 100;" . Объект странно повел себя и "побежал"...
RegIon , это как будет выглядеть в коде?
impersonalis, функция работает, помогла.
|
(Offline)
|
|
06.03.2016, 15:32
|
#6
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение объекта и другие действия при помощи формулы sin()
Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?
|
(Offline)
|
|
06.03.2016, 16:01
|
#7
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Движение объекта и другие действия при помощи формулы sin()
Сообщение от JeanWinters
Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?
|
Потому что передавать нужно в радианах. 180 = Pi=3.141526
Последний раз редактировалось RegIon, 06.03.2016 в 20:36.
|
(Offline)
|
|
06.03.2016, 16:31
|
#8
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение объекта и другие действия при помощи формулы sin()
Так в эту формулу передаются значения в градусах.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:51.
|