Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Позиция картинок в галерее: зависимость rotationZ от x свойства класса Bitmap (http://www.flasher.ru/forum/showthread.php?t=195183)

yasha005 01.03.2013 20:30

Позиция картинок в галерее: зависимость rotationZ от x свойства класса Bitmap
 
Вложений: 1
Уважаемые форумчане, никак не могу подобрать формулу для взаимосвязи между свойством x и свойством rotationZ класса Bitmap для правильного позиционирования изображений в галерее. Число картинок динамичное, ширина и высота у всех картинок одинаковая с учётом погрешности в 200 пикселей.

Sync 02.03.2013 02:05

cos(x)?

Wolsh 02.03.2013 11:31

Не вижу никакого rotationZ. Напрягитесь объяснить свою проблему.

yasha005 02.03.2013 13:29

Цитата:

Сообщение от Wolsh (Сообщение 1123172)
Не вижу никакого rotationZ. Напрягитесь объяснить свою проблему.

Cуть в том чтобы картинки спозиционировать ввиде листов открытой книги, при этом одна обложка книги перпиндикулярна другой обложки книги. А "листы" в "книге", имеют между собой одинаковый градус поворота (или расстояние по правому краю между собой), независимо от того сколько этих "листов" в "книге".

Sync 02.03.2013 13:40

угадал)

yasha005 02.03.2013 13:58

Цитата:

Сообщение от Sync (Сообщение 1123147)
cos(x)?

и что это нам даст? Я не могу уловить ход ваших мыслей. Поясните, пожалуйста.

Добавлено через 16 минут
Цитата:

Сообщение от Sync (Сообщение 1123195)
угадал)

Если мы возьём какое-либо изображение как вид сверху (или вид снизу, это не принципиально) и спроецируем ширину этого изображения на ось х, то получим прямоугольный треугольник, где шириной будет являться гипотенуза данного треугольника

Если я вас правильно понимаю, вы предлагаете вычислять зависимость угла наклона картинки посредством косинуса отношения длины прилежащего катета (т.е. проекции на ось х) к гипотенузе (т.е. к ширине изображения)?

Добавлено через 30 минут
Выходит что я ошиблася, надо искать зависисоть rotationY от угла наклона и количетва изображений.

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

Sync 02.03.2013 14:29

Цитата:

Сообщение от yasha005 (Сообщение 1123200)
Если мы возьём какое-либо изображение как вид сверху (или вид снизу, это не принципиально) и спроецируем ширину этого изображения на ось х, то получим прямоугольный треугольник, где шириной будет являться гипотенуза данного треугольника

Вы только что уничтожили мой мозг. я всю квартиру им забрызгал. Родина вас не просит.

Цитата:

Если я вас правильно понимаю, вы предлагаете вычислять зависимость угла наклона картинки посредством косинуса отношения длины прилежащего катета (т.е. проекции на ось х) к гипотенузе (т.е. к ширине изображения)?
никаких зависимостей углов я не предлагаю применять. Судя по приведенной вами картинке, угол между плоскостями абсолютно тупо равен 90/count
левая граница по координате х будет находиться в точке cos(num*90deg/count)*radius. правая граница будет находиться в точке x1 = cos(num*90deg/count)*(radius+width);
Нет никаких гениальных формул.
либо вы неправильно объясняете что вам надо.

yasha005 02.03.2013 14:47

Цитата:

Сообщение от Sync (Сообщение 1123206)
Вы только что уничтожили мой мозг. я всю квартиру им забрызгал. Родина вас не просит.



никаких зависимостей углов я не предлагаю применять. Судя по приведенной вами картинке, угол между плоскостями абсолютно тупо равен 90/count
левая граница по координате х будет находиться в точке cos(num*90deg/count)*radius. правая граница будет находиться в точке x1 = cos(num*90deg/count)*(radius+width);
Нет никаких гениальных формул.
либо вы неправильно объясняете что вам надо.

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

По сабжу: я всётаки считаю более правильным придерживаться такого алгоритма:
Код:

прилежащий катет (т.е. проекция на ось х) = ширина картинки * (количество картинок минус текущая позиция картинки в массиве)/количество картинок;
угол наклона = Math.acos(прилежащий катет / гипотенуза);


Sync 02.03.2013 14:53

вы надеетесь, что 9 картинок на четверть окружности дадут иной угол, нежели 10 градусов?
может уже расскажите простыми словам (без "зависимость", "отношение", "катет") что вам нужно получить в итоге и какие исходные данные?

yasha005 02.03.2013 16:24

Цитата:

