![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
День добрый, имеется массив точек, координаты и углы которых указаны относительно родителя.
[{name:'root',x:0,y:0,angle:0}, {name:'branch1', x:0, y:100, angle:0, parent:'root'}, {name:'branch2', x:100, y:0, angle:10, parent:'branch1'}] Объект Joint представляю себе примерно так: public function Joint(x:int,y:int,angle:Number, parent:Joint=null){ var parent:Joint=parent; var transform:Matrix=new Matrix().createBox(1,1,angle||0,x||0,y||0); } public function getRelativeTranform(){ /*????*/ } p.s Относительные координаты постоянно меняются |
|
|||||
Я бы лучше посоветовал воспользовался готовыми методами: locatoToGlobal и globalToLocal для получения координат. В случае с самостоятельными расчётами, вам потом ещё придётся умножить конечные точки на абсолютную матрицу, что-бы получить итоговый результат.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
1.Это понятно, но у меня точка в пространстве и есть отдельный объект.
2.Видимо тут имеет значение порядок. Если перемножать рекурсивно сверху вниз, получаются косяки небольшие, но в целом похоже. Сейчас попробую снизу вверх. public function calcChildTransform(parentTransform:Matrix,result:Object) { var matrix:Matrix = parentTransform.clone(); matrix.rotate((baseTransform.r) * Math.PI / 180); matrix.translate(baseTransform.x, baseTransform.y); result[name]=matrix; } locatoToGlobal - вернет только x,y . Вращение все равно нужно будет вычислять вручную. UPD , да обход снизу вверх - исправил ситуацию, Спасибо, теперь считается правильно. Смущает только то, что теперь нельзя обсчитать все за один обход( В ObjectContatiner это так же реализовано? Последний раз редактировалось faraday; 15.03.2015 в 21:29. |
|
|||||
|
Lorem ipsum
|
Можно подробней про один проход, почему нельзя?
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
Нужно подняться вверз из каждого узла. то есть многие узлы будут пройдены по несколько раз.
|
|
|||||
|
Lorem ipsum
|
Кэширование матриц решит. Допустим есть дерево, (root)-(parent)-(child1, child2, child3). Лишь первый раз мы рекурсивно пройдемся от child1 к root и в каждом элементе (хотя в данном случае это нужно только для parent, но мы же рассматриваем общий алгоритм) закэшируем полученный результат — матрицу относительно stage. После этого child2 и child3 уже не будут бегать вверх, а лишь используют кэшированную (прямую или обратную, в зависимости от задач) матрицу своего родителя — объекта parent.
Добавлено через 1 минуту Разумеется, это лишь один из вариантов. Как правило подобное кэширование происходит сверху-вниз по инициативе родителя, когда он трансформируется, что и приводит к необходимости пересчитать stageMatrix у всех детей. Но это уже совсем общий подход. Можно сделать и так, чтобы сразу привыкать к хорошему ![]()
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
Да, спасибо. Но во время анмаиции каждый узел обновляется по enterFrame, соответтственно и пересчет в глобальные координаты. Так что кеширование тут не даст ощутимого результата.
Добавлено через 28 минут И еще вопрос, как правильно в виде матрицы записать следующее преобразование: То есть нужно повернуть по центру объект, а потом сместить его и флипнуть по высоте. Никак не могу понять правильный порядок операций |
|
|||||
|
Lorem ipsum
|
Вообще-то даст. И тем более ощутимым будет этот результат, чем больше будет детей и чем глубже будет вложенность.
Цитата:
// готовим матрицу var matrix:Matrix = new Matrix(); matrix.translate(-attachment.width / 2, -attachment.height / 2); matrix.scale(1, -1); // если нужно сначала повернуть, а лишь потом флипнуть matrix.rotate(rotation); // следует поменять местами эти две строки matrix.translate(offsetX, offsetY); // применяем матрицу (как видно, cont и не нужен вовсе) attachment.transform.matrix = matrix; Более наглядно и, в то же время, подробно здесь.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
Спасибо)
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:42. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|