Форум 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=184203)

ShockWave512 13.09.2012 15:55

Перевод системы координат в Евклидову
 
Вложений: 1
Встала задача перевести координаты флешового displayObject в нормализованную Евклидову систему координат.
Она "слегка" отличается от флешовой, такую вроде в школе проходят для всех функциональных 2Д графиков.
Красный спрайт - родитель, от него считаются координаты, то есть его ширина и высота = (1,1),
положение=(0,0), координаты родителя в евклидовой будут =(х:-1, у:1), (ширина=2, высота=2)
Вопрос состоит в формуле перевода, у меня что то совсем ничего в голову не приходит :(
Картинку с пояснениями прилагаю. Техническое задание от заказчика тоже (в самом низу).
http://www.flasher.ru/forum/attachme...1&d=1347533329
Цитата:

Техническое задание.
(-1, 1)--------(0, 1)--------(1, 1)
(-1, 0)--------(0, 0)--------(1, 0)
(-1, -1)-------(0, -1)-------(1, -1)
где точка (0, 0) центр спрайта
x и y - положение спрайта относительно центра всей области анимации
(если представить человека в профиль и выделить части голова, туловище, рука, нога,
то координаты спрайтов будут такие голова (0, 1), туловище (0, 0), рука (0, 0.5), нога (0, -0,5)).
используется нормализованная система

Tails 13.09.2012 16:14

Код AS3:

euclidY = -flashY;


ShockWave512 13.09.2012 16:40

Вложений: 1
2Tails - совсем не сходится, у меня еще исходная область становится "больше" в новом измерении
http://www.flasher.ru/forum/attachme...1&d=1347536439

Tails 13.09.2012 16:57

Код AS3:

var ration = 1.4;
euclidX = flashX*ration;
euclidY = -flashY*ration;

:)

ShockWave512 13.09.2012 17:03

Tails - 0.7 * 1.4 = 0.98
это спрайт почти на грани квадрата, совсем не то

Tails 13.09.2012 17:09

Ну я написал ответ на вопрос "Перевод системы координат в Евклидову". Она у вас на 1.4% "больше" флешовой, и отражена по y. Собственно формула и получается та, что я написал выше.

Или я вас не понял?

expl 13.09.2012 17:12

Офтопик: а в чём эскиз нарисован? А то может на вооружение инструмент взять

ShockWave512 13.09.2012 17:22

2expl - 3ds max

2Tails - согласен что я мог коряво все это описать, но там видно на рисунке что "площадь" увеличивается ровно в 2-а раза (200%), а координата центра "уходит в евклидову" (-1, 1), а координата максимальной "положительной" точки в (1, -1), самое сложное тут не преобразование размера объекта, тут очень все мутно для меня с координатами

http://www.flasher.ru/forum/attachme...1&d=1347539226

Tails 13.09.2012 17:33

Координаты чего? Точки центра красного спрайта?
Если я правильно понял, вы хотите использовать его как контейнер?

Сделайте тогда точку регистраций красного спрайта в верхнем левом углу, это сделает задачу на 20% проще.

Объясните что это у вас за зелёный квадрат который вам нужно двигать, где он находиться ? Внутри красного квадрата?

Объясните причём тут евклидовое пространство, нужно вводить и выводить координаты в нём?

i.o. 13.09.2012 17:45

ShockWave512, вы по какой формуле переводите "флеш" координаты в свои, что у вас площадь увеличивается аж 2 раза?

ShockWave512 13.09.2012 17:46

ок, по порядку
Цитата:

Сообщение от Tails (Сообщение 1095818)
Координаты чего? Точки центра красного спрайта?
Если я правильно понял, вы хотите использовать его как контейнер?

координата центра счисления (0,0), красный спрайт используется только как "исходное" пространство для отсчета, в "реальности" в пикселях он может быть и 100*200, 1.9*577.1, то есть совсем абстрактная площадь, не суть
Цитата:

Сообщение от Tails (Сообщение 1095818)
Сделайте тогда точку регистраций красного спрайта в верхнем левом углу, это сделает задачу на 20% проще.

не могу, красный квадрат это абстрактная вещь, она не может быть нигде кроме центра отсчёта, по сути её вообще нет, её нарисовал для наглядности, чтоб было видно как трансформируется пространство координат
Цитата:

Сообщение от Tails (Сообщение 1095818)
Объясните что это у вас за зелёный квадрат который вам нужно двигать, где он находиться ? Внутри красного квадрата?

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

Сообщение от Tails (Сообщение 1095818)
Объясните причём тут евклидовое пространство, нужно вводить и выводить координаты в нём?

да, мне нужно конвертировать координаты всех детей мувиклипа в указанные

вот исходник текста тех. задания, на всякий
Цитата:

Переделать экспорт анимации из редактора
формат такой

