Я хочу иметь возможность увеличивать точку под мышью на холсте HTML 5, как масштабирование на Картах Google . Как я могу этого достичь?
javascript
html
canvas
csiz
источник
источник
Ответы:
Лучшее решение - просто переместить положение области просмотра на основе изменения масштаба. Точка масштабирования - это просто точка в старом и новом масштабах, которую вы хотите оставить прежней. Это означает, что область просмотра предварительно увеличена, а область просмотра после увеличения имеет одинаковую точку увеличения относительно области просмотра. Учитывая, что мы масштабируемся относительно происхождения. Вы можете настроить положение окна просмотра соответственно:
Так что на самом деле вы можете просто перемещаться вниз и вправо при увеличении, в зависимости от того, насколько вы увеличили масштаб, относительно точки, в которой вы увеличивали масштаб.
источник
Наконец-то решил это:
Ключ, как указал @Tatarize , состоит в том, чтобы вычислить положение оси так, чтобы точка увеличения (указатель мыши) оставалась на том же месте после увеличения.
Первоначально мышь находится на расстоянии
mouse/scale
от угла, мы хотим, чтобы точка под мышкой оставалась на том же месте после увеличения, но этоmouse/new_scale
далеко от угла. Поэтому нам нужно сдвинутьorigin
(координаты угла), чтобы учесть это.Затем оставшийся код должен применить масштабирование и преобразование к контексту рисования, чтобы его происхождение совпадало с углом холста.
источник
На самом деле это очень сложная задача (математически), и я почти работаю над тем же. Я задал аналогичный вопрос о Stackoverflow, но не получил ответа, но опубликовал в DocType (StackOverflow для HTML / CSS) и получил ответ. Проверьте это http://doctype.com/javascript-image-zoom-css3-transforms-calculate-origin-example
Я нахожусь в процессе создания плагина jQuery, который делает это (масштабирование в стиле Google Maps с использованием CSS3 Transforms). У меня немного работает масштабирование курсора мыши, все еще пытаюсь выяснить, как позволить пользователю перетаскивать холст вокруг, как вы можете это сделать в Google Maps. Когда я заработаю, я выложу код здесь, но посмотрите ссылку выше для части увеличения масштаба изображения с помощью мыши.
Я не осознавал, что в контексте Canvas есть методы масштабирования и перевода, вы можете добиться того же с помощью CSS3, например. используя jQuery:
Убедитесь, что для CSS3 transform-origin установлено значение 0, 0 (-moz-transform-origin: 0 0). Использование CSS3-трансформации позволяет вам увеличивать все, что угодно, просто убедитесь, что контейнер DIV настроен на переполнение: скрытый, чтобы остановить увеличение масштабов по краям.
Независимо от того, используете ли вы CSS3-преобразования или собственные методы canvas и translate, все зависит от вас, но проверьте расчеты по приведенной выше ссылке.
Обновление: Мех! Я просто опубликую код здесь, а не заставлю вас перейти по ссылке:
Вам, конечно, нужно будет адаптировать его для использования масштабов холста и методов перевода.
Обновление 2: только что заметил, что я использую transform-origin вместе с translate. Мне удалось реализовать версию, которая просто использует масштабирование и перевод самостоятельно, проверьте ее здесь http://www.dominicpettifer.co.uk/Files/Mosaic/MosaicTest.html Подождите, пока изображения загрузятся, затем используйте свой колесо мыши для увеличения, также поддерживает панорамирование, перетаскивая изображение вокруг. Он использует CSS3 Transforms, но вы должны иметь возможность использовать те же вычисления для вашего Canvas.
источник
Я столкнулся с этой проблемой, используя c ++, чего, вероятно, не следовало бы использовать, просто для начала я использовал матрицы OpenGL ... в любом случае, если вы используете элемент управления, источник которого находится в верхнем левом углу, и вам требуется панорамирование / увеличение как карты Google, вот макет (с использованием allegro в качестве моего обработчика событий):
источник
мне нравиться ответ Татаризата , но я предоставлю альтернативу. Это тривиальная задача линейной алгебры, и метод, который я представляю, хорошо работает с панорамированием, масштабированием, перекосом и т. Д. То есть он хорошо работает, если ваше изображение уже трансформировано.
Когда матрица масштабируется, масштаб находится в точке (0, 0). Таким образом, если у вас есть изображение и вы масштабируете его в 2 раза, нижняя правая точка будет удваиваться в обоих направлениях (x и y) (при использовании соглашения, что [0, 0] - это верхний левый угол изображения).
Если вместо этого вы хотите увеличить изображение относительно центра, то решение будет следующим: (1) переведите изображение так, чтобы его центр находился в (0, 0); (2) масштабировать изображение по x и y коэффициентам; (3) перевести изображение обратно. т.е.
Более абстрактно, та же самая стратегия работает для любой точки. Если, например, вы хотите масштабировать изображение в точке P:
И наконец, если изображение уже каким-либо образом преобразовано (например, если оно повернуто, перекошено, переведено или масштабировано), то текущее преобразование необходимо сохранить. В частности, преобразование, определенное выше, должно быть пост-умножено (или умножено вправо) на текущее преобразование.
Там у вас есть это. Вот план, который показывает это в действии. Прокрутите колесиком мыши по точкам, и вы увидите, что они постоянно остаются на месте. (Проверено только в Chrome.) Http://plnkr.co/edit/3aqsWHPLlSXJ9JCcJzgH?p=preview
источник
Вот мое решение для центрированного изображения:
источник
Вот альтернативный способ сделать это, который использует setTransform () вместо scale () и translate (). Все хранится в одном и том же объекте. Предполагается, что холст будет иметь 0,0 на странице, в противном случае вам нужно будет вычесть его положение из координат страницы.
Сопровождающий код для обработки панорамирования:
Чтобы получить ответ самостоятельно, учтите, что одинаковые координаты страницы должны соответствовать одинаковым координатам холста до и после увеличения. Тогда вы можете сделать некоторую алгебру, начиная с этого уравнения:
(pageCoords - перевод) / scale = canvasCoords
источник
Я хочу разместить здесь некоторую информацию для тех, кто отдельно рисует рисунок и двигает - масштабирует его.
Это может быть полезно, когда вы хотите сохранить масштаб и положение области просмотра.
Вот ящик:
Масштаб уведомления ДОЛЖЕН быть первым .
А вот зоомер:
и, конечно, нам понадобится драггер
источник
источник
Вот реализация кода ответа @ tatarize с использованием PIXI.js. У меня есть окно просмотра, которое просматривает часть очень большого изображения (например, стиль Google Maps).
$canvasContainer
мой HTML-контейнерimageContainer
мой контейнер PIXI с изображением в немmousePosOnImage
является позицией мыши относительно всего изображения (а не только порта просмотра).Вот как я получил положение мыши:
источник
Вам нужно получить точку в мировом пространстве (в противоположность пространству экрана) до и после масштабирования, а затем перевести с помощью дельты.
Положение мыши находится в пространстве экрана, поэтому вы должны преобразовать его в мировое пространство. Простое преобразование должно быть похоже на это:
источник
Вы можете использовать функцию scrollto (x, y) для обработки положения полосы прокрутки вправо до точки, которую вам нужно показать после масштабирования. Для нахождения положения мыши используйте event.clientX и event.clientY. это поможет тебе
источник
Одна важная вещь ... если у вас есть что-то вроде:
Вы должны сделать эквивалентную вещь на холсте:
источник