2012-11-06 18 views
9

私はこのコードスニペットを持っています。私はmatrix.prescale()とマトリックスが渡されたcreateBitmapを理解していません。 それはどういう意味ですか?行列計算を理解するためのシミュレーションWebサイトはありますか?あなたはグラフィックスに使用される数学についていくつかのウェブサイトを教えてください。申し訳ありませんが、私は数学をよくしていません。 :)マトリックス計算を明確に理解してください

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; 
} 
+0

あなたの投稿を編集したことがわかりました。私はあなたのために私の答えにできることは何ですか? – Simon

+0

理解するのは抽象すぎですが、問題ありません。行列の変換と代数を理解することは難しいです。 – Emerald214

答えて

64

少なくとも早い段階ではそれほど難しくはないと思ってください。

行列を数値の配列として考えると、この場合、Androidマトリックスには3行の3行が表示されます。各数値は、マトリックスが適用されている「もの」をAndroidグラフィックス関数がスケールする(大きくする/小さくする)、変換する(移動する)、回転させる(回転させる)、または歪める(2D平面で歪める)ことを指示します。

この行列は次のようになります(ここではdocsを参照)。

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

良いニュースは、あなたは、Androidで行列を使用するために、ほとんど数学確かに、任意の行列数学を知っている必要はないないということです。これは、preScale()のようなメソッドを使用して行います。後ろの数学を理解することはそれほど難しいことではありません。ほとんどの場合、加算、掛け算、およびSOHCAHTOAが必要です。

matrix-transform-for-the-mathematically-challenged/

あなたはマトリックスのドキュメントを読んだとき、あなたは、回転するためのメソッドが表示されますなどは、「設定」、「郵便」または「前」の接頭辞を変換します。

新しい行列を作成するとします。その後、setRotate()を使用して行列を設定して回転を行います。次に、preTranslate()を使用して翻訳を行います。 'pre'を使用したため、翻訳は回転前に行われます。あなたが '投稿'を使用していた場合は、最初にローテーションが発生します。 'set'は、マトリックスにあるものをすべて消去し、再び開始します。

があなたの特定の質問に答えるために、新しいMatrixは、(1)(したがって、同じサイズ)でスケール「アイデンティティ行列」

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

作成し、何の平行移動、回転しませんかスキュー。したがって、恒等行列を適用すると何も行われません。次のメソッドはpreScale()です。これはこの単位行列に適用され、表示した場合には、スケールされた行列が得られます。それ以外の方法はsetScale()またはpostScale()を使って行うこともできます。

これが役に立ちます。

+1

これは行列に最もよく説明されています。私はこれまでに – Rasmus

+1

Simonを読んだことがありますが、これは簡単ですが短い説明でもあります。優れた! – Mike

+1

地球はあなたのようなより多くの人々を必要としています、サイモン! –

関連する問題