{
"loopCount": "integer",
"sprites": [{
"name": "string",
"anchorX": "float",
"anchorY": "float",
"id": "integer"
}, …
],
"animations": [{"frame": [{"id": "integer",
"x": "float",
"y": "float",
"r": "float",
"z": "integer",
"t": "float"
}, …
],...
},…
],
}

loopCount = 0 анимация зациклена. иначе повторяется столько раз, сколько указано

Массив sprites содержит информацию о всех спрайтах анимации
name - название спрайта (без расширения)
anchorX и anchorY - координаты якорной точки вокруг которой будет крутиться спрайт. использует нормализованную евклидову координатную систему, т.е.
(-1, 1)--------(0, 1)--------(1, 1)
(-1, 0)--------(0, 0)--------(1, 0)
(-1, -1)-------(0, -1)-------(1, -1)
где точка (0, 0) центр спрайта
id - уникальный номер спрайта

массив animations содержит все кадры анимации (состоит из элементов frame)

массив frame содержит информацию о всех ВИДИМЫХ (если информации о спрайте в конкретном кадре нет, значит его не видно) спрайтах данного кадра
id - ссылка на спрайт из массива sprites
x и y - положение спрайта относительно центра всей области анимации (если представить человека в профиль и выделить части голова, туловище, рука, нога, то координаты спрайтов будут такие голова (0, 1), туловище (0, 0), рука (0, 0.5), нога (0, -0,5)). используется нормализованная система (см. выше)
r - угол поворота спрайта (против часовой стрелки, в градусах)
z - z order спрайта. 0 - самый дальний слой. чем больше цифра, тем выше слой
t - время показа кадра (в сек)

i.o. 13.09.2012 17:47

Во флеше абсолютно такая же евклидова система координат, только Y напрвлен вниз, а не вверх. Откуда такие промахи в расчетах я просто недоумеваю

ShockWave512 13.09.2012 17:49

Цитата:

Сообщение от i.o. (Сообщение 1095819)
ShockWave512, вы по какой формуле переводите "флеш" координаты в свои, что у вас площадь увеличивается аж 2 раза?

я не перевожу еще ни по какой формуле, я её исчу на данный момент :)
площадь на самом деле не увеличивается, это так описана задача на картинке, что она увеличена, на самом деле она так визуально выглядит

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

Tails 13.09.2012 18:03

Ну так если масштабирования нет, координаты в эвклиде будут те-же, только игрик сменит знак и всё.

expl 13.09.2012 18:08

Цитата:

2expl - 3ds max
Спасиб, было понадеялся что-то по-проще появилось, ну да ладоно.

ShockWave512 13.09.2012 18:31

Цитата:

Сообщение от Tails (Сообщение 1095828)
Ну так если масштабирования нет, координаты в эвклиде будут те-же, только игрик сменит знак и всё.

не те же в любом случае, исходная имеет диапазон от 0 до 1
а новая от -1 до 1
масштабирование, есть но выглядит оно по другому
если у вас есть теория, просто посчитайте её на тестовых исходных точках например (0.1, 0.1) и (0.9, 0.9), если точка выползает за красное, значит ошибка, если точка находится в другом квадранте (например правый нижний сменился на левый верхний) тоже где то ошибка

i.o. 13.09.2012 18:46

Опробуйте
Код AS3:

function getCoord( src:Point ) : Point
{
    var dst:Point = new Point();
    dst.x = 2.0 * (src.x - 0.5);
    dst.y = 2.0 * (0.5 - src.y);
    return dst;
}


Tails 13.09.2012 18:48

Раз масштабирование в 2 раза, то и умножайте координаты на 2:
Код AS3:

var a = 0.1;
var b = 0.9;
 
trace(a*2);
trace(b*2);

Если новые координаты должны находиться в диапазоне -1:1 вычитаем из координат половину:
Код AS3:

var a = 0.1;
var b = 0.9;
 
trace(a*2-1);
trace(b*2-1);

Для получения евклида, используем полученные координаты, только для y меняем знак.

ShockWave512 13.09.2012 19:28

Вложений: 1
i.o. - спасибо, огромное, работает!
пока не поместил на макет, думал что не правильно :)
http://www.flasher.ru/forum/attachme...1&d=1347546485

Simplifier 13.09.2012 19:43

Похоже, что топикстартер запутался. В задании ничего не говорится о том, что масштаб координатных систем различается.
Цитата:

(-1, 1)--------(0, 1)--------(1, 1)
(-1, 0)--------(0, 0)--------(1, 0)
(-1, -1)-------(0, -1)-------(1, -1)
Скорее всего, это координаты сумм единичных векторов флешовой координатной системы в евклидовой. И видно, что они отличаются только знаком по у.

ShockWave512 13.09.2012 19:50

Цитата:

Сообщение от Simplifier (Сообщение 1095857)
Похоже, что топикстартер запутался.

ну если б не запутался, сюда бы наверно не стал писать :)


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

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