iPadの二本指のジェスチャで、拡大縮小と平行移動をしようと考えた。

最初は「二本の指の重心の移動量を平行移動、指の間隔の増減比率を拡大縮小にする」と実装したが、これは正しくない。

どう正しくないのか。タッチスタートの位置をo1, o2、現在のタッチ位置をp1, p2とする。 たとえば画面端で重心を保ちながら1/2に指を縮めたとする。(4, 0), (4, 4) → (4, 1), (4, 3) この場合、上記の計算式だと平行移動なしで1/2に縮むことになる。原点に対してでも画面中心に対してでもおかしい。 二本の指の重心に対して縮む必要がある。 image

では変形fを一般に「原点に対してs倍になってからx, y平行移動する」と表現するなら、このs, x, yはそれぞれどうなるか。

が理想だが、変形が回転を含まないのでタッチの動きによっては実現不能である。 そこでを最小化することにする。(最小二乗法)

Eをそれぞれs, x, yで微分して0とおき、式を整理する。 これをsでの微分に代入してx, yを決して整理するとsを求める式が得られる。

参考: sでの微分

  • image

これが「二本の指の重心の移動量を平行移動、指の間隔の増減比率を拡大縮小にする」とは別物であることは簡単に示せる。 image 例えばこういう移動をした場合、指の間隔の増減を拡大率にするタイプでは0.7倍ぐらいになる。 でも「回転しない」という条件下でもっとも誤差を少なくしようとすると、0.5倍するのが正しい。 上記の計算式は「0.5倍して(2, 1)移動」と適切に答えることができる。 image