Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: notnext от Ноябрь 25, 2009, 13:17



Название: Помогите повернуть QGraphicsItem на курсор мыши.
Отправлено: notnext от Ноябрь 25, 2009, 13:17
Помогите повернуть QGraphicsItem на курсор мыши.

Есть QGraphicsScene (-200, -200, 400, 400) c одним QGraphicsItem который произвольно перемещается по сцене.

Я так понимаю мне необходимо посчитать угол между прямыми для разворота QGraphicsItem.

А вот формулу для расчета угла подобрать я так и не смог. ???

Сделал только в полярной системе координат разворот обьекта если он находится в (0,0), а надо чтоб в любом месте сцены!
Вот код:

Код
C++ (Qt)
   qreal x = ePoint.x(); // cursor pos X
   qreal y = ePoint.y(); // cursor pos Y
   qreal angel;
   qreal p = sqrt((x*x)+(y*y));
//    qreal p = sqrt(pow(x,2)+pow(y,2));
   qreal a = 57.295779513 * atan(y/x);
   qreal b = 57.295779513 * asin(y/p);
   if(a > 0 && b > 0){
       angel = a;
   }else if(a > 0 && b < 0){
       angel = 180 + a;
   }else if(a < 0 && b > 0){
       angel = 180 - b;
   }else if(a < 0 && b < 0){
       angel = 360 + a;
   }
   angel += 90;
 
//    qDebug()<<"a: "<<a;
//    qDebug()<<"b: "<<b;
   qDebug()<<"angel: "<<angel;
   item->setRotation(angel);


Название: Re: Помогите повернуть QGraphicsItem на курсор мыши.
Отправлено: Igors от Ноябрь 25, 2009, 15:53
А вот формулу для расчета угла подобрать я так и не смог. ???
Ф-ция atan2 возвращает (в радианах) угол поворота относительно оси X. Положительные значения соответствуют вращению против часовой стрелки. Если есть 2 точки (x0, y0) и (x1, y1). то

Код:
#include <math.h>

float angle_radian = atan2(y1 - y0, x1 - x0);
float angle_degree = angle_radian * 180 / PI;


Название: Re: Помогите повернуть QGraphicsItem на курсор мыши.
Отправлено: notnext от Ноябрь 25, 2009, 16:35
Допилил! :)

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

Код
C++ (Qt)
   QPointF srcPos = item->scenePos();
   QPointF dstPos = ePoint;
 
   qreal angle_radian = atan2(dstPos.y() - srcPos.y(), dstPos.x() - srcPos.x());
   qreal angle_degree = (angle_radian * 180 / Pi);
 
   if(dstPos.x() < srcPos.x() && dstPos.y() < srcPos.y()){
//        qDebug()<<"0";
   }else if(dstPos.x() > srcPos.x() && dstPos.y() < srcPos.y()){
//        qDebug()<<"1";
   }else if(dstPos.x() > srcPos.x() && dstPos.y() > srcPos.y()){
//        qDebug()<<"2";
       angle_degree = 360 + angle_degree;
   }else if(dstPos.x() < srcPos.x() && dstPos.y() > srcPos.y()){
//        qDebug()<<"3";
       angle_degree = 360 + angle_degree;
   }
//    qDebug()<<"angle_degree: "<<angle_degree;
   item->setRotation(angle_degree+90);


Название: Re: Помогите повернуть QGraphicsItem на курсор мыши.
Отправлено: Igors от Ноябрь 25, 2009, 17:46
Вот работающий код позволяющий поворачивать QGraphicsItem на курсор мыши:
Может и работающий но выглядит как черновой :) Застрелите разбор всех этих плюсов/минусов, при работе с геометрией они никогда ничего не дают. Угол всегда обрабатывается как float которое может быть положительным и отрицательным, может быть больше 2 * PI