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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пропорциональное изменение расстояния на плоскости между точами  (Прочитано 4713 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Август 27, 2012, 14:32 »

Всем привет, что то совсем не соображу как решить задачу. Есть плоскость на ней есть определенное количество точек, плоскость может изменяться по ширине \ высоте, соответственно при изменении размеров плоскости точки на ней должны пере рисоваться в соответствии с изменением площади плоскости. Насколько понимаю должно быть просто пропорциональное изменение расстояние между точками, но не могу сообразить как его пересчитать. Как это можно сделать ? если меня кто то понял Улыбающийся   По эффекту должно напоминать scale у QGraphicsItem.
Записан
Bepec
Гость
« Ответ #1 : Август 27, 2012, 14:39 »

Просто задавать переменную увеличения. Т.е.

точка 10,10
точка 20,25

Увеличиваем с контролом - переменная zoom устанавливается в 6 допустим.

И перемещаем элементы
точка 10+x, 10 +x
точка 20+x, 25+x

Соответственно пропорции сохраняются

PS там формула правда сложнее, но думаю принцип ты поймёшь Улыбающийся

PPS переменные на высоту/ширину могут быть разными Веселый

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Август 27, 2012, 14:59 »

не прокатит так Улыбающийся уже пробовал, возьмем к примеру увеличение\уменьшение только по оси ОХ. Если делать так, то получиться просто перемещение всех точек на x где x - разница расстояний предыдущего размера и прошлого, если я верно тебя понял. А должно выйти что то типа растяжения. То есть по идее должно увеличиваться только расстояние между точками. Для примера есть прога Jet Screenshot она скрины всякие делает, вот у них есть возможность нарисовать что то карандашом, затем это трансформировать, ну то что рисует карандаш это по сути точки соединенные линиями. То есть если изменим точки то получим новый рисунок.
« Последнее редактирование: Август 27, 2012, 15:03 от ecspertiza » Записан
Bepec
Гость
« Ответ #3 : Август 27, 2012, 15:23 »

Хм. Неудачный я пример привёл, всегда не любил ИЗО Веселый

Не особо понимаю что ты хочешь. Мб пейнтом изобразишь до и после? Улыбающийся

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Август 27, 2012, 15:47 »

ну так это ж и есть самое обычное масштабирование: http://en.wikipedia.org/wiki/Scaling_(geometry)#Matrix_representation код писать или по формуле всё ясно?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Август 27, 2012, 15:52 »

Про него чего то не подумал сразу. Точнее сделал сначало со scale для QGraphicsItem ,но он изменяет все(в том числе толщину линий и прочее). Сделал так, у меня точки хранятся в QPainterPath

Код:
        QMatrix mirrorMatrix;
        mirrorMatrix.scale(wScale,hScale);
        path = path * mirrorMatrix;

есть еще недостатки, но думаю что сейчас их поправлю.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Август 27, 2012, 15:53 »

Код
C++ (Qt)
   QSize oldSize;
   QSize newSize;
 
   // ...
   double xScale  = (double)oldSize.width() / (double)newSize.width();
   double yScale = (double)oldSize.height() / (double)newSize.height();
Потом тупо на x координаты точек на xScale умножить, а y координаты на yScale. Не? Только умножать надо исходные точки, что бы при каждом изменении ошибки математики с плавающей точкой не накапливались.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Август 27, 2012, 16:11 »

С умножением тоже пробовал, все разлетелось, пример того что нужно в аттаче. Умножение на матрицу катит, но изображение уходит за границы плоскости, думаю как это можно сделать, пока зрю в сторону QPainterPath::translate()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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