Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
1

Новая позиция точки при масштабировании

08.06.2016, 13:44. Показов 2463. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здрасьте.

Есть задание:
Получить новую позицию точки на экране при масштабировании.
Есть переменная zoom, отвечающая за масштаб, и есть точка P(x,y).
Надо найти новые координаты для P, при масштабе zoom.

Проблема в том, что надо масштабировать относительно чего-то.

Например, у нас дана плоскость 10000х10000, а мой экран показывает только 1600х900 и находится в левом верхнем углу.
Понятное дело тут относительно верхнего левого угла.
И решение тут простое:
x *= zoom;
y *= zoom;

А вот ещё пример, если мы находимся где-нибудь не около краёв, то надо относительно центра того что мы видим, но что тогда делать с координатами ?

Может есть нехитрое решение ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2016, 13:44
Ответы с готовыми решениями:

Новая позиция в шаблоне
есть шаблон, в котором 2 позиции для колонок меню и новости (общий размер 100%). как добавить 3...

Новая позиция в шаблоне. Joomla 1.5
Вечер добрый! Как добавить новую позицию в шаблон gk-yourshop? Как 2й логотип, но указать для...

Сайт съезжает при масштабировании и при изменении размера браузера
Здравствуйте. Делал задание одно, все получилось, но в конце, когда начал проверять, что будет если...

Смещение при масштабировании
Всем привет! При вёрстке столкнулся с такой проблемой-при масштабировании некоторые элементы...

22
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 16:23 2
В таком случае надо вводить смещения.
Вот как сделал я:
C++
1
2
    dstX = (srcX - mainWidth / 2) * zoom + windowWidth / 2;
    dstY = (srcY - mainHeight / 2) * zoom + windowHeight / 2;
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 17:21  [ТС] 3
Что у вас отвечает за экран, а что за плоскость(которая у меня 10000х10000) ? ))
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 17:29 4
Цитата Сообщение от BeginerMan Посмотреть сообщение
Что у вас отвечает за экран, а что за плоскость(которая у меня 10000х10000) ? ))
main - это 10000x10000
window - это 1600х900
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 17:44  [ТС] 5
Допустим мышка на (500;500) и зум х2, тогда:
dstX = (500 - 10000/2) * 2 + 1600 / 2 = (500 - 5000) * 2 + 800 = -9000 + 800 = -7200
dstY = (500 - 10000/2) * 2 + 900 / 2 = -9000 + 450 = -8550

Что мне делать с этими числами ? Если конечно я всё правильно понял )
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 17:55 6
Цитата Сообщение от BeginerMan Посмотреть сообщение
Допустим мышка на (500;500) и зум х2, тогда:
что задаёт положение мышки и как?
точку? или смещение?

Добавлено через 1 минуту
я привёл код для масштабирования по центру
если 500 - это координата точки, то логично, что её проекция будет далеко за экраном (левее и выше)

Добавлено через 5 минут
и зум x2 тут не очень подходит
тут скорее надо что-то типа 0.1-0.3
чтобы 10000 влезло в 1600
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 17:59  [ТС] 7
мышка задаёт точку в экране 1600х900.
Извините, если что-то плохо объясняю, просто первый раз с этим вожусь )
Миниатюры
Новая позиция точки при масштабировании  
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 18:04 8
Цитата Сообщение от BeginerMan Посмотреть сообщение
мышка задаёт точку в экране 1600х900.
разве задача не в том, чтобы преобразовать точку из пространства 10000x10000 в пространство 1600х900?
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 18:05  [ТС] 9
наоборот, из 1600х900 в 10000х10000
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 18:18 10
Цитата Сообщение от BeginerMan Посмотреть сообщение
наоборот, из 1600х900 в 10000х10000
тогда и формула будет наоборот:
C++
1
2
    dstX = (srcX - windowWidth / 2) * zoom + mainWidth / 2;
    dstY = (srcY - windowHeight / 2) * zoom + mainHeight / 2;
хотя, лучше даже так:
C++
1
2
    dstX = (srcX - windowWidth * 0.5) * zoom + mainWidth * 0.5;
    dstY = (srcY - windowHeight * 0.5) * zoom + mainHeight * 0.5;
0.5 - значит центр
0.0 - лево/верх
1.0 - право/низ
ну... смотря как оси расположить...

Добавлено через 7 минут
плюс, как можно заметить, при 0.0 формула вырождается в
C++
1
2
    dstX = srcX * zoom;
    dstY = srcY * zoom;
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 18:33  [ТС] 11
Я тут другое решение придумал:

У нас же координаты получаются за счёт осей(векторов) Х(1;0) и У(0;1).
Т.е. итоговая точка получается: х(1;0) + y(0;1) = (x;y)

Пускай, моя плоскость 1600х900 будет содержать эти Х(1;0) и Y(0;1).
Тогда у 10000х10000 будет Х(10000/1600 ; 0) и Y(0; 10000/900) = X(6.25; 0) и Y(0; 11.11)

тогда останется просто координаты моей мышки (715; 234) положить в новый базис(вроде так называется):

715*(6.25; 0) + 234*(0; 11.11) = (4468.75; 2600) - новые координаты мыши.

Действий то не много, находим соотношение большего на меньшее и умножаем координаты мыши на эти соотношения -> 4 операции

Добавлено через 1 минуту
Я и в вашей формуле разобрался, уже проверяю, мне просто интересно найти множество решений ))
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 18:38 12
Может я опять не так задание понял :/
Я проверял формулу на вот такой простенькой програмке.
(написано криво и на C#, ну да не важно)
Вложения
Тип файла: rar WpfApplication1.rar (950.4 Кб, 9 просмотров)
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
08.06.2016, 19:02  [ТС] 13
И ваш способ и мой работает, спасибо !
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
08.06.2016, 20:00 14
Есть ещё такая штука как матрица трансформации.
Она может пригодиться если потребуется сюда добавить, к примеру, поворот.
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
09.06.2016, 15:46  [ТС] 15
Поворот можно организовать с тех векторов, что я получил для пространства 10000х10000:
OX(6.25; 0) и OY (0; 11.11) - базисы
Если базисы повернуть на нужный нам угол, то любую точку сможем найти(scale и rotate):

При degree(градусы) = 50
OX.x = 6.25 * cos(degree) - 0 * sin(degree) = 4.017
OX.y = 6.25 * sin(degree) + 0 * cos(degree) = 4.78

Так же для OY.

Только я вот не знаю, надо сначала их повернуть и потом масштабировать или без разницы ... Ну и конечно как вы написали, можно просто составить матрицу(2х2 получается), которая будет содержать нужные трансформации.

Она по-моему будет выглядеть так(если я не ошибаюсь):
OX.x OY.x
OX.y OY.y
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
09.06.2016, 15:52 16
Матрицы трансформации - это просто общеизвестный метод для решения таких задач.
В матрицу 3х3 (для 2D точки) можно одновременно записать и перемещение и поворот и масштабирование/отражение и скос.
Также, они обладают некоторыми интересными свойствами:
К примеру, несколько подряд идущих трансформаций можно объединить в одну, просто перемножив матрицы.

То есть, тут есть что изучать.
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
09.06.2016, 15:55  [ТС] 17
Очень интересно !
А как реализовать отражение ?
И что понимается под скосом ?
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
09.06.2016, 15:57 18
Цитата Сообщение от BeginerMan Посмотреть сообщение
А как реализовать отражение ?
масштабирование с отрицательным коэффициентом
Цитата Сообщение от BeginerMan Посмотреть сообщение
И что понимается под скосом ?
(с гугла: )
Миниатюры
Новая позиция точки при масштабировании  
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
09.06.2016, 16:05  [ТС] 19
Ясненько, я думал это всё намного сложнее, а оказалось не так )) Осталось разобраться с этим.
А вот теперь, у меня есть матрица A(3х3) и есть позиция объекта вектор2d (x,y).
Мне получается надо приписать 3 число к вектору ? И что за число.
И как применить преобразования матрицы на мой вектор ?
0
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
09.06.2016, 16:11 20
Цитата Сообщение от BeginerMan Посмотреть сообщение
Мне получается надо приписать 3 число к вектору ? И что за число.
Единица
Цитата Сообщение от BeginerMan Посмотреть сообщение
И как применить преобразования матрицы на мой вектор ?
перемножить

//
лучше найти уроки, демки, посмотреть на картинки, покрутить коэффициенты
я, к сожалению, эту тему не идеально знаю, поэтому всё рассказать не смогу
и уроки каждый раз разные нахожу когда хочу вспомнить этот вопрос
но вот для начала можно глянуть, к примеру, это:
http://compgraphics.info/2D/affine_transform.php
0
09.06.2016, 16:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2016, 16:11
Помогаю со студенческими работами здесь

Ошибка при масштабировании
Здравствуйте ,написал программу для вывода точек в builder ,но допустил ошибку и 2 день её...

Интерполяция при масштабировании в pictureBox
Как избавиться от интерполяции при масштабировании изображения в pictureBox. Ожидание: А...

Глюк при масштабировании шаблона
Есть шаблон http://demo.joomagic.com/business/ Баг заключается в следующем. Если окно браузера...

Мерцание контрола при масштабировании
Доброго времени суток! Масштабирую контрол, и он при этом мерцает. Update(), Refresh(),...

Сдвиг div при масштабировании
Имеется страничка, на которой есть картинка с полями ввода, на эти поля ввода надо подогнать input,...

Выравнивание по центру при масштабировании
Есть страница http://www.xn--80acehcbpdd3ahh5bza8d0h.xn--p1ai/divany/ При масштабировании нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru