2012-10-02 56 views
1
AffineTransform at; 
    Graphics2D g2 = (Graphics2D)g; 

    g2.setColor(Color.black); 

    at = new AffineTransform(); 
    at.setToTranslation(x, y); 
    at.setToRotation(theta); 
    g2.setTransform(at); 
    g2.drawPolygon(points); 

我的代碼在x和y繪製三角形...當我按a和d三角形旋轉..但是當我按w和s時,三角形不會改變它x和y。Java旋轉和使用Graphics2d繪圖

的變量是正確的..它翻譯日常..我不知道這裏也有我錯了..

如果我這樣做:

AffineTransform at; 
    Graphics2D g2 = (Graphics2D)g; 

    g2.setColor(Color.black); 

    at = new AffineTransform(); 
    at.setToTranslation(x, y); 
    g2.setTransform(at); 
    g2.drawPolygon(points); 

    at.setToRotation(theta); 
    g2.setTransform(at); 
    g2.drawPolygon(points); 

一個旋轉和一個移動..那麼爲什麼我不能在繪畫之前應用這兩種翻譯?

回答

0
AffineTransform at; 
    Graphics2D g2 = (Graphics2D)g; 

    g2.setColor(Color.black); 

    at = new AffineTransform(); 

    at.translate(x, y);  
    at.rotate(theta); 
    g2.setTransform(at); 
    g2.drawPolygon(points); 

我用錯了東西..旋轉和平移是我所需要的功能。

0

從甲骨文文檔:

要添加的座標變換,可使用小波變換,旋轉,縮放或剪切 方法。 setTransform方法僅用於在渲染之後恢復原始Graphics2D變換 。

只能有一個轉換,您可以在其中concatinate例如新的轉換爲旋轉法:

地連接了當前的Graphics2D Transform與翻譯 旋轉變換。後續渲染通過轉換 進行轉換,該轉換通過轉換爲指定位置構造, 按指定的弧度旋轉,並且以原始翻譯的量翻譯相同的量。

還有一個警告:

警告:此方法不應該被用來申請一個新的座標 之上將現有的轉換,因爲Graphics2D的可能 已經有一個轉換,是需要用於其他目的,如 呈現Swing組件或應用縮放轉換爲 調整打印機的分辨率。

0

我想你需要將兩個轉換連接成一個AffineTransformation。

AffineTransform at, toConcatenate; 
Graphics2D g2 = (Graphics2D)g; 

g2.setColor(Color.black); 

at = new AffineTransform(); 
toConcatenate = new AffineTransform(); 

at.setToTranslation(x,y); 
toConcatenate.setToRotation(theta); 
at.concatenate(toConcatenate); 
g2.setTransform(at) 
g2.drawPolygon(points); 

我根據這在很大程度上對甲骨文網站上發現一個教程在http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html

我覺得你的代碼不起作用的原因是「該的setTransform方法將覆蓋Graphics2D對象的當前轉換'你用第二個轉換覆蓋第一個轉換,而不是連接這兩個轉換。

希望這有助於