2013-11-15 96 views
2

我發現下面的代碼中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

UPDATE

我的錯。

順序變換修改意味着從右邊開始的矩陣乘法。所以,最後應用的修改在變換時首先工作,因爲變換是從左邊的矩陣乘法。

回答

1

PAffineTransform中的順序與以下事實有關:Piccol2D中的每個節點都有一個仿射變換,該仿射變換爲該節點定義了局部座標系。

通常,要對特定點進行縮放,首先要對物體進行平移,以使點位於原點。然後執行縮放,然後執行原始翻譯的反轉以將固定點移回其原始位置。

PNode有其自己的本地座標系,原點爲(0,0)。所以當在節點上執行scaleAboutPoint()時,在PAffineTransform中定義的順序是有意義的。首先,翻譯成這個點,使它成爲新的起源,然後縮放,然後翻譯翻譯。