Сообщение от Sync (Сообщение 1123209)
вы надеетесь, что 9 картинок на четверть окружности дадут иной угол, нежели 10 градусов?
может уже расскажите простыми словам (без "зависимость", "отношение", "катет") что вам нужно получить в итоге и какие исходные данные?

так я ж и говорю: угол наклона и будет как раз-таки опциональным в зависимости от количества картинок. Другими словами чем больше "листов" в "книге", тем более плотно они будут друг к другу размещены. А диапазон угла всегда будет постоянной величиной в интервале от 0 до 90 градусов.

Wolsh 02.03.2013 17:08

Ну так и при чем здесь катеты, арккосинусы и прочие гипотенузы? Без них 90 градусов никак не разделить на кол-во "страниц"?

yasha005 02.03.2013 17:38

Цитата:

Сообщение от Wolsh (Сообщение 1123218)
Ну так и при чем здесь катеты, арккосинусы и прочие гипотенузы? Без них 90 градусов никак не разделить на кол-во "страниц"?

Так-то логично, но так уж получилось что Sync ход моих мыслей направил по сложному пути. В итоге вот что получилось:

Код AS3:

var i:int = bitmapPict.length;
const count:uint = i;
while(--i > -1)
{
        bitmapPict[i].rotationY = Math.acos((count - i) / count) * 180 / Math.PI;
}


Ваш, Wolsh, вариант мне больше нравится, т.к. с ним будет легче позиционировать изображения при анимации, спсаибо за идею

Sync 02.03.2013 20:02

молчу-молчу. сообщения длиннее 1 строчки больше писать не буду.

yasha005 02.03.2013 20:18

Цитата:

Сообщение от Sync (Сообщение 1123242)
молчу-молчу. сообщения длиннее 1 строчки больше писать не буду.

Дело не в том из скольких строчек состоит сообщение

Вам, Sync, респект за идею, а Wolsh респект за идею более компактного варианта.

Добавлено через 47 минут
Более компактный вариант:

Код AS3:

var i:int = bitmapPict.length;
const count:uint = i;
while(--i > -1)
{
        bitmapPict[i].rotationY = ((count - i - 1) / count) * 90;
}
bitmapPict.reverse();

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

В любом случае, считаю, что оба варианта идеи имеют место быть. Просто тут уже дело вкуса.

Wolsh 03.03.2013 09:37

Цитата:

Ваш, Wolsh, вариант мне больше нравится
Цитата:

Сообщение от Sync (Сообщение 1123206)
Судя по приведенной вами картинке, угол между плоскостями абсолютно тупо равен 90/count [...] Нет никаких гениальных формул.

Цитата:

придётся преобразовывать массив изображений в обратный массив
А преобразовать формулу в обратную — не проще? Что-то типа bitmapPict[i].rotationY = i * count / 90;

Цитата:

не считаю его более компактным (лично для себя) [...] Просто тут уже дело вкуса.
Использовать один раз деление, чтобы узнать угол между листами, и затем одно умножение для каждого листа в цикле вместо монструозной тригонометрической формулы, считающей обратно собственные входные параметры только для того, чтобы раз в 10 замедлить выполнение кода и слегка подогреть процессор — это дело вкуса? Греческий эпос может нравиться Вам больше, чем японские хайку, но в программировании это — вопрос эффективности. И читабельности кода, разумеется.

yasha005 03.03.2013 10:33

Цитата:

Сообщение от Wolsh (Сообщение 1123294)
А преобразовать формулу в обратную — не проще? Что-то типа bitmapPict[i].rotationY = i * count / 90;

Использовать один раз деление, чтобы узнать угол между листами, и затем одно умножение для каждого листа в цикле вместо монструозной тригонометрической формулы, считающей обратно собственные входные параметры только для того, чтобы раз в 10 замедлить выполнение кода и слегка подогреть процессор — это дело вкуса? Греческий эпос может нравиться Вам больше, чем японские хайку, но в программировании это — вопрос эффективности. И читабельности кода, разумеется.

Позволю себе не согласиться с вами. Такое решение i * count / 90 не подходит по той причине, что картинок может быть больше 10, а значит угол разворота "книги" будет больше чем 90 градусов. За идею спасибо, но я всё-таки остановлюсь на своём решении.

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

Wolsh 03.03.2013 12:43

Фраза "что-то типа" не намекает Вам, что дальнейшее писано на коленке? ОК, уточняю: bitmapPict[i].rotationY = i * 90 / count;
Из-за Вашего творческого подхода к оформлению, там, несомненно, где-то еще и единица должна болтаться.
Но это уж Вам, как автору креативного цикла, решать, где. Мне лень расшифровывать эту красоту.


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

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