JAVAの最適化(6)
90度回転アルゴリズムを、もう少し考えてみました。
0 1 2 3 4 5
これを、90度回転させると、
4 2 0 5 3 1
になるのだけれども、左下の4から上方向に移動していっているので、計算が少し重くなっています。
これを、Y反転させてやると、
4 5 2 3 0 1
としてやると、左上から下方向に移動することができるので、計算が少し軽くなります。
今までは、
p = width * (height - 1); j = p - (i % height) * width + i / height;
となっていたのですが、Y反転させると、
j = (i % height) * width + i / height;
となり、減算が1つ減ります。
これを最適化すると、
public void rotate90( ){ int j; int w = width; int h = height; int i; int p; byte[] buf = pixelbuf; flipY( ); for( i = w * h - 1 ; i > 0 ; i=i+1 ){ j = i; do{ j = (j % h) * w + j / h; }while( j > i ); p = buf[ i ]; buf[ i ] = buf[ j ]; buf[ j ] = p; } width = h; height = w; }
こんな感じですかね。
do,whileの中で使われている変数を、全てプライム変数にすることが出来ました。
これで少しは速くなるはず……。
いや、逆にY反転で遅くなってるかも(;´Д`)