2

こんばんは。

setRotation -method を使用してキャンバス上の線を回転させようとしていますが、同じキャンバスに別の形状を描画しない限り、完全に機能します。Canvas の concat メソッドを使用した後、キャンバス全体が、たとえば反時計回り/時計回りに 30 度回転します。そして、これが問題です。線だけを回転させたいのですが、このキャンバスまたはキャンバス全体で他の図形を回転させたくありません。ビットマップはマトリックスで描画できることがわかりましたが、面倒でぎこちなく見えます。また、キャンバスに新しいマトリックスを設定するという提案がありましたが、実際、この提案はどちらも機能しません。

質問は簡単に聞こえますが、OpenGl を使用せずにキャンバス上の 1 つの図形だけを回転させ、キャンバス上の他の図形に影響を与えることはできないでしょうか?

事前にご回答いただきありがとうございます。

コメントやその他のものを含むコードは次のとおりです。

@Override
public void onDraw(Canvas canvas)
{
    int startX, startY, stopX, stopY;
    startY = stopY = 100;
    startX = 100;
    stopX = 200;
    this.paint = new Paint();
    //this.path = new Path();
    this.matrix = canvas.getMatrix();
    this.paint.setColor(Color.BLUE);
    this.paint.setStrokeWidth(4);

    this.matrix.setRotate(180, startX, startY);
    canvas.concat(this.matrix);
    /*this.matrix.setTranslate(startX, 0);
    canvas.concat(this.matrix);*/

    canvas.drawLine(startX, startY, stopX, stopY, this.paint);

    canvas.setMatrix(new Matrix());
    //canvas.drawCircle(200, 200, 50, paint);
}
4

2 に答える 2

3

Canvas.save()あなたはこれを試すことができCanvas.restore()ます。彼らはおそらく現在のマトリックスをスタックに入れ、変更されたマトリックスで完了したら前のマトリックスに戻ることができます。

this.matrix.setRotate(180, startX, startY);
canvas.save();
canvas.concat(this.matrix);
canvas.drawLine(startX, startY, stopX, stopY, this.paint);
canvas.restore();
于 2012-09-12T16:52:22.293 に答える
1

Mozoboy は、線形代数を使用するというアイデアを提案しました。以下は、線形代数を使用し、Android API のスコープ内にとどまっている onDraw(Canvas canvas) メソッドの新しいコードです。

    Matrix m = new Matrix();       //Declaring a new matrix
    float[] vecs = {7, 3};    //Declaring an end-point of the line

   /*Declaring the initial values of the matrix 
     according to the theory of the 3 
     dimensional chicken in 2D space 
    There is also 4D chicken in 3D space*/

    float[] initial = {1, 0, 0, 0, 1, 0, 0, 0, 1};    
    m.setValues(initial);   
    float[] tmp = new float[9];    //Debug array of floats
    m.setRotate(90, 4.0f, 3.0f);    //Rotating by 90 degrees around the (4, 3) point
/*Mapping our vector to the matrix. 
  Similar to the multiplication of two
  matrices 3x3 by 1x3. 
  In our case they are (matrix m after rotating) multiplied by      
  (7)
  (3)
  (1) according to the theory*/ 

  m.mapPoints(vecs);             

    for(float n : vecs)
    {
        Log.d("VECS", "" + n);     //Some debug info
    }

    m.getValues(tmp);
    for(float n : tmp)
    {
        Log.d("TMP", "" + n);      //also debug info
    }

このアルゴリズムの結果として、線の終点の新しい座標 (4, 6) が得られます。

于 2012-09-13T17:02:31.263 に答える