Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Вращение изображения вокруг центра ViewPort (http://www.flasher.ru/forum/showthread.php?t=206131)

Sonet 15.01.2014 16:03

Как бы есть некая область, куда пользователь может загрузить изображение (размеры получаются с сервера) - контейнер. Туда пользователь имеет возможность загрузить изображение. Оно может быть больше или меньше этой области, показываться должно изначально как есть. Соответственно если зображение больше, то лишние края прячутся контейнером. Пользователь может двигать, вращать и скейлить изображение внутри контейнера. Сам контейнер при этом должен оставаться неподвижен и не изменен. Получаается как бы окно, через которое мы видим кусок изображения и все модоификации должны производиться относительно этого окошка: скейлинг и вращение относительно центра окна, перемещение с учетом отступа относительно топлефт угла окна, а не картинки. И я все сделал, кроме поворота. Поворот работать не хочет никак. Лучший вариант валится из-за погрешности.

Akopalipsis 15.01.2014 16:28

Мне кажется я видел такое в ВК, аватара там вроде так же сделана.
И тут опять-таки мне кажется, что Вы немного сбились. Вот загрузил я большое фото и мне нужно его по желанию подогнать под размер. Во первых я должен видеть всё изображение , по верх которого нарисована рамка конечного результата. Вращение и скейл должен проходить относительно центра этой рамки. Как бы я фото не скейлил и не перемещал, то всё это для того, чтобы в итоге я мог подкрутить по отношению центра контейнера. А если сделать вращение да и скейл по отношению не центра рамк конечного результата, то получится не плохая головоломка. Код который показал Вам я, рабочий и если делать как у меня то не чего не смещается. Проблема не в коде а в Вашем видении.
Для примера разберём эту строчку -
Код AS3:

var xShift:Number = image.x + image.parent.width / 2;

Контейнер 100 на 100 в координатах 100 и 100.
Для поиска его центра нужно к координате х прибавить половину его ширины 50.
Но мы поворачиваем его на 45 градусов. Теперь его ширина не 100, а равна его диагонали в состоянии без вращения и координаты смещены. Под углом 90 градусов его координаты будут в 200, 200 и прибавив к ним ещё половину ширины вы центр смещаете воооообще не туда. Вам нужен центр РАМКИ!

Isfet 15.01.2014 16:32

вы отбраковываете нормальные варианты, и пытаетесь все усложнить.

есть главный контейнер- окно (назовем его window), в него в центр помещается другой контейнер(назщовем его innerBox и этот контейнер больше не двигается, или двигается при изменении размеров window ставится опять по центру ), в inner box помещаем изображение в координаты

Код AS3:

 img.x = -img.width *0.5;
      img.y = -img.height *0.5;

далеее картинка перемещается внутри innerBox -а , а если нужно повернуть картинку вокруг точки(а точка - будет центр innerBox ), то вращаем сам innerBox.

Sonet 15.01.2014 17:35

Цитата:

Сообщение от Isfet (Сообщение 1157336)
вы отбраковываете нормальные варианты, и пытаетесь все усложнить.

есть главный контейнер- окно (назовем его window), в него в центр помещается другой контейнер(назщовем его innerBox и этот контейнер больше не двигается, или двигается при изменении размеров window ставится опять по центру ), в inner box помещаем изображение в координаты

Код AS3:

 img.x = -img.width *0.5;
      img.y = -img.height *0.5;

далеее картинка перемещается внутри innerBox -а , а если нужно повернуть картинку вокруг точки(а точка - будет центр innerBox ), то вращаем сам innerBox.

Если innerBox не квадрат, то после его поворота стороны меняются местами. Такого быть не должно.

Akopalipsis
Это у меня очевидно не верная версия. Я пытался подогнать ваш код под свои нужны. Дело в том, что у меня картинка находится внутри статичного контейнера, который сам себе scrollRect. Т.е. скролл рект как бы имеет координаты (0,0) и ширину/высоту такую же, как у контейнера. И эти значения не меняются никогда.

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

Код AS3:

var bounds:Rectangle = image.getBounds(image.parent);
shiftByX = image.parent.width / 2 - bounds.x;
shiftByY = image.parent.height / 2 - bounds.y;

Но они не работают. Хотя я проверял - получаются координаты точки вращения (центра моего контейнера, который сам и является рамкой) внутри изображения.

Isfet 15.01.2014 17:54

Цитата:

Сообщение от Sonet (Сообщение 1157359)
стороны меняются местами

можно тут поподробнее?

Sonet 15.01.2014 17:59

Цитата:

Сообщение от Isfet (Сообщение 1157363)
можно тут поподробнее?

Была у вас высоту иннербокса 100 и шририна 200, при повороте на 90 градусов станет наоборот.

Akopalipsis 15.01.2014 17:59

Код AS3:

shiftByX = image.parent.width / 2 - bounds.x;

Парент, это скрол 100 на 100?

Sonet 15.01.2014 18:14

Цитата:

у меня картинка находится внутри статичного контейнера, который сам себе scrollRect.
Т.е. да.
У меня всего 2 объекта: контейнер, который обрезает все, что за его пределами (т.е. его ширина, высота фиксированы, если в него поместить что-то большее, чем он сам, то они не изменятся, лишний контент будет невидим, контент может иметь отрицательные координаты), и картинка внутри него.

Isfet 15.01.2014 18:16

Цитата:

Сообщение от Sonet (Сообщение 1157364)
Была у вас высоту иннербокса 100 и шририна 200, при повороте на 90 градусов станет наоборот.

не берите "getRect" - размеры, внутри себя этот inner-box не изменил размеры, вытаскивайте размеры из него

Sonet 15.01.2014 18:32

К чему эта картинка? Кстати у меня задача немного проще, т.к. шаг поворота 90 градусов.


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

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