Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите повернуть QGraphicsItem на курсор мыши.  (Прочитано 3918 раз)
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);
« Последнее редактирование: Ноябрь 25, 2009, 13:20 от notnext » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 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;
Записан
notnext
Гость
« Ответ #2 : Ноябрь 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);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Ноябрь 25, 2009, 17:46 »

Вот работающий код позволяющий поворачивать QGraphicsItem на курсор мыши:
Может и работающий но выглядит как черновой Улыбающийся Застрелите разбор всех этих плюсов/минусов, при работе с геометрией они никогда ничего не дают. Угол всегда обрабатывается как float которое может быть положительным и отрицательным, может быть больше 2 * PI
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 22.