forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Движение объекта и другие действия при помощи формулы sin() (http://forum.boolean.name/showthread.php?t=20215)

JeanWinters 03.03.2016 11:24

Движение объекта и другие действия при помощи формулы 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 , так как объект движется, а она возрастает, или переменная обнулится сама, как только достигнет предела значений типа? Во многих примерах рассматривают этот алгоритм движения, также как и масштабирования, вращения, но про то, что переменная постоянно возрастает не говорят ничего конкретного.

RegIon 03.03.2016 11:28

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
Ну по идее нужно ограничить переменную, но я думаю ты долго будешь ждать, пока double переполнится и станет отрицательным, так что не обязательно,хотя я бы ограничивал угол от 0до 2PI, нафиг больше.

impersonalis 03.03.2016 11:42

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
Цитата:

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


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


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

Вопрос такой, нужно ли обнулять переменную angle , так как объект движется, а она возрастает, или переменная обнулится сама, как только достигнет предела значений типа? Во многих примерах рассматривают этот алгоритм движения, также как и масштабирования, вращения, но про то, что переменная постоянно возрастает не говорят ничего конкретного.

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

См. ещё Откидывание периода угла

Жека 03.03.2016 12:16

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
angle = (angle+speed) % 360.0;

JeanWinters 05.03.2016 16:36

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

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

impersonalis, функция работает, помогла.

JeanWinters 06.03.2016 15:32

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?

RegIon 06.03.2016 16:01

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
Цитата:

Сообщение от JeanWinters (Сообщение 304581)
Кстати, почему, если в BlitzMax'е написать Sin(180) , то выдается странное значение?

Потому что передавать нужно в радианах. 180 = Pi=3.141526

JeanWinters 06.03.2016 16:31

Ответ: Движение объекта и другие действия при помощи формулы sin()
 
Вложений: 1
Так в эту формулу передаются значения в градусах.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot