Я пытаюсь разработать интерактивный просмотрщик векторных рисунков и хочу иметь функцию масштабирования. Функция масштабирования работает довольно хорошо, но теперь у меня проблема с вычислением положения мыши для выбора объектов. Событие возвращает координаты экрана. У холста нет метода для использования матрицы преобразования обратным способом. У кого-нибудь есть решение этой проблемы?
HTML5 Canvas: вычисление положения мыши после масштабирования и перевода
Ответы (2)
Я сделал очень маленький простой класс для отслеживания матрицы преобразования.
Я добавил функцию invert() по таким причинам. Я также сделал функцию invertPoint(), но не включил ее в окончательную версию. Однако сделать вывод несложно, просто инвертируйте и преобразуйте точку вместе.
Я часто просто вычисляю подходящее преобразование с этим классом, а затем использую setTransform
, в зависимости от приложения.
Я хотел бы дать вам более конкретное решение, но без примера кода того, что вы хотите, было бы трудно сделать.
Вот код класса преобразования. И вот сообщение в блоге с небольшим объяснением.
person
Simon Sarris
schedule
11.12.2011
Привет Саймон, спасибо за ваш быстрый ответ. Решение идеальное. Сегодня я постараюсь включить ваши чистые классы в свой проект.‹br› Жаль, что у холста нет подходящих методов для таких требований. У Android и любой другой графической платформы, которую я знаю, она есть.
- person strangeoptics; 12.12.2011
Вы должны добавить функцию инвертирования, которая возвращает новый объект Transformobject/Matrix. В противном случае мне придется вызывать инвертирование во второй раз после того, как я закончу перевод своего экрана в мир. Это может быть более производительным.
- person strangeoptics; 12.12.2011
Вот несколько ценных функций для вашей библиотеки, которые сохраняют состояние матрицы и необходимы для построения графа сцены:
Transform.prototype.reset = function() {
this.m = [1,0,0,1,0,0];
this.stack = [];
};
Transform.prototype.push = function() {
this.stack.push(this.m.slice());
};
Transform.prototype.pop = function() {
this.m = this.stack.pop();
};
person
strangeoptics
schedule
15.12.2011