Как масштабировать около точки?
Я нахожу следующий код внутри 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
имеет смысл. Сначала переведите в точку, чтобы она стала новым источником, затем масштабируйте, а затем переверните перевод.