2013-10-20 91 views
1

我的工作中,我使用仿射變換移動圓形物體周圍的JPanel的一個項目,但我沒有看到的影響我會方面。Java的仿射變換量表()

我創建使用區級建設性的幾何形狀。我將它的位置和大小設置爲構造函數的一部分與

// Set location and size 
AffineTransform at = new AffineTransform(); 
at.translate(x, y); 
at.scale(size, size); 

shape.transform(at); 

這似乎工作正常。我看到的問題是當我單獨調用重新調整形狀時。

/** 
* Scales this shape uniformly by the 
* amount of scale about the origin 
* @param scale - double 
*/ 
public void scaleBy(double scale) 
{ 
    double cx = this.getBounds2D().getCenterX(); 
    double cy = this.getBounds2D().getCenterY(); 
    double size = this.getBounds2D().getWidth(); 

    System.out.println("Before ~ Size: " + size + " | Scale: " + scale); 

    AffineTransform at = new AffineTransform(); 


    at.translate(cx, cy); 
    at.scale(scale, scale);  
    at.translate(-cx, -cy); 
    shape.transform(at); 

    System.out.println("After ~ Size: " + size + " | Scale: " + scale); 
} 

的打印報表顯示,有大小沒有變化之前和之後調用:

Before ~ Size: 159.61132183122953 | Scale: 0.9703729137903474 
After ~ Size: 159.61132183122953 | Scale: 0.9703729137903474 
Before ~ Size: 84.00595885854187 | Scale: 1.0692249107993637 
After ~ Size: 84.00595885854187 | Scale: 1.0692249107993637 

我想我的問題是沒有,直到重繪()調用時的變換不會發生?如果是這樣,限制大小以保持形狀在30.0到150.0之間的一個好方法是

+0

轉型不會影響您的變量 – MadProgrammer

+0

雖然「CX」和「CY」我不希望改變,應該不是「大小」反映了在形狀內部調整大小的改變? – jbolt

+0

'變形'不可能改變原始形狀,而是返回一個變形的形狀......但我不知道'形狀'是什麼所以很難說.... – MadProgrammer

回答

1

您正在打印從應用變換之前獲得的局部變量之前的的大小和比例。嘗試從形狀中獲取實際值。

+0

我是這樣做的,我從調用的類(它顯示正確的值),但不應該在調用轉換後反映當前的位置和大小特徵的局部變量?我錯過了一個關鍵概念嗎? – jbolt

+0

顯然是這樣的 - 這行「double size = this.getBounds2D()。getWidth()」獲得該值以及其後的方法範圍內的常量(永遠不會更新它)。但是,您可以打印兩次,就像在兩個println語句中的值和之前一樣。局部變量永遠不會改變狀態,除非你明確地給它們賦予不同的值 – Durandal

+0

我在調用中挖了一點點,它返回一個緩存副本。你是正確的,它不會改變,直到它再次被調用。 – jbolt