2014-10-04 4 views
1

Я рисую эллипс, используя QPainterPath, используя три мыши. Основная и малая оси эллипса остаются параллельными главной координатной оси.Установить ориентацию эллипса в Qt

Первый щелчок определяет центр эллипса. Позиция второго клика используется для вычисления длины большой оси, а для третьего - используется для определения длины вспомогательной оси.

Независимо от положения щелчков эллипс имеет ось, параллельную главной оси. Как настроить ориентацию эллипса в соответствии с положением мыши?

Я вычислил угол линии, соединяющей первую точку и вторую точку, как:

theta = atan2((p2.y()-p1.y()),(p2.x()-p1.x())) * (180/M_PI); 

Мой ограничительный прямоугольник выглядит следующим образом:

QRectF MyEllipse::boundingRect() const 
{ 
    return QRectF(p1.x()-majRadius, p1.y()-minRadius, 2 * majRadius, 2 * minRadius).normalized(); 

}

Тогда я пишу его с помощью :

QPainterPath ellipse; 
ellipse.moveTo(p2.x()*cos(theta),p2.y()*sin(theta)); 
ellipse.arcTo(boundingRect(), theta, theta+360); 

QPen paintpen(Qt::black); 
paintpen.setWidth(1); 
painter->setRenderHint(QPainter::Antialiasing); 
painter->setPen(paintpen); 
painter->drawPath(ellipse); 

Как получить эллипс правильно ориентированным в соответствии с тремя точками?

+0

Я был способный достичь правильной ориентации, используя перевод и поворот осей координат, а затем снова перевод. Поэтому я отмечаю это как решение. –

+0

Несомненно, я опубликовал его. –

ответ

2

Я решил эту проблему с помощью перевода и операции вращения в моей paint функции как:

painter->save(); 
painter->translate(p1.x(), p1.y()); 
painter->rotate(theta); 
painter->translate(-p1.x(), -p1.y()); 
painter->drawPath(ellipse); 
painter->restore(); 

Это устанавливает форму эллипса в соответствии с щелчками.

Вращение вокруг угла тета делается, который вычисляется как:

theta = atan2((p2.y()-p1.y()),(p2.x()-p1.x())) * (180/M_PI); 

, если расстояние между p2 и p1> расстояние между р3 и р1 иначе оно рассчитывается как:

theta = atan2((p3.y()-p1.y()),(p3.x()-p1.x())) * (180/M_PI); 
Смежные вопросы