Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Bitmap пропорции (http://www.flasher.ru/forum/showthread.php?t=212432)

Godwarlock 09.02.2016 04:19

Bitmap пропорции
 
Всем привет. Загружаю картинку
Код AS3:

bitmapSource = loader.content as Bitmap;
bitmapSource.width = w1;
bitmapSource.height = h1;
bitmapSource.rotation = 45;
bitmapSource.smoothing = true;

Хочу изменить её высоту
Код AS3:

bitmapSource.height = bitmapSource.height/2;

Но одновременно с изменением высоты объекта, изменяется и ее ширина. Как отключить сохранение пропорции при масштабировании? Это происходит, после установки поворота на 45 градусов.

gyfak 09.02.2016 11:42

Может обернуть битмап в спрайт и изменять размеры спрайта?

caseyryan 09.02.2016 12:16

Это происходит из-за не верного просчета трансформации. Вот у alatar'а в блоге статейка по трансформациям.
Ну или как сказали выше, обернуть в спрайт. Но только размеры менять у картинки, а вращать спрайт.

Zebestov 09.02.2016 12:17

Цитата:

Сообщение от Godwarlock (Сообщение 1191692)
Но одновременно с изменением высоты объекта, изменяется и ее ширина.

Этого не может быть. Где-то в коде меняется ширина либо самого объекта, либо его родителя.

caseyryan 09.02.2016 12:53

Цитата:

Этого не может быть. Где-то в коде меняется ширина либо самого объекта, либо его родителя.
Не не, может. Он там после поворота объекта проверяет ширину. На сколько я помню там был баг какой-то с этим, и похоже его до сих пор не исправили.

Zebestov 09.02.2016 13:36

Но ведь ширина/высота считаются относительно собственной координатной системы объекта. Был такой баг именно с Bitmap?

caseyryan 09.02.2016 13:40

Да, был баг при обращении к свойствам width / height при вращении битмапа. Сам помню делал стрелку часов, которая должна была на четных часах увеличиваться в длине, а на нечетных уменьшаться. Так вот в этот момент я об этом баге и узнал. Стрелка стала непредсказуемо как-то меняться. Пришлось обернуть в спрайт

Godwarlock 09.02.2016 14:10

Спасибо всем

Zebestov 09.02.2016 14:12

Надо зарепортить в Adobe, наверное.

alatar 10.02.2016 12:36

Это не баг, это фича :D

Zebestov 10.02.2016 13:07

Вот это вы прикиньте я все время думал, что w/h берутся относительно локальной системы координат объекта!

undefined 10.02.2016 14:00

Так и есть,при поворотах w/h DO меняться не должны. Я так понял данный баг относится только к Bitmap.

Добавлено через 2 минуты
Либо это как-то связано с тем фактом, что битмап не совсем обычный DO

Zebestov 10.02.2016 14:25

Спецом проверил :) DO туда же! Куда катится мир…

alatar 10.02.2016 16:25

Цитата:

Сообщение от Zebestov (Сообщение 1191714)
Вот это вы прикиньте я все время думал, что w/h берутся относительно локальной системы координат объекта!

В локальной системе координат они никогда и не меняются (буквально). Все эти width, height, rotation, scaleX, scaleY, x, y, etc меняют только матрицу преобразования. За счет этого и достигается высокая скорость работы.
Цитата:

Сообщение от Zebestov (Сообщение 1191719)
Спецом проверил :) DO туда же! Куда катится мир…

Всегда так было и никто иного и не обещал. Об этом прямо написано в документации.

А там уже, кто чего себе придумал, извините...

Добавлено через 3 минуты
Вот как-то делал небольшой обзор.

Zebestov 10.02.2016 16:33

Цитата:

Сообщение от alatar (Сообщение 1191724)
В локальной системе координат они никогда и не меняются.

Не совсем так выразился. Думал, что ширина/высота берутся относительно повернутых вместе с объектом осей. А если уже таки нужно взять ширину и высоту описанного прямоугольника, то для этого и есть getBounds/getRect. Как-то так.

alatar 10.02.2016 16:39

Оси могут поворачиваться независимо, как быть в этом случае? Что вообще считать поворотом?
В общем это добавило бы только проблем и разночтений.

Zebestov 10.02.2016 17:08

Вложений: 1
Никаких разночтений — воспринимать все как если бы DO был обернут в контейнер-прокси, над которым производятся все действия, кроме масштаба по осям.

Наоборот, именно сейчас происходит непоняток. Сам суди:

Вложение 32082

Как мы видим, квадрат стал не ожидаемым ромбом, как если бы шириной считалась ширина описанного прямоугольника, а прямоугольником, как если бы шириной все же считалась именно ширина относительно повернутых осей, но при этом ширина эта теперь имеет значение, отличное от того, которое мы задали строкой выше, которое еще и фиг посчитаешь без дополнительных действий.

И вот теперь скажи мне, это ли не путаница:

1. Задали ширину 200;
2. Получили фактическую ширину ~142
3. Геттер выдает 170.7

Ну т.е. мало того что не получили ромб шириной 200, так мы еще имеем прямоугольник, с шириной не 200 и габаритами не 200.

Что тут понятного — пардон!

P.S.
Предупреждая попытку объяснить, откуда взялись эти числа, сообщаю, что их значения мне понятны — не так сложно проследить эту логику. Именно после этого я снова таки настаиваю, что она извращенная.

alatar 10.02.2016 17:43

Ну, как говорится, все абстракции рано или поздно "текут". Увы, это как раз тот случай, когда надо знать как это работает внутри.

Zebestov 10.02.2016 17:49

Ну т.е. при выборе вариантов, которые так или иначе требуют "понимания", выбрали самый нелепый? Тю!

alatar 10.02.2016 18:42

Не могу с тобой полностью согласиться.
Например, поверни одну из осей, как при этом должен визуально поменяться объект, если ему задать width? а если scale? Что при этом по-твоему должен возвращать width/height?

Zebestov 10.02.2016 18:51

Но ведь именно при текущем положении дел width = 200 и scaleX = 2.0 дают совершенно разный результат. И куда более логичным выглядит именно вариант со скейлом — когда ширина квадрата удвоится в сторону уже повернутой ранее оси X. Говоря иначе, матрицу следует складывать в привычной последовательности: scale, rotation, translate. А сейчас все наизнанку.

alatar 11.02.2016 12:10

Тут играет роль порядок задания свойств. Если width задать до rotation, то результат будет аналогичный scaleX. Для того, чтобы реализовать такое поведение как ты хочешь, пришлось бы добавить валидацию свойств для DisplayObject (типа как во Flex и Feathers для компонентов).
Ммм... в принципе можно реализовать для Stage3D :)

caseyryan 11.02.2016 12:22

В общем, самый доступный вариант тут - действительно обернуть его в спрайт :D

Godwarlock 12.02.2016 15:49

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


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

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