ImageViewがあり、ズームおよび回転されたImageがあります。
写真を参照してください:
画像はによって拡大縮小されandroid.graphics.Matrix
ます。
画像の中心点である赤い点と青い境界線があることがわかります。それらを計算する方法は?
(更新:背景である全体像ではなく、青い境界線の内側の女の子の画像を操作したい)
2つの間に数学的な依存関係があります。利用可能な他の情報がある場合:-長方形がすべての角に対して直角であると仮定します-。
center.X = (aCorner.X + oppositeCorner.X)/2;
center.Y = (aCorner.Y + oppositeCorner.Y)/2;
ここで、aCornerは任意のコーナーであり、oppositeCornerはaCornerの反対側のコーナーです。
これは些細なことで、境界線を計算するためにもう少し大変な作業が含まれていました(そして、画像の中心位置、幅、高さ、回転角など、もう少し多くの情報が含まれていました)。画像の幅を「w」、高さを「h」、角度を「a」、中心を「cX」と「cY」と仮定します。最初のコーナー;
length = sqrt(w^2+h^2)/2;
x = (length)*(cos(a)*(-w/length) - (h/length)*sin(a)) + cX;
y = (length)*(sin(a)*(-w/length) + (h/length)*cos(a)) + cY;
2番目のコーナー。
x = (length)*(cos(a)*(w/length) + sin(a)*(h/length)) + cX;
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;
第3;
x = -(length)*(cos(a)*(-w/length) + (h/length)*sin(a)) + cX;
y = -(length)*(sin(a)*(-w/length) - (h/length)*cos(a)) + cY;
第4;
x = -(length)*(cos(a)*(w/length) - sin(a)*(h/length)) + cX;
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;
長さは長方形の対角線の半分です。cosとsinのある内部は、三角関数変換の結果です。
sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b)
[....]
また、cXとcYは、コーナーを任意の座標系から特定の座標系に変換するために使用されます。
私は知っています、私はこれが一種のやり過ぎだったことを知っています。マトリックスクラスは、それ自体でこの関数を持っている場合があります。もしそうなら、そこで使用されている方法は、ここで説明した方法に分解できると思います。
注:角度a-実際にはsin(a)とcos(a)でさえ、より
良い-Matrix.getValues(float [] values)を介してアクセスできます。
ほとんどの2Dマトリックスは、次のスキームを使用します。
| sin(a) 0 0 |
| 0 -cos(a) 0 |
| 0 0 scale|
AndroidAPIの特定の実装についてはよくわかりません。
ところで、そこにいくつかの署名エラーがあった可能性があるので注意してください。