Есть ли однострочная функция, которая генерирует треугольную волну?


аналогично по модулю генерирует пилообразный сигнал. Он не должен быть непрерывным.

вот что я имею в виду:

int m = 10;
int x = 0;
int i = 0;
while (i < m*3) {
    printf("%d ", x);
    x++;
    x = x % m;
    i++;
}

генерирует последовательность 0..9, три раза, который выглядит так:

обратите внимание, что наклон на правой стороне пика-это просто графический артефакт

однострочный в этом случае является x = i++ % m


Я хочу это:

Если вы знаете один-лайнеры для других волновых форм (синус, квадрат), это было бы хорошо знать, а также.

обновление: ответы каждого были очень полезны, и у меня есть следующий вопрос.

что было бы добавлено к треугольной волновой функции, чтобы сделать наклон линий кривой в или из так:

спасибо всем ваши разнообразные ответы помогли мне увидеть проблемы с более широкой точки зрения. Особая благодарность Нольдорцы за его взять на расширение уравнение для квадратичных кривых.

8 56

8 ответов:

x = m - abs(i % (2*m) - m)

Треугольная Волна

y = abs((x++ % 6) - 3);

это дает треугольную волну периода 6, колеблющуюся между 3 и 0.

Прямоугольной Волны

y = (x++ % 6) < 3 ? 3 : 0;

это дает регулярную прямоугольную волну периода 6, колеблющуюся между 3 и 0.

Синусоида

y = 3 * sin((float)x / 10);

это дает синусоидальную волну периода 20 pi, колебалась между 3 и -3.


обновление:

Пышные Треугольные Волна

чтобы получить вариацию треугольной волны, которая имеет кривые, а не прямые линии, вам просто нужно ввести показатель степени в уравнение, чтобы сделать его квадратичным.

вогнутые кривые (т. е. x^2 формы):

y = pow(abs((x++ % 6) - 3), 2.0);

вогнутые кривые (т. е. sqrt(x) формы):

y = pow(abs((x++ % 6) - 3), 0.5);

кроме того, с помощью pow функция, вы можете просто определить

расширение на ответ Эрика Bainville-это:

y = (A/P) * (P - abs(x % (2*P) - P) )

где x-текущее целое число, а y-выход треугольной волны. A-амплитуда волны, а P-полупериод. Например, A=5 произведет волну, которая идет от 0 до 5; P=10 произведет волну с периодом 20. Волна начинается с y=0 для x=0.

обратите внимание, что y будет числом с плавающей запятой, если P не является фактором A. И, да, для математических пуристов: a технически вдвое больше амплитуды волны, но посмотрите на картинку ниже и вы поймете, что я имею в виду.

визуализируется:

y = abs( amplitude - x % (2*amplitude) )

изменение длины волны просто нужен фактор x.

Edit: то, что я называю амплитудой, на самом деле не амплитуда, а максимальное значение (т. е. 5, если кривая колеблется между 0 и 5). Амплитуда в математическом смысле составляет половину этого. Но ты понимаешь, в чем дело.

Я знаю, это старый пост, но для тех, кто ищет что-то подобное рекомендую смотреть. http://en.wikipedia.org/wiki/Triangle_wave

последняя формула y (x)=(2a/π) arcsin(sin((2π/p)*x))

или.

(2 * amplitudeConstant / Math.PI) * Math.Asin(Math.Sin(2 * (Math.PI / periodConstant) * Convert.ToDouble(variableX)))

попробуйте это:

x = m - abs(m - 2*(i++ % m))

вот периодическая функция, которая выглядит как отдаленное синусоидальное приближение; по сути, это синусоидальный параболоид, использующий квадрат X:

function  xs ( xx : float ): float{

    var xd =Mathf.Abs((Mathf.Abs(xx) % 2.4) - 1.2);

    if (  Mathf.Abs(Mathf.Abs(xx) % 4.8)  > 2.4){ 
        xd=(-xd*xd)+2.88;
    }else{
        xd = xd*xd;
    }

    return xd;

}

Я проверил это с помощью простого цикла и вы не ответили на вопрос человека вообще. Вырезать и вставлять не поможет людям. Неудивительно, что так много мистификаций в средствах массовой информации имеют такой успех. С людьми, которые повторяют ошибки других, которые не могут быть удивлены, это так. И люди даже дают положительные репутационные ставки за эти неправильные ответы?! Невероятно! Но опять же, это параллель с моим предыдущим замечанием.

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

PS: последний, кто дал "y(x)=(2a/π)arcsin(sin((2π/p)*x))" слишком сложен, мы ищем быструю процедуру c++, поэтому тригонометрия абсолютно исключена.