2014-03-12 134 views
-1

我試圖做一個事情,我圍繞任意點(通常在圖像本身的範圍內)旋轉圖像,但我想保留對應於未轉換圖像的點起源。圍繞一個任意點旋轉QPixmap

到目前爲止,我使用的是QTransform方法旋轉圖像:

的Qt代碼:

image.transformed(QTransform() 
          .translate(-point.x(), -point.y()) 
          .rotateRadians(rot) 
          .translate(point.x(), point.y())); 

這將返回是「旋轉」,圍繞點的圖像,但它繪製成爲一個新的圖像對象,其原點與變換後的圖像相對應,而不是原始圖像,因此對圖像進行繪製使其具有正確的角度,但會被轉換到某個位置。有沒有方法可以A]計算轉換圖像中原始原點的位置,或B]旋轉圖像而不改變其原點?

這裏的程序在實踐中:

沒有任何旋轉:

Without Rotation

隨着旋轉(圖像繪製新框的左上角爲原點,而不是圖像的預轉化原點):

With Rotation

回答

-1

好了,該SOLU我想出的是,爲了找到原始圖像和旋轉圖像的偏移量,我找到兩個圖像的中心點並計算出偏移量,然後將其與旋轉後的點一起用作繪製我的位置繪畫時的圖像。

QPixmap ImageBone::getTransformedImage(QPointF point, qreal rot, QPointF &origin, QPointF anchor = QPointF(0, 0)) 
{ 
    QPointF center = QPointF(image.width()/2, image.height()/2); 
    qreal dist = QLineF(anchor, center).length(); 
    qreal a = qAtan2(anchor.y() - center.y(), anchor.x() - center.x()); 
    QPointF rotAnchor(qCos(rot + a) * dist, qSin(rot + a) * dist); 
    rotAnchor += center; 

    QPixmap rotImage = image.transformed(QTransform() 
            .translate(-point.x(), -point.y()) 
            .rotateRadians(rot) 
            .translate(point.x(), point.y()) 
           ); 

    QPointF rotCenter = QPointF(rotImage.width()/2, rotImage.height()/2); 
    QPointF offset = rotCenter - center; 

    origin = point - (rotAnchor + offset); 

    return rotImage; 
}