2013-06-24 1 views
4

1. 목표Qt에서 회전 된 타원을 렌더링하려는 시도가 잘못되었습니다.

내 동료와 나는 Qt는 회전 타원체를 렌더링하기 위해 노력 해왔다. 전형적인 솔루션 접근 방식은 우리가 그것을 이해, 좌표계의 원점에 타원체의 중심 이동이 회전을하고, 다시 이동으로 구성 http://qt-project.org/doc/qt-4.8/qml-rotation.html

2. 샘플 코드

은 위의 링크에 설명 된 솔루션을 바탕으로, 우리는 다음과 같은 샘플 코드를 내놓았다 : 당신이 볼 수 있듯이, 우리는 하드 회전 각도를 코딩 한

// Constructs and destructors 
RIEllipse(QRect rect, RIShape* parent, bool isFilled = false) 
: RIShape(parent, isFilled), _rect(rect), _angle(30) 
{} 

// Main functionality 
virtual Status draw(QPainter& painter) 
{ 
    const QPen& prevPen = painter.pen(); 
    painter.setPen(getContColor()); 
    const QBrush& prevBrush = painter.brush(); 
    painter.setBrush(getFillBrush(Qt::SolidPattern)); 

    // Get rectangle center 
    QPoint center = _rect.center(); 

    // Center the ellipse at the origin (0,0) 
    painter.translate(-center.x(), -center.y()); 
    // Rotate the ellipse around its center 
    painter.rotate(_angle); 
    // Move the rotated ellipse back to its initial location 
    painter.translate(center.x(), center.y()); 

    // Draw the ellipse rotated around its center 
    painter.drawEllipse(_rect); 

    painter.setBrush(prevBrush); 
    painter.setPen(prevPen); 
    return IL_SUCCESS; 
} 

30도이 테스트 샘플.

3. 관찰

타원은 자주 캔버스 영역 이외의 잘못된 위치에 나올.

4. 질문

위의 샘플 코드에 대한 문제가 있습니까?

안부,

발더스

P.S. 건설적인 반응에 미리 감사드립니다.

P.P.S. 이 메시지를 게시하기 전에 우리는 stackoverflow.com에서 많은 내용을 검색했습니다. Qt image move/rotation은 위의 링크와 비슷한 솔루션 접근 방식을 반영한 것으로 보입니다.

+1

'translate' 함수는 여러분이 생각하는 것과는 반대로 작용한다고 생각합니다.전달할 값을 무시해보십시오. – paddy

+0

감사합니다. @paddy! – user2514673

답변

0

painter.translate(center.x(), center.y());에서 결과는 (2*center.x(), 2*center.y())이되는 현재 좌표로 개체를 이동합니다.

painter.translate(- center.x(), - center.y()); 
+0

고맙습니다. @fatih_k! – user2514673

0

개체를 원점으로 이동하고 개체의 위치를 ​​바꾸고 교체하는 이론이 올바른 것입니다. 그러나 제시 한 코드는 오브젝트를 변환 및 회전하는 것이 아니라 화가를 번역 및 회전하는 것입니다. 예를 들어, referred to이라는 질문에서 그들은 이미지에 대한 전체 이미지를 회전시키고 싶어합니다. 회전하기 전에 화가를 객체의 중심으로 이동시키는 이유입니다.

GraphicsItem에 대한 회전을 수행하는 가장 쉬운 방법은 처음에는 객체의 가운데 왼쪽에있는 중심을 기준으로 항목을 정의하는 것입니다. 이렇게하면 개체를 번역 할 필요없이 모든 회전이 자동으로 개체 중심에 적용됩니다.

이렇게하려면 x, y, 너비, 높이가 (-width/2, -height/2, width, height) 인 경계 사각형을 사용하여 항목을 정의하십시오.

또는 항목이 QGraphicsItem 또는 QGraphicsObject에서 상속되었다고 가정하면 모든 회전 전에 setTransformOriginPoint 함수를 사용할 수 있습니다.

+0

고마워, @ Merlin069! – user2514673

+0

아무런 문제가 없지만 어떻게 지내는지 알려주세요. 또한 성능을 위해 페인트 기능에서 렌더링 이외의 작업을 수행하지 않아야합니다. 물론, 전체 이미지를 실제로 회전하고 싶다면, 거기에서해야합니다. 그러면 화가 객체를 얻을 수 있습니다. – TheDarkKnight