Цитата(Andrei Aleksandrovich @ Sep 20 2008, 06:50)

В переходах между, например, 1 и 3 - нормально, а между 1 и 2 - уже крутит в неправильную сторону (тоесть прокручивает полностью круг, чтобы добраться до позиции). Что я делаю не так?

Вы не поняли, как считать расстояния, в одну из сторон они у Вас выходят отрицательными (и смещёнными). Надо так (len - длина всего круга, остальные переменные тоже с осмысленными именами):
Код
forward_dist = (to - current) % len;
if(forward_dist < 0) forward_dist += len;
backward_dist = (current - to) % len;
if(backward_dist < 0) backward_dist += len;
if(forward_dist <= backward_dist) {
...
Если учесть моё замечание про жёсткую связь между forward_dist и backward_dist, то
Код
forward_dist = (to - current) % len;
if(forward_dist < 0) forward_dist += len;
backward_dist = len - forward_dist;
if(forward_dist <= backward_dist) {
...
Но тогда непонятно, зачем вообще вычислять backward_dist, если можно так, как я сразу сказал:
Код
half_len = len/2; // ну или константа, равная половине константы len
...
forward_dist = (to - current) % len;
if(forward_dist < 0) forward_dist += len;
if(forward_dist <= half_len) {
...
Собственно, если исходно есть гарантия, что и to и current находятся в диапазоне 0..(len-1), то вычисление остатка не нужно вообще:
Код
half_len = len/2;
...
forward_dist = to - current;
if(forward_ist < 0) forward_dist += len;
if(forward_dist <= half_len) {
...
А для конкретной фиксированной длины 16 (степень двойки) можно вообще так:
Код
#define LEN 16
#if LEN < 2 || ( LEN & (LEN-1) ) != 0
#error "LEN must be power of 2 and >= 2"
#endif
#define HALF_LEN (LEN/2)
#define MASK (LEN-1)
...
forward_dist = (to - current) & MASK;
// или ниже вообще if( !(forward_dist & HALF_LEN) ) {
// так как HALF_LEN тоже степень двойки и есть маской старшего бита расстояния
// только обозвать тогда тоже нужно вразумительнее, скажем, HALF_LEN_MASK
if(forward_dist <= HALF_LEN) {
// go forward
} else {
// go backward
}