19

このコードスニペットがあります。マトリックスが渡されたMatrix.preScaleとがわかりません。どういう意味ですか?行列計算を理解するためのシミュレーションWebサイトはありますか?グラフィックに使われる数学についてのウェブサイトを教えてください。数学が苦手でごめんなさい。:)Bitmap.createBitmap

public Bitmap createReflectedImages(final Bitmap originalImage) {
    final int width = originalImage.getWidth();
    final int height = originalImage.getHeight();
    final Matrix matrix = new Matrix();
    matrix.preScale(1, -1);
    final Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, (int) (height * imageReflectionRatio),
            width, (int) (height - height * imageReflectionRatio), matrix, false);
    final Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (int) (height + height * imageReflectionRatio + 400),
            Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmapWithReflection);
    canvas.drawBitmap(originalImage, 0, 0, null);
    final Paint deafaultPaint = new Paint();
    deafaultPaint.setColor(color.transparent);
    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
    final Paint paint = new Paint();
    final LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0,
            bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
    paint.setShader(shader);
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
    return bitmapWithReflection;
}
4

1 に答える 1

100

少なくとも初期の段階では、あまり難しく考えないでください。

行列を数値の配列と考えてください。この場合、AndroidMatrixには3行の3つの数字があります。各数値は、Androidグラフィックス関数に、マトリックスが適用される「もの」を拡大縮小(拡大/縮小)、移動(移動)、回転(回転)、または傾斜(2D平面で歪ませる)する方法を指示します。

マトリックスは次のようになります(ここのドキュメントを参照してください)。

{Scale X, Skew X, Transform X
Skew Y, Scale Y, Transform Y
Perspective 0, Perspective 1, Perspective 2}

幸いなことに、Androidで行列を使用するために、行列の数学を知る必要はなく、実際にはほとんど数学を知る必要はありません。これが、preScale()のようなメソッドが行うことです。背後にある数学を理解することはそれほど難しいことではありません。ほとんどの場合、必要なのは加算、乗算、およびSOHCAHTOAだけです。

数学的に挑戦された/のための行列変換

Matrixのドキュメントを読むと、「set」、「post」、または「pre」のプレフィックスが付いたrotate、translateなどのメソッドが表示されます。

新しいマトリックスを作成するとします。次に、setRotate()を使用して、回転を実行するようにマトリックスを設定します。次に、preTranslate()を使用して翻訳を行います。'pre'を使用したため、変換は回転の前に行われます。'post'を使用した場合、ローテーションが最初に発生します。'set'は、マトリックス内にあるものをすべてクリアして、再開します。

特定の質問に答えるために、new Matrix()は「単位行列」を作成します

{1, 0, 0
 0, 1, 0
 0, 0, 1}

これは1でスケーリングされ(したがって同じサイズ)、平行移動、回転、またはスキューは行われません。したがって、単位行列を適用しても何も起こりません。次のメソッドはpreScale()で、これはこの単位行列に適用されます。これまでに示したように、結果はスケーリングする行列になり、setScale()またはpostScale()を使用して他に何も実行できません。

お役に立てれば。

于 2012-11-06T08:12:21.517 に答える