2016-08-07 15 views
0

私は画像を変換するための行列を持っています。古い行列は、スケールと変換の関数です。 スケールや平行移動などの他の変換に影響を与えずに、古いMatrixの中心から回転を適用する方法。古い行列で回転変換を適用する

私はすでに、私は回転の欲望の結果を取得できませんでした。この

//get old matrix  
    Matrix matrix = getImageMatrix(); 

    float tx = getMatrixValue(matrix, Matrix.MTRANS_X); 
    float ty = getMatrixValue(matrix, Matrix.MTRANS_Y); 

    float scaleX = getMatrixValue(matrix, Matrix.MSCALE_X); 
    float scaleY = getMatrixValue(matrix, Matrix.MSCALE_Y); 

    float skewX = getMatrixValue(matrix, Matrix.MSKEW_X); 
    float skewY = getMatrixValue(matrix, Matrix.MSKEW_Y); 

    //calculating the actual scale 
    float sx = (float)Math.sqrt((scaleX*scaleX)+(skewY*skewY)); 
    float sy = (float)Math.sqrt((scaleY*scaleY)+(skewX*skewX)); 

    //calculating the rotateAngle 
    float rAngle = Math.round(Math.atan2(scaleX, skewX) * (180/Math.PI)); 



    //calculate the actual width and height of image 
    float width = sx * drawable.getIntrinsicWidth(); 
    float height = sy * drawable.getIntrinsicHeight(); 

    //calculate the center pivot for rotation 
    float cx = (width/2)+tx; 
    float cy = (height/2)+ty; 

    //Applying Rotation from center pivot 
    matrix.postTranslate(-cx , -cy); 
    matrix.postRotate(rotateAngle, (width/2)+tx, (height/2)+ty); 
    matrix.postTranslate(cx, cy); 

    setImageMatrix(matrix); 

    invalidate(); 

を試してみてください。それは翻訳の変更を行います。私はこれで何をしたのですか..?

は、私は100%確実ではないんだけど、私は問題はあなたが抽出し、その後、TXを再適用しようとしているということであると考えている完全なコードで(なし220以降のライン) http://pastebin.com/NWrNw0Nd

答えて

1

これはあなたのやり方です。短くて甘い。

private RectF rect = new RectF(); // only allocate once 

    public void rotate(int rotateAngle) { 

     if (rotateAngle % 90 != 0) { 
      throw new IllegalArgumentException("angle must be a multiple of 90 degrees"); 
     } 

     Matrix matrix = getImageMatrix(); 

     // get the original dimensions of the drawable 
     rect.set(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 

     // calculate where the current matrix has put the image 
     matrix.mapRect(rect); // rect now has updated coordinates 

     // rotate pivoting on the center point 
     matrix.postRotate(rotateAngle, rect.centerX(), rect.centerY()); 
     setImageMatrix(matrix); // i think setImageMatrix() will call invalidate() itself 
    } 
+0

Thnxクリスラーソン私の角度を解決するための天使のように表示するため):.. ..! –

1

を見てくださいおよびty値。行列は既に何が行われたかを「覚えています」ので、postRotate/postTranslate/post *関数を使用している場合は必要ありません。この代わりのようなものを試してみてください:

Matrix matrix = getImageMatrix(); 
float rotateAngle = 90.0; // or whatever 

//calculate the actual width and height of image 
float width = drawable.getIntrinsicWidth(); 
float height = drawable.getIntrinsicHeight(); 

//calculate the center pivot for rotation 
float cx = (width/2); 
float cy = (height/2); 

//Applying Rotation from center pivot 
matrix.postTranslate(-cx , -cy); 
matrix.postRotate(rotateAngle); 
matrix.postTranslate(cx, cy); 
setImageMatrix(matrix); 

invalidate(); 

が、私はそれがあなたのために、中心から約90度の回転をやると信じています。

+0

これを参照していただきありがとうございます..!それは中心から回転できません。 –

+0

私の完全なコードをチェックして、私が言っていることを理解することができます..! –

関連する問題