Как бы я сменил уравнение для модуляции числа на линии на то, которое модулирует на синусоиде? - PullRequest
0 голосов
/ 22 января 2011

Я пытаюсь модулировать альфа-значение в приложении Java, которое я создаю на Android. Прямо сейчас это выглядит так:

if (goingUp) {
    newAlpha = oldAlpha + rateOfChange;
    if (newAlpha > maxAlpha) {
        newAlpha = maxAlpha;
        goingUp = false;
    }
} else {
    newAlpha = oldAlpha - rateOfChange;
    if (newAlpha < minAlpha) {
        newAlpha = minAlpha;
        goingUp = true;
    }
}

Где rateOfChange - произвольное значение типа int, которое не может быть больше maxAlpha. Уравнение оценивает каждый тик в потоке и не зависит от времени.

Есть ли способ использовать только переменные, указанные + Math.PI и другие элементы Math (я предполагаю, что там будет Math.Sine), чтобы newAlpha был числом на синусе?

Я думаю, min и max были бы усилителем волны, а rateOfChange был бы продуктом функции синуса, я просто не могу понять, как все это сочетается.

Ответы [ 3 ]

1 голос
/ 22 января 2011

Ваше уравнение будет выглядеть так:

alt text

y - вертикальное положение в момент времени t, A - амплитуда, f - частота, а t - время (или отметки часов Android).

0 голосов
/ 22 января 2011

Исходя из общего уравнения Даффимо, мне пришлось вернуться обратно к моим дням на TI-83 (буквально, поставить приложение на моем телефоне).Но я смог собрать все кусочки вместе, чтобы получилось так:

newAlpha = (int)((alphaMax - alphaMin) * 0.5 * Math.sin(rateOfChange * ticks + randomPhaseOffset) + (alphaMin + (alphaMax - alphaMin) * 0.5))

FMI: http://en.wikipedia.org/wiki/Sine_wave

0 голосов
/ 22 января 2011

Почему бы вам не подумать об этом?

... в верхней части определения вашего класса, включите: -

import java.lang.*;

... и в вашей функции послеприсваивание newAlpha,

newAlpha = Math.sin(newAlpha%(2*Math.PI));

, если вы хотите, чтобы newAlpha находился в диапазоне [-1,1], поскольку функция sin () имеет значение

ИЛИ

...в вашей функции, после присвоения newAlpha,

newAlpha = Math.asin(newAlpha%3 - 1);

, если вы хотите, чтобы newAlpha находился в диапазоне [-1,1], так как функция sin () равна

Я не уверен, какой тип данных у вашей newAlpha, но я собираюсь предположить, что это не повлияет на ответ для этого выражения - как newAlpha типа double.

Обычно это способ получить число.в пределах определенного диапазона, который вы применяете модуль для любого выражения, то есть.выражение% N приводит к числу в диапазоне [0, N-1].

Надеюсь, это поможет.

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