Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   масштабирование от курсора мыши (http://www.flasher.ru/forum/showthread.php?t=127458)

nnk 14.07.2009 17:08

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

Код 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;
 
                }


SunShadow 14.07.2009 17:20

не очень понятно чего добиваешься) У меня была задачка когда надо было скролом увеличивать карту так, чтобы центр увеличения находился в точке где мышка находится. Я двигал центр контейнера в котором лежала карта под мышку и масштабировал содержимое контейнера по необходимости. Чтобы не зависеть от масштаба расчет производил от глобальных координат, а не от текущих точек.

nnk 14.07.2009 17:28

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

SunShadow 14.07.2009 17:29

Код 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()

и все сразу станет намного проще) не надо будет пересчет под масштаб. Из за округлений запросто может такая красота вылезать.

nnk 15.07.2009 09:57

както не получается через displayObject.localToGlobal() провести провел, но все равно здесь надо делать переасчет

SunShadow 15.07.2009 15:15

Цитата:

Сообщение от nnk (Сообщение 835554)
както не получается через displayObject.localToGlobal() провести провел, но все равно здесь надо делать переасчет

Ты пойми чтобы у тебя все нормально масштабировалось, у тебя для начало карта должна располагаться так, чтобы центр масштаба был под указателем мыши. Когда ты рисуешь карту этот центр у тебя в 0, и сместить его можно только если сместить карту в сторону чтобы для вложенных элементов после смещения 0 оказался под мышой. Поэтому самый правильный вариант переместить контейнер в котором карта лежит. А потом масштабировать. А у тебя кстати в коде сначала масштабируется. а потом производится смещение, возможно в этом косяк, у тебя координаты мыши при последующем смещении берутся уже исходя из того что карта увеличена.
Сначала двигай карту, потом ее изменяй в масштабе.

ToRR 15.07.2009 16:07

Вложений: 1
как же я долго с этим мучился....
масштабировал, потом высчитывал смещение, в итоге все равно ролик уезжал куда-то не туда.

помог такой костыль:
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...

SunShadow 15.07.2009 16:28

разбираем код и смотрим почему уходит влево.
Код 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;

вот и все.
Поменяйте операции местами, сначала делайте смещение а потом уже масштабируйте и все должно быть ок.

nnk 16.07.2009 08:33

Да! Спасибо Вам! заработало, немного изменил (т.е. упростил)
Код: (вот чистый код)
Код 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;
}


Psijic 13.11.2012 14:07

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


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

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