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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Что у меня не так с трансформациями?  (Прочитано 13604 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Ноябрь 01, 2016, 01:04 »

См. выше. На айтеме лежит QWidget - это стрелка. Другого пути нет потому что так надо. Если я меняю местами вращение и масштабирование, айтем тоже искажается, но в другую сторону.
У QGraphicsView есть флаги renderHints,  с ними не игрались?

Мне лень 3 раз вставать к компьютеру, если не забуду, завтра посмотрю. У меня таких проблем не было.
« Последнее редактирование: Ноябрь 01, 2016, 01:05 от Old » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #16 : Ноябрь 01, 2016, 01:07 »

А при чём тут эти флаги? Я имею фокусы трансформации, а не рендеринга сцены. Я же сказал, если использовать прямой поворот и масштабирования айтема, всё почти как надо работает.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Ноябрь 01, 2016, 01:14 »

А при чём тут эти флаги? Я имею фокусы трансформации, а не рендеринга сцены. Я же сказал, если использовать прямой поворот и масштабирования айтема, всё почти как надо работает.
А вы можете прямоугольник нарисовать вокруг объекта, что лучше было видно искажение.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #18 : Ноябрь 01, 2016, 01:18 »

Ну уже не сейчас - выключил станцию, на которой сборка делается. Спать пора...

Но там и так видно - при повороте влево у описывающего прямоугольника высота уменьшается, а при повороте вправо увеличивается. Ширина одинаковая. Если отключить масштабирование, оставить только поворот, то есть вот так:

Код:
item->setTransform(QTransform().translate(rotationCenter.x(),rotationCenter.y()).
                       rotate(angle).translate(-rotationCenter.x(),-rotationCenter.y()));

- то крутит нормально, без искажения.

Сильно подозреваю, что там есть какой-то мегакосяк внутренний, из-за которого item->setScale() может менять только оба размера сразу...  В замешательстве
« Последнее редактирование: Ноябрь 01, 2016, 01:20 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #19 : Ноябрь 01, 2016, 01:35 »

Кручу два прямоугольника, вроде никаких искажений нет.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #20 : Ноябрь 01, 2016, 01:44 »

Если только крутить, то нет. Есть если крутить и масштабировать одновременно. Чтобы было заметнее, на айтем надо какую-нибудь картинку положить.
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Ноябрь 01, 2016, 04:47 »

Код
C++ (Qt)
tempScaleX = scaleX * cos(angle * M_PI / 180);
tempScaleY = scaleY * sin(angle * M_PI / 180);
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #22 : Ноябрь 01, 2016, 13:43 »

Не спасает. Искажения по-прежнему есть.
« Последнее редактирование: Ноябрь 01, 2016, 14:01 от Гурман » Записан

2^7-1 == 127, задумайтесь...
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #23 : Ноябрь 01, 2016, 15:12 »

- перемещаем центр масштабирования/вращения в начало координат
Код:
.translate(-x,-y)
- выполняем масштабирование
Код:
.scale(scale_x, scale_y)
- при этом понимаем, что при scale_x != scale_y исходный item будет сплюснут или вытянут по осям; то есть, если стрелка изначально находится под некоторым углом, то сначала нужно развернуть ее обратно в вертикальное или горизонтальное направление.
Код:
.rotate(-arrow_angle)
- вращаем как нам заблагорассудиться
Код:
.rotate(array)
- перемещаем результат в исходное состояние
Код:
.translate(x,y)

В итоге имеем

Код
C++ (Qt)
item->setTransform( QTransform().translate(x, y).rotate(angle).scale(scale_x, scale_y).rotate(-arrow_angle).translate(-x,-y) );
 

Все трансформации реализуют линейную матричную алгебру, навряд ли там есть ошибки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Ноябрь 01, 2016, 15:48 »

Что-то не могу воспроизвести проблему, не получаю искажений (аттач)
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #25 : Ноябрь 01, 2016, 15:53 »

Кажется я нашёл в чём проблема. От старого кода остался в инициализации начальный поворот с помощью setRotation. А setTransform про него понятия не имеет. Вычитал в каком-то форуме, что в Qt сохранились и работают два совершенно разных канала вращения и масштабирования айтемов. Один из них новый, другой старый, работают совершенно по-разному, и никак друг с другом не согласуются. Я вот тоже не припомню, чтобы в Qt 3 были два способа вращать - напрямую и с помощью матриц трансформации. Достаточно давно это было, 10 лет назад, но помню что проблем не возникало.
« Последнее редактирование: Ноябрь 02, 2016, 12:03 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Ноябрь 01, 2016, 16:12 »

В итоге имеем

Код
C++ (Qt)
item->setTransform( QTransform().translate(x, y).rotate(angle).scale(scale_x, scale_y).rotate(-arrow_angle).translate(-x,-y) );
 

Все трансформации реализуют линейную матричную алгебру, навряд ли там есть ошибки.
Читать эту соплю надо справа налево (как в гребаном OpenGL), т.е. последняя операция выполняется первой. Это не очень удобно/естественно, линейная алгебра к этому не обязывает

Да, и зачем второе вращение? Просто
Код
C++ (Qt)
item->setTransform( QTransform().translate(x, y).rotate(angle).scale(scale_x, scale_y).translate(-x,-y) );
« Последнее редактирование: Ноябрь 01, 2016, 16:15 от Igors » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #27 : Ноябрь 01, 2016, 17:53 »

В общем, да, работает как надо, если перед этим не поворачивать айтем с помощью setRotation. Заменил на поворт трансформацией, вроде проблема пропала
 
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #28 : Ноябрь 01, 2016, 17:54 »

зачем второе вращение? Просто

...он похоже обсуждение не читал...
Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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