拡大縮小(5)

なぜ縮小でうまくいかないか考えてみる。
例えば3$dw3$73$sw3$13だった場合、3$sxは毎ループ3$\frac{13}{7}だけ進む。
1回ループすると、3$sx3$13$bigsx3$0+13-7=6になる。
2回目のループでは、3$sx3$23$bigsx3$6+13-7=12になる。
この時点でおかしい。本来であれば、3$bigsx3$dwを超えた場合、3$sxへ値を渡さなければならない。
つまり、2回目のループでは、3$sx3$33$bigsx3$6+13-7-7=5にならなければならないのだ。
これをそのままプログラムにすると、

int big_sx = 0;
int sx = 0;
int dx = 0;
while( true ){
    if( dx >= dw) break;
    dst[ dx ] = src[ sx ];
    dx++;
    big_sx += sw; // 毎ループ sw を加算する
    while( big_sx >= dw ){ // ここが違う
        sx++;
        big_sx -= dw;  // sx を1つ増やしたので、こっちは dw だけ減る
    }
}

3$bigsx3$dwより大きい間は、その値を3$sxに渡すようにすればいいのだ。
これで縮小もうまくいく。
ただし、while にするのはもったいない。