Вот еще один подход, подпрыгивающий между start и start + span с шагом приращения, с помощью вспомогательной функции:
// Goes from start to start + span, and repeats.
int ramp(start, increment, span) {
static int lastval = start;
lastval += increment;
lastval = lastval % (span + 1);
return lastval;
}
// Goes from start up to start+span and back down, and repeats.
int bounce(start, increment, span) {
val = ramp(0, increment, 2*span - 1);
if (val > span) val = span - val;
return val + start;
}
По сути, это создает непрерывно увеличивающуюся линию, затем используя функцию MOD, чтобы нарезать ее в пилообразную форму, а затем отразить верхнюю половину пилообразной линии вниз, чтобы сделать зигзаг.
Обратите внимание, что, в отличие от всех других представленных реализаций (если я не пропустил одну), эта на самом деле проводит вас на том же расстоянии вдоль зигзага, даже если приращение не делится равномерно - например, для начала 0 , промежуток 10 и шаг 3, он будет увеличиваться с 3 до 3, с 3 до 6, с 3 до 9, с 1 на 1 и далее с 2 до 8, с 3 на 5, с 3 на 2, с 3 на 2, вниз на 2 и выше на 1 к 1 и т. д. - 3, 6, 9, 8, 5, 2, 1, 4, 7, 10, 7, 4, 1, .... И это также гарантирует, что числа всегда попадают в правильный диапазон и делают правильные вещи, даже если приращение намного больше, чем span или отрицательно.
(Вам, вероятно, следует переписать это, чтобы поместить такие элементы, как start, increment и span, где-нибудь в статическое хранилище, а не в аргументы функции, потому что это может запутаться, если они изменятся, но мне лень об этом. И, на самом деле, он все равно попадет в нужный диапазон и сделает несколько разумных вещей, если они изменятся - вы можете изменить приращение в любой точке, и он будет ускоряться или замедляться, не прыгая.)