1

ImageViewがあり、ズームおよび回転されたImageがあります。

写真を参照してください:

ここに画像の説明を入力してください

画像はによって拡大縮小されandroid.graphics.Matrixます。

画像の中心点である赤い点と青い境界線があることがわかります。それらを計算する方法は?

(更新:背景である全体像ではなく、青い境界線の内側の女の子の画像を操作したい)

4

1 に答える 1

2

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の特定の実装についてはよくわかりません。

ところで、そこにいくつかの署名エラーがあった可能性があるので注意してください。

于 2012-09-02T12:15:48.813 に答える