Results 1 to 3 of 3

Thread: Rotation Problem

  1. #1
    Join Date
    Sep 2009
    Posts
    26
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11

    Default Rotation Problem

    Hi,

    I have one shape Rectangle which can be re-sized from 8 corners (eg top left ,mid left, bottom left etc)for resizing i have made small rectangles as resizing handles.For rotating this rectangle there is one line arrow handle which originates from Mid left of Rectangle.The user can put his mouse cursor on the rotation arrow handle and rotate the shape.

    My problem is that i want to get untransformed shape of this arrow handle irrespective of scale factor i am using.At first when i create this rectangle with arrow its okie ..but when i rotate the rectangle the arrow handle changes the shape which should not happen.


    QRectF CRectangle::getUntransformedRect(QPainter *painter, QRectF rect)
    {
    if (!painter->transform().isScaling()/* || scaleFactor < 1*/)
    return rect;

    QTransform transform = painter->transform();
    QRectF transFormedRect = transform.mapRect(rect);
    float scaleFactor = transFormedRect.width() / rect.width();

    QRectF destRect = rect;
    destRect.setWidth(rect.width() / scaleFactor);
    destRect.setHeight(rect.height() / scaleFactor);
    destRect.moveCenter(rect.center());
    return destRect;
    }

    void CRectangle::updateAngleHandle()
    {
    if(m_ShowRotation)
    {
    m_RotateLine.setP1(m_Handles[7].center());
    float size = m_ActualRectangle.width();
    m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    QPointF point = m_RotateLine.p2();

    QPointF destArrowP1 = point;
    destArrowP1.setY(point.y() + 8.0);
    destArrowP1.setX(point.x() - 8.0);
    QPointF destArrowP2 = destArrowP1;
    destArrowP2.setY(point.y() - 8);

    int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    m_AngleHandle.setPoints(3, points);
    }
    }


    void CRectangle::drawShape(QPainter *painter)
    {
    if(!m_ActualRectangle.isEmpty() && m_Show)
    {
    painter->setPen(m_DrawingPen);
    painter->setBrush(QColor(0, 0, 0, 0));
    painter->save();
    //painter->setTransform(m_transform);
    QTransform transform = painter->transform();
    QPointF centerPoint = m_transform.map(m_ActualRectangle.center());
    transform.translate(centerPoint.x(), centerPoint.y());
    transform.rotate(-m_Angle);
    transform.translate(-centerPoint.x(), -centerPoint.y());
    painter->setTransform(transform);
    painter->drawRect(m_ActualRectangle);

    if(m_NeedCenterCross)
    {
    painter->drawLines(m_CenterCrossLine);
    }
    if(m_ShowHandles && m_Enable)
    {
    //drawing resizable handles

    painter->setPen(QColor(255, 255, 255));
    painter->setBrush(Qt::black);

    Q_FOREACH( QRectF rect , m_Handles) /// This is for drawing resizable handles
    {
    QRectF notTransformedRect = getUntransformedRect(painter, rect);
    painter->drawRect(notTransformedRect);
    }

    //painter->restore();


    //painter->drawText(m_Handles[i].topLeft(), QString::number(i));

    if(m_ShowRotation) // For Arrow Handle
    {
    m_RotateLine.setP1(m_Handles[7].center());
    float size = m_ActualRectangle.width();
    m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    QPointF point = m_RotateLine.p2();

    QPointF destArrowP1 = point;
    destArrowP1.setY(point.y() + 8.0);
    destArrowP1.setX(point.x() - 8.0);
    QPointF destArrowP2 = destArrowP1;
    destArrowP2.setY(point.y() - 8);

    QRectF angleRect(destArrowP2, QSizeF(point.x() - destArrowP2.x(), destArrowP1.y() - destArrowP2.y()));
    QRectF angleRectUnScaled = getUntransformedRect(painter, angleRect);

    point.setX(angleRectUnScaled.topRight().x());
    point.setY(angleRectUnScaled.center().y());

    destArrowP1 = angleRectUnScaled.bottomLeft();
    destArrowP2 = angleRectUnScaled.topLeft();

    int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    m_AngleHandle.setPoints(3, points);

    QPen pen;
    pen.setColor(m_DrawingPen.color());
    painter->setPen(pen);
    painter->setBrush(Qt::black);
    painter->drawLine(m_RotateLine);
    painter->drawPolygon(m_AngleHandle);
    }
    }
    else
    {
    painter->restore();
    }
    painter->restore();

    if(m_Failed)
    {
    painter->setPen(QColor(Qt::red));
    painter->drawLine(m_transform.map(m_Handles[0].topLeft()), m_transform.map(m_Handles[4].topLeft()));
    painter->drawLine(m_transform.map(m_Handles[2].topLeft()), m_transform.map(m_Handles[6].topLeft()));
    }



    Can you please help me out what is the exact problem? Why the Arrow Head is changing the shape during rotation.

  2. #2
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Rotation Problem

    Can you disclose you code snippet in CODE tags? It's really hard to read it.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  3. #3
    Join Date
    Sep 2009
    Posts
    26
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11

    Default Re: Rotation Problem

    Qt Code:
    1. QRectF CRectangle::getUntransformedRect(QPainter *painter, QRectF rect)
    2. {
    3. if (!painter->transform().isScaling()/* || scaleFactor < 1*/)
    4. return rect;
    5.  
    6. QTransform transform = painter->transform();
    7. QRectF transFormedRect = transform.mapRect(rect);
    8. float scaleFactor = transFormedRect.width() / rect.width();
    9.  
    10. QRectF destRect = rect;
    11. destRect.setWidth(rect.width() / scaleFactor);
    12. destRect.setHeight(rect.height() / scaleFactor);
    13. destRect.moveCenter(rect.center());
    14. return destRect;
    15. }
    16.  
    17. void CRectangle::updateAngleHandle()
    18. {
    19. if(m_ShowRotation)
    20. {
    21. m_RotateLine.setP1(m_Handles[7].center());
    22. float size = m_ActualRectangle.width();
    23. m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    24. QPointF point = m_RotateLine.p2();
    25.  
    26. QPointF destArrowP1 = point;
    27. destArrowP1.setY(point.y() + 8.0);
    28. destArrowP1.setX(point.x() - 8.0);
    29. QPointF destArrowP2 = destArrowP1;
    30. destArrowP2.setY(point.y() - 8);
    31.  
    32. int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    33. m_AngleHandle.setPoints(3, points);
    34. }
    35. }
    36.  
    37.  
    38. void CRectangle::drawShape(QPainter *painter)
    39. {
    40. if(!m_ActualRectangle.isEmpty() && m_Show)
    41. {
    42. painter->setPen(m_DrawingPen);
    43. painter->setBrush(QColor(0, 0, 0, 0));
    44. painter->save();
    45. //painter->setTransform(m_transform);
    46. QTransform transform = painter->transform();
    47. QPointF centerPoint = m_transform.map(m_ActualRectangle.center());
    48. transform.translate(centerPoint.x(), centerPoint.y());
    49. transform.rotate(-m_Angle);
    50. transform.translate(-centerPoint.x(), -centerPoint.y());
    51. painter->setTransform(transform);
    52. painter->drawRect(m_ActualRectangle);
    53.  
    54. if(m_NeedCenterCross)
    55. {
    56. painter->drawLines(m_CenterCrossLine);
    57. }
    58. if(m_ShowHandles && m_Enable)
    59. {
    60. //drawing resizable handles
    61.  
    62. painter->setPen(QColor(255, 255, 255));
    63. painter->setBrush(Qt::black);
    64.  
    65. Q_FOREACH( QRectF rect , m_Handles) /// This is for drawing resizable handles
    66. {
    67. QRectF notTransformedRect = getUntransformedRect(painter, rect);
    68. painter->drawRect(notTransformedRect);
    69. }
    70.  
    71. //painter->restore();
    72.  
    73.  
    74. //painter->drawText(m_Handles[i].topLeft(), QString::number(i));
    75.  
    76. if(m_ShowRotation) // For Arrow Handle
    77. {
    78. m_RotateLine.setP1(m_Handles[7].center());
    79. float size = m_ActualRectangle.width();
    80. m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    81. QPointF point = m_RotateLine.p2();
    82.  
    83. QPointF destArrowP1 = point;
    84. destArrowP1.setY(point.y() + 8.0);
    85. destArrowP1.setX(point.x() - 8.0);
    86. QPointF destArrowP2 = destArrowP1;
    87. destArrowP2.setY(point.y() - 8);
    88.  
    89. QRectF angleRect(destArrowP2, QSizeF(point.x() - destArrowP2.x(), destArrowP1.y() - destArrowP2.y()));
    90. QRectF angleRectUnScaled = getUntransformedRect(painter, angleRect);
    91.  
    92. point.setX(angleRectUnScaled.topRight().x());
    93. point.setY(angleRectUnScaled.center().y());
    94.  
    95. destArrowP1 = angleRectUnScaled.bottomLeft();
    96. destArrowP2 = angleRectUnScaled.topLeft();
    97.  
    98. int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    99. m_AngleHandle.setPoints(3, points);
    100.  
    101. QPen pen;
    102. pen.setColor(m_DrawingPen.color());
    103. painter->setPen(pen);
    104. painter->setBrush(Qt::black);
    105. painter->drawLine(m_RotateLine);
    106. painter->drawPolygon(m_AngleHandle);
    107. }
    108. }
    109. else
    110. {
    111. painter->restore();
    112. }
    113. painter->restore();
    114.  
    115. if(m_Failed)
    116. {
    117. painter->setPen(QColor(Qt::red));
    118. painter->drawLine(m_transform.map(m_Handles[0].topLeft()), m_transform.map(m_Handles[4].topLeft()));
    119. painter->drawLine(m_transform.map(m_Handles[2].topLeft()), m_transform.map(m_Handles[6].topLeft()));
    120. }
    To copy to clipboard, switch view to plain text mode 

Similar Threads

  1. 3d rotation transformation
    By feverzsj in forum Qt Programming
    Replies: 0
    Last Post: 24th November 2010, 02:44
  2. Problem with rotation of QGraphicsItem
    By ashishsaryar in forum Qt Programming
    Replies: 2
    Last Post: 10th July 2008, 15:03
  3. Rotation on Qframe
    By Pharell in forum Qt Programming
    Replies: 11
    Last Post: 2nd April 2008, 16:31
  4. Rotation problem trying to draw a compass widget
    By yellowmat in forum Qt Programming
    Replies: 2
    Last Post: 18th February 2007, 19:03
  5. Rotation problem
    By boss_bhat in forum Qt Programming
    Replies: 5
    Last Post: 17th January 2007, 16:46

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.