Доброго времени суток, заранее извиняюсь если немного сумбурно определил тему, просто пока ещё сам не могу её точно сформулировать, ибо она состоит из кучки маленьких вопросов «как» и «почему» и целостной картины в моей голове пока не имеет. В попытке собрать всё воедино и понять, что да как, создаю эту тему. Если кто разрабатывал подобные приложения, прошу поделиться опытом :)
Итак, пытаюсь понять, как устроены программы типа CAD-ов(в плане вывода на экран), в которых приходится что-либо рисовать. Например, программы для рисования электрических схем, или каких либо планов домов и.т.д. Интересует в них следующее: как в них реализуется масштабирование и скроллинг. Если с масштабированием более-менее понятно, т.е взяли все размеры и координаты, помножили на некоторое число(scale factor), получили новые размеры и координаты, отрисовали и вот вроде бы всё стало другого размера. То со скроллингом есть несколько вопросов:
- Как работает скроллинг: у нас есть некоторое виртуальное окно и окно, которое мы видим на экране(например Frame). Если виртуальное окно больше клиентской части фрейма, то появляются скроллбары. Так? Теперь вопрос, в каких единицах обычно задаётся размер виртуального окна и по какому принципу этот размер выбирается? Т.е этот размер может быть бесконечным, или он привязывается, скажем, к размеру листа A4(3,2,1,0), переведённому в единицы измерения размеров вирт. окна?
- При скроллинге, когда пользователь дёргает за скроллбар, картинка должна проскроллиться на некоторую величину, как обычно вычисляется эта величина или просто от фонаря задаётся(задали наобум, скажем 10 пикселей)?
- Какую систему координат обычно применяют в таких программах и откуда вести отсчёт координат? Т.е брать ли мне центр начала координат в центре экрана, или это должен быть верхний левый угол экрана? Правильно ли, что окно на экране(Frame), который «плавает» по виртуальному окну, также имеет свои координаты, которые как раз и отсчитываются от верхнего левого угла вирт. окна?
- Я так понимаю, что когда человек в этой программе рисует что-то, то всё рисование вычисление должно вестись в каких-то внутренних единицах, которые потом переводятся в реальные единицы устройства, на которые картинка выводится, правильно? Что обычно берётся за внутреннюю единицу и как переводится в единицы устройства?
В данном вопросе я сознательно дистанцировался от указания конкретно фреймворка/библиотеки или ЯП, потому как думаю, что в граф. приложениях принцип идентичен везде, независимо от инструментария. Если нужна конкретика, то я ориентируюсь на wxWidgets. Пока вроде всё, если появятся вопросы, буду их задавать по ходу темы :)