Показать сообщение отдельно
  #1  
Старый 25.05.2013, 22:46
xabik xabik вне форума
Прохожий
 
Регистрация: 08.05.2012
Сообщения: 6
Репутация: 10
По умолчанию Перемещение + Масштабирование

Здравствуйте уважаемые форумчане.

Такой вот вопросик назрел в связи с разрабатываемой программой, связанный с графикой.

В моей программе на холсте TImage отрисовываются различные объекты. Данные объекты состоят из точек, имеющих координаты. Точки соединяются линиями. И вот задумал я сделать масштабирование и перемещение изображение холста с помощью мыши. Ну то есть колесико крутим меняется масштаб, зажимаем клавишу и тащим, изображение холста движется с мышью. Данные действия я реализовал простыми математическими операциями - перемещение добавлением к координатам точек dx и dy, масштабирование умножением координат точек на dz. При всем при этом изначальные координаты точек остаются теми же. Просто в процедуру рисования на холсте я передаю параметры dx, dy, dz, которые являются глобальными переменными, которые в зависимости от действий пользователя меняются. Ну то есть зажал пользователь клавишу и подвинул мышь на 100 px вправо и 50 px вниз, dx стал равен 100 dy стал равен 50. Затем пользователь подвинул мышь вверх на 20 px и влево на 30 px и dx стал равен 70, а dy 30. При масштабировании же при прокрутке колесика мышки вверх на 3 деления dz становится равным 0,7, затем если прокрутить колесо мыши вниз на 5 делений то равным 1,2.

По отдельности эти операции работают замечательно. А вот если вместе то беда все координаты сбиваются. Можно было бы решить данную проблему путем запоминания нового значения координаты как после перемещения так и после масштабирования, но вся беда в том что после масштабирования не всегда получается то что было изначально. Т.е. когда мы умножаем координаты на множитель dz мы же должны округлить получившееся значение что бы вывести его на холст. И в результате сжав и развернув изображение мы можем получить не то что было в начале. Поэтому изначальные координаты приходится хранить.
Теперь допустим пользователь сначала передвинул изображение, потом сжал его, а затем передвинул и расжал масштаб. Уверяю получится не совсем то что задумывалось изначально.

Вот как написать процедуру, которая всегда корректно отображает положение объектов и их масштаб. Для более красочного понимания того что я здесь понаписал зайдите на любую версию карт - Gooogle, Yandex и т.д. и попробуйте подвигать и помасштабировать их. Всегда все корректно. А как это работает не пойму.
Ответить с цитированием