Как бы я сменил уравнение для модуляции числа в строке на то, которое модулирует синусоиду?

Я пытаюсь модулировать альфа-значение в приложении 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 ответа

Решение

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

альтернативный текст

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

Основываясь на общем уравнении Даффимо, я должен был вернуться к своим дням 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

Почему ты не считаешь это?

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

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.

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

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

Другие вопросы по тегам