Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ecspertiza от Август 27, 2012, 14:32



Название: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: ecspertiza от Август 27, 2012, 14:32
Всем привет, что то совсем не соображу как решить задачу. Есть плоскость на ней есть определенное количество точек, плоскость может изменяться по ширине \ высоте, соответственно при изменении размеров плоскости точки на ней должны пере рисоваться в соответствии с изменением площади плоскости. Насколько понимаю должно быть просто пропорциональное изменение расстояние между точками, но не могу сообразить как его пересчитать. Как это можно сделать ? если меня кто то понял :)   По эффекту должно напоминать scale у QGraphicsItem.


Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: Bepec от Август 27, 2012, 14:39
Просто задавать переменную увеличения. Т.е.

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

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

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

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

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

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



Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: ecspertiza от Август 27, 2012, 14:59
не прокатит так :) уже пробовал, возьмем к примеру увеличение\уменьшение только по оси ОХ. Если делать так, то получиться просто перемещение всех точек на x где x - разница расстояний предыдущего размера и прошлого, если я верно тебя понял. А должно выйти что то типа растяжения. То есть по идее должно увеличиваться только расстояние между точками. Для примера есть прога Jet Screenshot она скрины всякие делает, вот у них есть возможность нарисовать что то карандашом, затем это трансформировать, ну то что рисует карандаш это по сути точки соединенные линиями. То есть если изменим точки то получим новый рисунок.


Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: Bepec от Август 27, 2012, 15:23
Хм. Неудачный я пример привёл, всегда не любил ИЗО :D

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



Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: kambala от Август 27, 2012, 15:47
ну так это ж и есть самое обычное масштабирование: http://en.wikipedia.org/wiki/Scaling_(geometry)#Matrix_representation код писать или по формуле всё ясно?


Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: ecspertiza от Август 27, 2012, 15:52
Про него чего то не подумал сразу. Точнее сделал сначало со scale для QGraphicsItem ,но он изменяет все(в том числе толщину линий и прочее). Сделал так, у меня точки хранятся в QPainterPath

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

есть еще недостатки, но думаю что сейчас их поправлю.


Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: Kurles от Август 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. Не? Только умножать надо исходные точки, что бы при каждом изменении ошибки математики с плавающей точкой не накапливались.


Название: Re: Пропорциональное изменение расстояния на плоскости между точами
Отправлено: ecspertiza от Август 27, 2012, 16:11
С умножением тоже пробовал, все разлетелось, пример того что нужно в аттаче. Умножение на матрицу катит, но изображение уходит за границы плоскости, думаю как это можно сделать, пока зрю в сторону QPainterPath::translate()