2016-11-30 236 views
0

我有一個旋轉方法的問題。我想圍繞它的中心旋轉一個圖形,但我不想旋轉畫布對象,只是其中的圖形。 artHorizo​​n是畫布對象(400,400) 或者,將座標系移動到convas對象的中心會更好嗎?JavaFX如何旋轉繪製圓心

這裏是一個繪製方法:

public void drawHorizon(GraphicsContext gc, double degrees, double translate) { 

     gc.translate(0, translate); 

     gc.rotate(degrees); 

     gc.setFill(Color.rgb(0, 61, 144)); 
     gc.fillRect(0, 0, artHorizon.getWidth() * 2, 150); 
     gc.setFill(Color.rgb(59, 41, 39)); 
     gc.fillRect(0, 150, 400, 150); 

    } 

和初始化:

@Override 
    public void initialize(URL location, ResourceBundle resources) { 

     GraphicsContext gc = artHorizon.getGraphicsContext2D(); 
     gc.rotate(20);//here I want to rotate gc around center 
     drawHorizon(gc, 0, 0); 


    } 
+0

要動態旋轉,或只有當你初始化你的程序? –

+0

在動畫過程中。 – PawelW

回答

0

如果要繞一個點

更換新的現有的變換,然後旋轉。一個setTransform最後兩個值是新的原點在畫布像素座標現在在哪裏x = 0和Y = 0

gc.setTransform(1.0, 0.0, 0.0, 1.0, artHorizon.getWidth()/2.0, 150.0); 
gc.rotate(degrees); 

原點在artHorizon.getWidth()/2150.0所以你必須從這一點借鑑。您將需要對角線寬度,以便填充整個畫布。

double len = Math.sqrt(
     artHorizon.getWidth() * artHorizon.getWidth() + 
     artHorizon.getHeight() * artHorizon.getHeight())/2.0; 

然後你渲染地平線從原點偏移

gc.fillRect(-len, -150, len * 2, 150); // top half 
// change colour 
gc.fillRect(-len, 0, len * 2, 400); // bottom half 

可以返回畫布回來

gc.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0); 
+0

它幫了很多!謝謝 – PawelW

0

默認你可以通過一個Rotate與指定到相應的支點Affine的構造函數。結果可以傳遞給GraphicsContexttransform方法。此外爲了確保Canvas已歸檔到邊緣,請添加一些偏移量。該Canvas的尺寸最大必將足夠了:

gc.transform(new Affine(new Rotate(20, artHorizon.getWidth()/2, artHorizon.getHeight()/2))); 
// gc.rotate(20); 
public void drawHorizon(GraphicsContext gc, double degrees, double translate) { 
    gc.translate(0, translate); 

    gc.rotate(degrees); 
    double maxDimension = Math.max(artHorizon.getWidth(), artHorizon.getHeight()); 

    gc.setFill(Color.rgb(0, 61, 144)); 
    gc.fillRect(-maxDimension, 0, maxDimension * 3, 150); 
    gc.setFill(Color.rgb(59, 41, 39)); 
    gc.fillRect(-maxDimension, 150, maxDimension * 3, 150); 
}