2015-01-22 2 views
0

슬라이더를 사용하여 사각형을 회전하려고합니다.

슬라이더의 값은 -100에서 +100까지입니다. 이 사각형을 회전하는 데 사용하고 싶습니다.
사각형의 모서리를 계산 한 다음 행렬을 어지럽히는 등 몇 가지 시도를 했으므로 실패했습니다. (매트릭스를 사용하는 것이 더 낫다)

더 쉬운 해결책은 직사각형의 변에만 작업하는 대신 처음부터 고정 점을 정의하는 것이다.

아래 코드에서 슬라이더를 사용하여 사각형의 크기를 조정할 수 있습니다. 사각형 회전



enter image description here

도움 모든 형태의

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 

    a = 230; //positioning 
    b = 150; //positioning 
    c = 200; //size of drawing 
    d = 150; //size of drawing 

    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(update())); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

void Dialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    painter.fillRect(a - ui->horizontalSlider->value(), 
        b - ui->horizontalSlider->value(), 
        c + ui->horizontalSlider->value() * 2, 
        d + ui->horizontalSlider->value() * 2, Qt::green); 

} 

이 많이 감사합니다. 회전 포인트를 얻으려면

R = [ cos(t), -sin(t); 
     sin(t), cos(t)] 

: 첫째로 여기

+0

회전 행렬에 대해 조금 읽고 좌표를 변환하는 방법을 참조하십시오. http://en.wikipedia.org/wiki/Rotation_matrix Qt를 모르지만, 모서리를 변형 한 다음 직사각형을 다시 그려야합니다. – vsoftco

+0

정확하게 문제입니다. Qt에서 회전 행렬을 올바르게 구현하지 못했습니다. –

답변

0

내가 "painter.drawLine이 (AX, AY,에 의해 BX)은"사용하여 해결 사각형을 그립니다. 그 후 나는 각 행에 대해 다음 공식을 사용 :이 사람을 도움이 될 것입니다

double ax = MidPointWidth + (-(Size + minWidth)) * cos(Angle) - (Size + minHeight) * sin(Angle); 
double ay = MidPointHeight + (-(Size + minWidth)) * sin(Angle) + (Size + minHeight) * cos(Angle); 



희망을.

1

는 라디안 톤에 의해 주어진 각도만큼 Z 축을 중심으로 XY 공간의 어느 지점을 (이 당신을 향) 회전합니다 회전 행렬 XY 평면상의 특정 점을 중심으로 회전해야합니다. 나는 그 중심을 중심으로 rect를 회전시키고 자한다고 가정한다.

C 중심 화소 좌표 지니

c = [cx; 
    cy] 

회전 된 포인트는 다음이다 :

P
P = R*(p-c) + c 

이 회전 지점과 P가있다 회전 할 직사각형 점은 모두 [2x1] 벡터이며 c과 같습니다. Matrix 대수를 사용하고 있으므로 곱셈은 스칼라 곱셈이 아닌 행렬 곱셈입니다. 다음 문제는 직사각형을 그립니다. Qt rect drawing에 익숙하지 않지만 문서에서 fillRect로 원하는 작업을 수행 할 수 없습니다. 직사각형이 회전하지 않는다고 가정하기 때문에 작동하지 않습니다. drawPolygon을 사용하면 회전 된 좌표가있을 때 원하는 것을 할 수 있습니다.

2

당신은 화가를 이동하고 그것을 달성하기 위해 캔버스를 회전 할 수 있습니다

void Dialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    painter.save(); 
    painter.translate(a, b);//Move pen. 
    painter.rotate(30);//rotate canvas. 
    painter.fillRect(-ui->horizontalSlider->value(), 
        -ui->horizontalSlider->value(), 
        c + ui->horizontalSlider->value() * 2, 
        d + ui->horizontalSlider->value() * 2, Qt::green); 
    painter.restore(); 
} 
+0

아날로그 시계 Qt 예제 응용 프로그램을 확인할 수 있습니다. 회전을 사용하여 시계면을 그립니다. –

+0

회전 매트릭스와 같은 수학적 접근법을 사용하여 동일한 효과를 만들고 싶지만이 방법을 이용해 주셔서 감사합니다. –

관련 문제