Как масштабировать около точки?

Я нахожу следующий код внутри PAffineTransform:

/**
     * Scales the transform about the given point by the given scale.
     * 
     * @param scale to transform the transform by
     * @param x x coordinate around which the scale should take place
     * @param y y coordinate around which the scale should take place
     */
    public void scaleAboutPoint(final double scale, final double x, final double y) {

        //TODO strange order

        translate(x, y);
        scale(scale, scale);
        translate(-x, -y);
    }

Не будет ли правильным сделать обратное:

        translate(-x, -y);
        scale(scale, scale);
        translate(x, y);

Все используемые методы такие же, как в AffineTransform,

ОБНОВИТЬ

Виноват.

Последовательное преобразование означает умножение матрицы справа. Итак, последняя примененная модификация работает в первую очередь при преобразовании, потому что преобразование - это умножение матрицы слева.

1 ответ

Заказ в PAffineTransform связано с тем, что каждый узел в Piccol2D имеет аффинное преобразование, которое определяет локальную систему координат для этого узла.

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

PNode имеет свою собственную локальную систему координат с началом координат в (0, 0). Так когда scaleAboutPoint() выполняется на узле, порядок, определенный в PAffineTransform имеет смысл. Сначала переведите в точку, чтобы она стала новым источником, затем масштабируйте, а затем переверните перевод.

Другие вопросы по тегам