さて次は Shiftキーを押しながらリサイズした場合に縦横比率を維持する処理を加える。
マウスの移動量 dx, dy を元の範囲選択の横と縦の比に強制的に合わせる処理を入れてみた。
(擬似コード)
r = width / height;
dy = dx * r;
ところがこれではうまくいかない。そもそも移動量が(上記の場合には)dx に比例することになり、実際にドラッグするとマウスカーソルと Knobの位置がずれて不自然な動きとなる。
それならば、ということで移動ベクトル(dx,dy)を今度は回転させて横縦比の傾きに強制的に合わせてみることを考えてみた。
θが分かれば座標回転の行列式で新しい移動ベクトル(dx' , dy')は求められる。
(擬似コード)
t1 = atan2(height, width);
t2 = atan2(dy, dx);
t = t1 - t2; // これがθになる
dx' = dx*cos(t) - dy*sin(t);
dy' = dx*sin(t) + dy*cos(t);
が、これも不自然な動き。結局回転角度が大きくなるケースではマウスカーソルとknobの動きが一致せず、感覚的な動きにならない。
うむ。どうするか。