0

マトリックスを Canvas に連結していますが、後で canvas.getClipBounds() を実行して Canvas の現在のクリップを見つけられるようにしたいと考えています。ただし、canvas.getClipBounds() は (RectF ではなく) Rect を返します。その不正確さが問題を引き起こしていると思います。

したがって、私は独自の RectF を維持し、Canvas が変換されるときにそれを変換して、最終的には canvas.getClipBounds() によって返される値に似た値になるようにしますが、浮動小数点精度になります。

ただし、キャンバスのクリップに canvas.concat(Matrix) がどのように影響するかはわかりません。これは、連結を模倣しようとする試みがうまくいかないためです。以下は、値をコメントとして使用して、私が試しているコードです。temp RectFs の 1 つがm_Canvas.getClipBounds.toString()連結後の値と同様の値を持つことを期待しますが、私はそうではありません。助言がありますか?

 protected void processConcatMatrix(Matrix m)
     {
        //m.toString() == Matrix{[1103.398, -134.48357, 23.99026][174.76108, 849.0959, -159.39447][0.0, 0.0, 1.0]}
        //m_Canvas.getMatrix().toString() == Matrix{[1.0, 0.0, 0.0][0.0, -1.0, 706.0][0.0, 0.0, 1.0]}
        //m_Canvas.getClipBounds.toString() == Rect(0, 0 - 1024, 706)
        m_Canvas.concat(m);
         //m_Canvas.getClipBounds().toString() = Rect(0, 0 - 1, 1);
        //m_Canvas.getMatrix().toString == Matrix{[1103.398, -134.48357, 23.99026][-174.76108, -849.0959, 865.3945][0.0, 0.0, 1.0]}

        RectF temp = new RectF(0, 0 - 1024, 706);
        Matrix m1 = new Matrix(m);
        m1.mapRect(temp);
        //temp.toString() == RectF(-94921.41, -159.39447, 1129903.5, 778257.6)

        //not sure if I should use the parameter matrix, or the canvas matrix after concatentation.  let's try with both


        RectF temp2 = new RectF(0, 0 - 1024, 706);
        Matrix m2 = new Matrix(m_Canvas.getMatrix());
        m2.mapRect(temp2);
        //temp2.toString() == RectF(-94921.41, -777551.6, 1129903.5, 865.3945)

        //maybe I'm supposed to invert the matrices???

        RectF temp3 = new RectF(0, 0 - 1024, 706);
        Matrix m3 = new Matrix(m);
        m3.invert(m3);
        m3.mapRect(temp3);
        //temp3.toString() == RectF(0.0, 0.0, 1024.0, 706.0)

        //not sure if I should use the parameter matrix, or the canvas matrix after concatentation.  let's try with both

        RectF temp4 = new RectF(0, 0 - 1024, 706);
        Matrix m4 = new Matrix(m_Canvas.getMatrix());
        m4.invert(m4);
        m4.mapRect(temp4);
        //temp4.toString == RectF(0.0, 0.0, 1024.0, 706.0)


        //ok, none of these values resembled Rect(0, 0 - 1, 1).  Clearly I am doing something wrong...
  }
4

1 に答える 1