JavaFX如何旋转绘制它的圆心

时间:2016-11-30 22:18:59

标签: java canvas javafx

我遇到了旋转方法的问题。我想围绕它的中心旋转一个绘图,但我不想旋转Canvas对象,只是它内部的绘图。 artHorizo​​n是canvas Object(400,400) 或者将坐标系移动到convas对象的中心可能会更好吗?

这是一种绘图方法:

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);


    }

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可以将Rotate与指定的Affine构造函数一起传递给transform。结果可以传递给GraphicsContext的{​​{1}}方法。此外,为确保将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);
}