Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.07.2009, 17:08
nnk вне форума Посмотреть профиль Отправить личное сообщение для nnk Найти все сообщения от nnk
  № 1  
Ответить с цитированием
nnk

Регистрация: Oct 2008
Сообщений: 9
По умолчанию масштабирование от курсора мыши

Здравствуйте,
у меня никак не приходит в голову сделать такую формулу:
делаю увеличение от точки мыши но после увеличения эта точка уходит (в данном случае направо уходит), т.е. не остается под курсором мыши, может кто поможет?
буду очень благодарен
заранее спасибо...

Код AS3:
map.addEventListener(MouseEvent.MOUSE_WHEEL, MEvent);
 
function MEvent(event:MouseEvent):void{
				var mod:Number = 10;
 
				map.scaleX += event.delta / mod;
				map.scaleY += event.delta / mod;
 
// здесь направо убегает после масштабирования
				map.x = ((2 * mouseX) - (2 * (event.localX * map.scaleX))) / 2;
				map.y = ((2 * mouseY) - (2 * (event.localY * map.scaleY))) / 2;
 
		}

Старый 14.07.2009, 17:20
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 2  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
не очень понятно чего добиваешься) У меня была задачка когда надо было скролом увеличивать карту так, чтобы центр увеличения находился в точке где мышка находится. Я двигал центр контейнера в котором лежала карта под мышку и масштабировал содержимое контейнера по необходимости. Чтобы не зависеть от масштаба расчет производил от глобальных координат, а не от текущих точек.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 14.07.2009, 17:28
nnk вне форума Посмотреть профиль Отправить личное сообщение для nnk Найти все сообщения от nnk
  № 3  
Ответить с цитированием
nnk

Регистрация: Oct 2008
Сообщений: 9
да, у меня так же, скролом увеличиваешь карту, центр увеличения где мышка находиться, вот только от каких глобальных координат? можно подробнее?

Старый 14.07.2009, 17:29
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 4  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Код AS3:
map.x = ((2 * mouseX) - (2 * (event.localX * map.scaleX))) / 2;
из математики
(ab - ac) = a(b-c)
таким образом можно
Код AS3:
map.x = ((mouseX) - ((event.localX * map.scaleX))) 2 / 2;
или еще короче
Код AS3:
map.x = mouseX - event.localX * map.scaleX;
мой совет переведи свои точки в глобальные
Код AS3:
displayObject.localToGlobal()
и все сразу станет намного проще) не надо будет пересчет под масштаб. Из за округлений запросто может такая красота вылезать.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 15.07.2009, 09:57
nnk вне форума Посмотреть профиль Отправить личное сообщение для nnk Найти все сообщения от nnk
  № 5  
Ответить с цитированием
nnk

Регистрация: Oct 2008
Сообщений: 9
както не получается через displayObject.localToGlobal() провести провел, но все равно здесь надо делать переасчет

Старый 15.07.2009, 15:15
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 6  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Цитата:
Сообщение от nnk Посмотреть сообщение
както не получается через displayObject.localToGlobal() провести провел, но все равно здесь надо делать переасчет
Ты пойми чтобы у тебя все нормально масштабировалось, у тебя для начало карта должна располагаться так, чтобы центр масштаба был под указателем мыши. Когда ты рисуешь карту этот центр у тебя в 0, и сместить его можно только если сместить карту в сторону чтобы для вложенных элементов после смещения 0 оказался под мышой. Поэтому самый правильный вариант переместить контейнер в котором карта лежит. А потом масштабировать. А у тебя кстати в коде сначала масштабируется. а потом производится смещение, возможно в этом косяк, у тебя координаты мыши при последующем смещении берутся уже исходя из того что карта увеличена.
Сначала двигай карту, потом ее изменяй в масштабе.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 15.07.2009, 16:07
ToRR вне форума Посмотреть профиль Отправить личное сообщение для ToRR Найти все сообщения от ToRR
  № 7  
Ответить с цитированием
ToRR

Регистрация: Feb 2007
Сообщений: 63
как же я долго с этим мучился....
масштабировал, потом высчитывал смещение, в итоге все равно ролик уезжал куда-то не туда.

помог такой костыль:
1) в масштабируемый ролик добавил невидимый объект, который всегда находился в том месте, относительно которого надо масштабировать. в моем случае это был центр "окна", через которое просматривался оригинальный объек.
2) были кнопки сролла и зума. при сроллинге этот невидимый "центр" двигался в масштабируемом ролике так, чтобы всегда находиться центре окна.
3) в функции масштабирования делалось примерно следующее:
Код AS3:
var point1:Point=dot.localToGlobal(new Point(0,0));//запомнили кординаты "центра" 
....
//масштабируем
....
var point2:Point=dot.localToGlobal(new Point(0,0));
var point3:Point=point2.subtract(point1); //получаем смещение объекта
//и компенсируем его
object.x-=point3.x;
object.y-=point3.y;
в аттаче небольшой пример, тестил концепцию на нем. в правом верхнем углку кнопки скролла, чуть ниже две кнопки для зума. сделано коряво, но прицип понять можно.

хотя сдается мне, что все это прекрасно реализовывается через TransformMatrix...
Вложения
Тип файла: zip scale_and_zoom.zip (8.6 Кб, 212 просмотров)

Старый 15.07.2009, 16:28
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 8  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
разбираем код и смотрим почему уходит влево.
Код AS3:
//допустим у вас здесь значения
//mouseX  = 20;
//mouseY = 40;		
map.scaleX += event.delta / mod;
map.scaleY += event.delta / mod;
// А теперь после масштабирования ваш ролик вырос, и указатель мыши относительно ролика сдвинулся
// допустим event.delta / mod == 2;
// тогда ориентировочно 
// mouseX = 10;
// mouseY = 20;
// а теперь вы координаты курсора используете в формуле 
// Но они ведь отличаются от исходных значений которые были до масштабирования в 2 раза
//(Да и 2 можно упростить по математике));
map.x = ((2 * mouseX) - (2 * (event.localX * map.scaleX))) / 2;
map.y = ((2 * mouseY) - (2 * (event.localY * map.scaleY))) / 2;
вот и все.
Поменяйте операции местами, сначала делайте смещение а потом уже масштабируйте и все должно быть ок.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ


Последний раз редактировалось SunShadow; 15.07.2009 в 16:33.
Старый 16.07.2009, 08:33
nnk вне форума Посмотреть профиль Отправить личное сообщение для nnk Найти все сообщения от nnk
  № 9  
Ответить с цитированием
nnk

Регистрация: Oct 2008
Сообщений: 9
Да! Спасибо Вам! заработало, немного изменил (т.е. упростил)
Код: (вот чистый код)
Код AS3:
map.addEventListener(MouseEvent.MOUSE_WHEEL, _zoom);
public function _zoom(mouse:MouseEvent):void {
			var _xs:Number = mouse["stageX"];
			var _ys:Number = mouse["stageY"];
 
			var _xm:Number = mouse["localX"];
			var _ym:Number = mouse["localY"];
 
			map.scaleX += mouse.delta / 50;
			map.scaleY += mouse.delta / 50;
 
			map.x = _xs - _xm * map.scaleX;
			map.y = _ys - _ym * map.scaleY;
}

Старый 13.11.2012, 14:07
Psijic вне форума Посмотреть профиль Отправить личное сообщение для Psijic Найти все сообщения от Psijic
  № 10  
Ответить с цитированием
Psijic

Регистрация: Aug 2012
Сообщений: 108
координаты мыши и мне помогли, только так и не понял, какая формула при изменении размера через ползунок +/-? Надо искать координату центра контента(карты) при текущем положении

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.