|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
|
Подобрать коэффициент масштабирования04.01.2015, 20:36. Показов 4609. Ответов 11
Метки нет (Все метки)
Задача: вывести на экран точки (вершины графа) по их координатам. Координаты заданы относительно (т.е. без привязки к какому-нибудь конкретному монитору) и имеют разброс:
X: 0.000 .. 1000.000 Y: 0.000 .. 1000.000 Например, пара координат может иметь следующий вид: 30.000, 40.000 Или: 0.250, 0.900 Соответственно, если выводить как есть, картинка будет ненаглядной: либо точки скучены, либо не все помещаются на экран (вывожу на канву компонента Image (1000 на 700 пикселей) в RAD Studio). Как сделать, чтобы граф размещался по центру Image в максимальном масштабе, но при этом не вылезал за пределы Image? Спасибо.
0
|
|
| 04.01.2015, 20:36 | |
|
Ответы с готовыми решениями:
11
Алгоритм масштабирования изображения Проблема с алгоритмом масштабирования рисунка Алгоритм масштабирования графика по оси OY |
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 05.01.2015, 12:31 | |
|
Сначала находишь минимумы и максимумы по вертикали и горизонтали.
Если хочешь чтобы при масштабировании сохранялись пропорции - смотришь на отношение получившихся сторон (Xmax-Xmin)/(Ymax-Ymin), если отношение больше чем отношение сторон канваса - значить далее мы будем работать только с шириной, если наоборот меньше - то только с высотой (т.е. будем ориентироваться на бОльшую сторону, иначе она не влезет на канвас). Если сохранение пропорций несущественно - работаем и с высотой и с шириной независимо. Пусть мы выбрали сторону по ширине. Пусть Х - координата точки, ранее нашли Мах и Мin. Строим отображение интервала (Min;Max) на интервал (0;Width), где Width - ширина канваса X -> (Min;Max) (X-Min) -> (0;Max-Min) (X-Min)/(Max-Min) -> (0;1) Width*(X-Min)/(Max-Min) -> (0;Width) При сохранении пропорций не забыть сдвинуть точки картинки по Y = (Y-Ymin), потом применить ту же формулу - Width*Y/(Max-Min), после этого можно даже отцентрировать, но тут с формулой я не разобрался. Естественно, если у нас будет большая сторона по высоте, то надо поступать аналогично. Надеюсь я ни где не ошибся. Добавлено через 12 минут Для центрирования, скорее всего, нужно сдвинуть на ( Height - Width * (Ymax-Ymin)/(Xmax-Xmin) )/2, но возможно это неправильная формула.
1
|
|
|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
|
| 05.01.2015, 19:42 [ТС] | |
|
Что означает -> в вашей логике?
Про Xmax, Xmin, Ymax, Ymin уже дошло, они используются. На данный момент граф отцентрирован на Image1, осталось его отмасштабировать, Добавлено через 5 часов 26 минут wingblack, ваши формулы понятны, но неясна логика их применения. Вы хотите сказать, что Width*(X-Min)/(Max-Min) - это и есть коэффициент масштабирования?
0
|
|
| 07.01.2015, 10:10 | |
|
Пусть есть значения x и y что надо нарисовать, т.е. перевести в пиксельные координаты (x_pixel, y_pixel). Тогда (пропорции сохраняем)
x_pixel = (x - x_min) * scale; y_pixel = (y_min - y) * scale; // т.к. на экране y направлен вниз C x_min и у_min проблем нет, вычисляем scale по x и y на основании размеров окна screen_x и screen_y scale_x = screen_x / (x_max - x_min); scale_y = screen_y / (y_max - y_min); И берем меньший scale = min(scale_x, scale_y);
1
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 07.01.2015, 16:08 | |
|
С помощью "->" я указываю диапазон значений, в котором будут точки при использовании текущей формулы.
Согласен, не очень удачный выбор.
0
|
|
|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
||
| 09.01.2015, 20:15 [ТС] | ||
|
Igor3D, если выводить вершину по вашей формуле в координаты (scale*исходный_x, scale*исходный_y), то часть вершин (а иногда - все) вылезает за пределы области вывода.
А если в
0
|
||
| 10.01.2015, 12:34 | ||||||||||||||||
|
Замените
0
|
||||||||||||||||
|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
|||||
| 16.01.2015, 14:06 [ТС] | |||||
|
Igor3D, большое спасибо. Действительно, алгоритм довольно простой, но не пришёл мне в голову.
Однако есть одна накладочка, причём в буквальном смысле: в отмасштабированном графе вершины иногда накладываются друг на друга со 100%-й точностью. Приведу пример: Имеем вершины
screen_y = Image1Height-60 = 641 x_offset, y_offset считаем равными нулю.
Как избежать этого?
0
|
|||||
| 18.01.2015, 09:34 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
|
| 18.01.2015, 12:58 [ТС] | |
|
Так ведь min и max и сейчас вычисляются по обоим наборам (пример выше)?
0
|
|
|
1 / 1 / 0
Регистрация: 19.01.2014
Сообщений: 20
|
|
| 21.01.2015, 21:22 [ТС] | |
|
Igor3D, точно! Свёл все вершины в один набор и уже там вычислил минимумы и максимумы - всё рисуется корректно
![]() Спасибо.
0
|
|
| 21.01.2015, 21:22 | |
|
Помогаю со студенческими работами здесь
12
Алгоритм масштабирования картинки, представленной виде массива байт Анимация масштабирования Отмена масштабирования Формула масштабирования Масштабирования фигуры. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|