html5のcanvasでscaleを変更する場合の注意点を一つ紹介。
context.scale(2, 2);
としたときに、スケールをオリジナルの2倍にするという考えは間違いで、実際はスケールを今の2倍にするという意味になるようです。
言葉で表現し難いですね。
オリジナルではなくcotext.scale()でスケールを変更するときが基準になるんです。
たとえば、以下のように、
context.scale(2, 2);
context.scale(2, 2);
最初に設定したスケールの2倍になっていると思うのは間違いで、4倍(2倍×2倍)になるみたい・・。
別の例を示すと、
context.scale(2, 2);
context.scale(1, 1);
これは最初のスケールと比べると2倍のまま(2倍×1倍)なんです。
「じゃあスケール変えたら戻せないじゃん!」
と思うかもしれないけど、戻す方法はあって、
context.scale(2, 2);
context.scale(1/2, 1/2);
というふうに、scaleに逆数を指定してしまえばオリジナルのスケールに戻ります。
でもこれって、計算結果が端数になった場合、思ったとおりに戻らない可能性があるわけで・・。
ゆえにsaveとrestoreメソッドを使うのがおすすめです。
save()を呼び出すと、その時のcontextの状態(スケールや線の太さ、色などなど)を保存
restore()を呼びだすと、最後にsaveした状態に戻る
つまり、
context.save()
context.scale(2, 2);
context.restore()
ってやると、スケールを変更する前の状態をsaveしたので、restoreを呼び出したときにスケールが1倍に戻るってことです。
contextの状態を戻せるsaveとrestoreのコンボは便利なので色々と活用!