2017-11-26 34 views
0

私は画像変換に取り組んでいます.x原点とy原点から同時に画像を拡大縮小して回転したいと思います。別のScale、Rotateを使用しようとしましたが、同時に動作します。ここに私のコードQT QMatrix4x4行列の原点xとyを持つ回転と回転

function setRotation(rotation){ 
    rt.origin.x=imagQuickitem.anchorPoint.x; 
    rt.origin.y=imagQuickitem.anchorPoint.y; 
    rt.angle=rotation 
    image.transform=rt; 
    image.transform=sc; 
} 

function setScale(scale){ 
    sc.origin.x=imagQuickitem.anchorPoint.x; 
    sc.origin.y=imagQuickitem.anchorPoint.y; 
    sc.xScale=scale; 
    sc.yScale=scale; 
    image.transform=sc; 
} 

Scale { id:sc; } 
Rotation { id:rt; } 

まあがある、はず、私がQMatrix4x4を使用しようと、このリンク Qt Transform matrix を発見し、解決策がQMatrix4x4あるようだが、私は、スケールと回転の両方のために働くために行列を作成する方法はわかりません私は回転行列を持つ複数のスケール行列?

+0

こんにちは。あなたのコードは完全ではありません。回転させたいオブジェクト(例:単純な「長方形」)と、回転と拡大縮小をどのように適用するか、それらの関数をどのように呼び出すかはわかりません。さらに、期待される結果を簡単に説明することはすばらしく、ソリューションを投稿する前に検証することができます。 – derM

+0

あなたのコメントに関して、 '回転行列を使って複数のスケール行列を使うべきですか? ':一般に好奇心は大きいです。何かを破壊したり害を与えたりしない限り、試してみてください! https://en.wikipedia.org/wiki/Transformation_matrix#Composing_and_inverting_transformations – derM

答えて

3

これまで考えていた2つの解決策があります。解決策1:RotationとScaleを組み合わせます。解法2:変換行列を明示的に計算する。次のコードスニペットをご覧ください。

Image { 
    id: img 
    source: "Lenna.png" 
    property real rotD: 45 // angle (degrees) 
    property real rotR: rotD * Math.PI/180 // angle (radians) 
    property real scale: 2 // scaling value 
    property real x0: 264 // origin.x 
    property real y0: 264 // origin.y 
    // solution 1: combine 2 transforms 
    transform: [ 
     Rotation{origin.x: img.x0; origin.y: img.y0; angle: img.rotD; }, 
     Scale{origin.x: img.x0; origin.y: img.y0; xScale: img.scale; yScale: img.scale} 
    ] 
    // solution 2: do the math to calculate the matrix 
// transform: Matrix4x4 { 
// matrix: Qt.matrix4x4(
//  img.scale*Math.cos(img.rotR), -img.scale*Math.sin(img.rotR), 0, -img.scale*Math.cos(img.rotR)*img.x0 + img.scale*Math.sin(img.rotR)*img.y0 + img.x0, 
//  img.scale*Math.sin(img.rotR), img.scale*Math.cos(img.rotR), 0, -img.scale*Math.sin(img.rotR)*img.x0 - img.scale*Math.cos(img.rotR)*img.y0 + img.y0, 
//  0, 0, 1, 0, 
//  0, 0, 0, 1) 
// } 
} 
+0

ありがとう、最初の方法がうまくいった –