Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Lunex.08 от Июнь 06, 2011, 09:19



Название: Поворот QGraphicsItemGroup.
Отправлено: Lunex.08 от Июнь 06, 2011, 09:19
День добрый.
Проблема в следующем: при каждом вызове одного слота, мне нужно создавать группу QGraphicsItemGroup из разных итемов и сделать поворот(на 90 град.) относительно начала системы координат группы. Причем у итемов может быть разное положение в сцене, но они касаются друг друга. Пробовал разные варианты - все равно поворот идет относительно сцены, точки 0,0.
Набросочек:
Код:
void View::rotate()
{
    QGraphicsItemGroup *group = new QGraphicsItemGroup;

    group->setPos(figure_one->pos().x(), figure_one->pos().y());

    group = scene->createItemGroup(scene->items(group->mapToItem(group, group->pos().x()-20, group->pos().y()-20, 100, 80)));
 
    group->setRotation(90);
    scene->destroyItemGroup(group);
}
Это, тксказать, место толчка. Пробовал разные преобразования систем координат у итемов, группы, но все бес толку. Что делать?


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: twp от Июнь 06, 2011, 13:03
может поможет void QGraphicsItem::setTransformOriginPoint ( const QPointF & origin )


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: Igors от Июнь 06, 2011, 14:28
Не проверял, но по смыслу должно быть
Код
C++ (Qt)
void Rotate( QGraphicsItem & item, qreal angle_degree, const QPointF & center )
{
QTransform t1, t2, t3;
t1.translate(-center.x(), -center.y());
t2.rotate(angle_degree);
t3.translate(center.x(), center.y());
item.setTransform(t1 * t2 * t3);
}
 


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: Lunex.08 от Июнь 08, 2011, 10:53
Хм. Идея меня в обоих случаях устраивает. Но реализацию сделать не могу.
К примеру:
Код:
void View::Rotate()
{
   QGraphicsItemGroup *group = new QGraphicsItemGroup;
   //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
   group->setTransformOriginPoint(figure_one->pos().x(), figure_one->pos().y());
   group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
   group->rotate(90);
   scene->destroyItemGroup(group);
}

И я вроде понимаю где ошибка: у итемов в группе значения x и y имеют прежние большие величины, т.е. координаты сцены. Если я правильно понял, как это исправить?


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: Zartul от Июнь 08, 2011, 16:59
попробуйте использовать ф-ю трансформации для поворота относительно заданой точки

в ассистенте вроде так пишут:
Цитировать
 // Поворачивает элемент на 45 градусов вокруг (x, y).
 item->setTransform( QTransform().translate( x, y ).rotate( 45 ).translate( -x, -y ) );

Код
C++ (Qt)
  QGraphicsItemGroup *group = new QGraphicsItemGroup;
  //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
  group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
  group->setTransform( QTransform().translate( figure_one->pos().x(), figure_one->pos().y() ).rotate( 90).translate( -x, -y ) );
  scene->destroyItemGroup(group);

или посмотрите относительно каких координат поворачиваете, может точку надо перемапить с координат сцены в координаты итема...


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: Lunex.08 от Июнь 09, 2011, 17:31
попробуйте использовать ф-ю трансформации для поворота относительно заданой точки

в ассистенте вроде так пишут:
Цитировать
  // Поворачивает элемент на 45 градусов вокруг (x, y).
 item->setTransform( QTransform().translate( x, y ).rotate( 45 ).translate( -x, -y ) );

Код
C++ (Qt)
  QGraphicsItemGroup *group = new QGraphicsItemGroup;
  //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
  group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
  group->setTransform( QTransform().translate( figure_one->pos().x(), figure_one->pos().y() ).rotate( 90).translate( -x, -y ) );
  scene->destroyItemGroup(group);

или посмотрите относительно каких координат поворачиваете, может точку надо перемапить с координат сцены в координаты итема...
Товарищ, от всей души благодарю! Верите\нет, я за час до вашего сообщения этот пример просмотрел, скопировал его. И не работал. А не фурычило потому, что не до конца строку с кодом выделил. И часть обрезал. Поэтому и поворот шел лишь с одной стороны, все время смещая фигуру по оси y. А щас все тип-топ. Еще раз благодарю! ;)

Не проверял, но по смыслу должно быть
Код
C++ (Qt)
void Rotate( QGraphicsItem & item, qreal angle_degree, const QPointF & center )
{
QTransform t1, t2, t3;
t1.translate(-center.x(), -center.y());
t2.rotate(angle_degree);
t3.translate(center.x(), center.y());
item.setTransform(t1 * t2 * t3);
}
 

Идея та же самая, только поворот идет против часовой стрелки.  И вам спасибо за помощь!


Название: Re: Поворот QGraphicsItemGroup.
Отправлено: Igors от Июнь 09, 2011, 18:22
Идея та же самая, только поворот идет против часовой стрелки. 
Так это нормально/общепринято, положительный угол поворота поворачивает против часовой стрелки ("правая" система координат). Так в <math.h> и везде