Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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 и т.д. и попробуйте подвигать и помасштабировать их. Всегда все корректно. А как это работает не пойму.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter