51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
|
|
1 | |
Новая позиция точки при масштабировании08.06.2016, 13:44. Показов 2463. Ответов 22
Метки нет (Все метки)
Всем здрасьте.
Есть задание: Получить новую позицию точки на экране при масштабировании. Есть переменная zoom, отвечающая за масштаб, и есть точка P(x,y). Надо найти новые координаты для P, при масштабе zoom. Проблема в том, что надо масштабировать относительно чего-то. Например, у нас дана плоскость 10000х10000, а мой экран показывает только 1600х900 и находится в левом верхнем углу. Понятное дело тут относительно верхнего левого угла. И решение тут простое: x *= zoom; y *= zoom; А вот ещё пример, если мы находимся где-нибудь не около краёв, то надо относительно центра того что мы видим, но что тогда делать с координатами ? Может есть нехитрое решение ?
0
|
08.06.2016, 13:44 | |
Ответы с готовыми решениями:
22
Новая позиция в шаблоне Новая позиция в шаблоне. Joomla 1.5 Сайт съезжает при масштабировании и при изменении размера браузера Смещение при масштабировании |
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
|
||||||
08.06.2016, 16:23 | 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 |
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 |
что задаёт положение мышки и как?
точку? или смещение? Добавлено через 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 |
разве задача не в том, чтобы преобразовать точку из пространства 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 | |||||||||||||||
тогда и формула будет наоборот:
0.0 - лево/верх 1.0 - право/низ ну... смотря как оси расположить... Добавлено через 7 минут плюс, как можно заметить, при 0.0 формула вырождается в
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#, ну да не важно)
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 |
масштабирование с отрицательным коэффициентом
(с гугла: )
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 |
Единица
перемножить // лучше найти уроки, демки, посмотреть на картинки, покрутить коэффициенты я, к сожалению, эту тему не идеально знаю, поэтому всё рассказать не смогу и уроки каждый раз разные нахожу когда хочу вспомнить этот вопрос но вот для начала можно глянуть, к примеру, это: http://compgraphics.info/2D/affine_transform.php
0
|
09.06.2016, 16:11 | |
09.06.2016, 16:11 | |
Помогаю со студенческими работами здесь
20
Ошибка при масштабировании Интерполяция при масштабировании в pictureBox Глюк при масштабировании шаблона Мерцание контрола при масштабировании Сдвиг div при масштабировании Выравнивание по центру при масштабировании Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |