Is there a one-line function that generates a triangle wave?


In a similar way that modulo generates a sawtooth wave. It doesn't have to be continuous.

here is what i mean:

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

generates a sequence 0..9, three times which looks like this:

sawtooth wave graph

note that the slope on the right side of the peak is just a graphing artifact

The one-liner in this case is x = i++ % m


What I want is this:

triangle wave graph

If you know one-liners for the other wave forms (sine, square), that would be good to know as well.

Update: everyone's answers have been very helpful and I have a follow-up question.

What would be added to the triangle wave function to make the slope of the lines curve in or out like this:

bulging waveforms

Thanks everyone, your varied answers helped me see the problem from a larger perspective. Special thanks to Noldorin for his take on extending the equation to quadratic curves.


Answers:


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