AS3: получение масштаба объекта Matrix - PullRequest
1 голос
/ 14 марта 2011

Чаще всего задаются вопросы о том, как масштабировать объект DisplayObject, и ответ обычно заключается в использовании матрицы.

Мой вопрос заключается в том, как получить шкалу матрицы (scaleX и scaleY)?

Существует метод Matrix.scale для установки scaleX и scaleY, но он не возвращает значение, и не существует других свойств для его считывания.

Причина, по которой я спрашиваю,Я использую объект скрытый глубоко в списке отображения, и каждый может быть преобразован.Поэтому я использую метод получения дочернего объекта sprite.transform.concatenatedMatrix, но сейчас застрял на том, как считывать с него шкалу.

Есть ли в доме какой-нибудь математик?

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

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

Например,с учетом transform от объекта DisplayObject и использованием Matrix3D scaleX будет получено следующим образом:

transform.matrix3D.deltaTransformVector(Vector3D.X_AXIS).length

Или, если вы используете составную 2D матрицу, scaleY будет:

transform.concatenatedMatrix.deltaTransformPoint(new Point(0,1)).length

Обратите внимание, что функции deltaTransform* игнорируют эффекты преобразования матриц, которые не влияют на масштабирование.

1 голос
/ 19 мая 2015

Вы можете получить шкалы x и y матрицы, даже когда она повернута.

Вот код:

public static function getScaleX(m:Matrix):Number
{
    return Math.sqrt(Math.pow(m.a + m.b, 2));
}

public static function getScaleY(m:Matrix):Number
{
    return Math.sqrt(Math.pow(m.c + m.d, 2));
}

Объяснение:

Я нашелчто A B C D проще воспринимать как точки, которые определяют оси x и y в преобразованном координатном пространстве.A, B - это позиция первой точки преобразованной оси x (единичная матрица имеет их как 1, 0, которая не преобразуется), а C, D - это положение первой точки преобразованной оси y (единица.значения 0, 1).

Если у нас есть матрица, которая масштабирует ось х на 2, тогда A, B будет 2, 0.Остальные точки на оси x будут находиться на таком же расстоянии от последней (поэтому на 2 точки дальше от последней).

Если у нас есть матрица, которая будет вращаться на 90 градусов по часовой стрелке, то A, B будет0, 1 (указывающая ось x вдоль положительной стороны оси y) и C, D будет -1, 0 (направленная ось y вниз по отрицательной стороне оси x).

Шкалаось х - это расстояние до первой точки.В сценариях, которые я упомянул, масштаб легко найти.В предыдущем примере A, B равно 0, 1, поэтому масштаб равен 1. Если вращение не включено с шагом 90 градусов, вы можете найти длину отрезка от 0, 0 до A, B, используя теорему Пифагора.: sqrt (a ^ 2 + b ^ 2) = c.Это то, что делает мой код.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 15 марта 2011

у вас есть доступ к открытым свойствам a и d объекта матрицы, которые представляют масштабирование по осям X и Y соответственно:

package
{
//Imports
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.display.Shape;

//Class
public class Test extends Sprite
    {
    //Constructor
    public function Test()
        {       
        var sh:Shape = new Shape();
        sh.graphics.beginFill(0xFF0000, 1.0);
        sh.graphics.drawRect(0, 0, 100, 100);
        sh.graphics.endFill();

        var scaleMatrix:Matrix = new Matrix();
        scaleMatrix.scale(4, 6);

        sh.transform.matrix = scaleMatrix;

        addChild(sh);

        trace("Matrix X Scale: " + scaleMatrix.a, "\nMatrix Y Scale: " + scaleMatrix.d);
        }
    }
}

// Matrix X Scale: 4 
// Matrix Y Scale: 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...