Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > масштабирование


Автор: boolean34 16.5.2012, 13:08
привет всем!
делаю прогу и не могу определиться со способом реализации.
в общем на форме будет слоями выводиться(рисоваться) различные данные(слой первичных данных, слой результатов обработки , служебная инфа и тд) .
плюс нужна картографическая поддержка по типу гугл/яндекс мэпс с прокруткой и зумированием/масштабированием.

как лучше будет по скорости и качеству: 
1) нарисовать все в bitmap в самом высоком разрешении, и в зависимости от коэффициента масштаба все это дело сжимать спец(сглаживания?) алгоритмами;
2) координаты хранить в массиве и каждый раз рисовать в зависимости от коэффициента масштаба ;
3) ваш вариант.
                                                       ???


Автор: Amp 16.5.2012, 15:41
Зависит от того насколько масштабировать собираешься. Если битмап в максимальном масштабе укладывается в некоторые разумные размеры, не знаю, например до 4000x4000, то можно заранее все нарисовать. В общем случае - рисовать нужный регион каждый раз с учетом масштаба. Если отрисовка "тяжелая", то можно еще кэшировать что-нибудь для более гладкой прокрутки. 

Автор: drug007 16.5.2012, 16:47
Цитата(boolean34 @ 16.5.2012,  13:08)

в общем на форме будет слоями выводиться(рисоваться) различные данные(слой первичных данных, слой результатов обработки , служебная инфа и тд) .
плюс нужна картографическая поддержка по типу гугл/яндекс мэпс с прокруткой и зумированием/масштабированием.

Нечто подобное в планах
Цитата(boolean34 @ 16.5.2012,  13:08)

как лучше будет по скорости и качеству: 
1) нарисовать все в bitmap в самом высоком разрешении, и в зависимости от коэффициента масштаба все это дело сжимать спец(сглаживания?) алгоритмами;
2) координаты хранить в массиве и каждый раз рисовать в зависимости от коэффициента масштаба ;
3) ваш вариант.
                                                       ???

Все зависит от тяжести картинки. Сейчас я использую второй вариант - массив вершин, который выводится на экран с помощью OpenGL, масштабирование решается элементарно средствами самого OpenGL. Но у меня пока плотность информации очень маленькая - только линии и точки выводятся на экран (типа реки, береговой черты и населенных пунктов). В дальнейшем планирую выводить заполненные многоугольники (например суша и море). Тут уже думаю использовать текстуры и масштабирование решать через LODы. Но это все равно ближе ко второму варианту.
В целом первый вариант проще в реализации, но потом сложнее будет масштабировать (тут я имею в виду сам алгоритм). На маленьких объемах он будет быстрее, на больших медленнее второго. Второй вариант более универсален и масштабируем, но сложнее в реализации.

Автор: boolean34 17.5.2012, 05:15
понял. кто подскажет алгоритмы сглаживания для 1-го варианта?

Автор: Amp 17.5.2012, 10:46
Билинейная фильтрация, например.  В билдере не пишу, но думаю, что там должны быть классы для трансформации картинок. Можешь вывести как текстуру с помощью того же OpenGL - он сам отфильтрует. Правда дополнительно придется сгенерировать несколько mip-map уровней, что отразится на потреблении памяти.

Автор: boolean34 17.5.2012, 11:16
ок, всем спасибо большое!

Автор: Doga 14.6.2012, 00:10
Привет.

Вообще, у класса TImage достаточно неплохие алгоритмы масштабирования. Но если Вам надо что то выдающееся - посмотрите в сторону библиотеки ImageEn. Вот уж, где слаживание, так сглаживание!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)