【问题标题】:JavaFX how to rotate drawing round center of itJavaFX如何旋转它的圆形中心
【发布时间】:2016-12-01 15:44:14
【问题描述】:

我的旋转方法有问题。我想围绕它的中心旋转一个绘图,但我不想旋转 Canvas 对象,只是它里面的绘图。 artHorizo​​n 是画布对象(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);


    }

【问题讨论】:

  • 您想动态旋转它还是只在您初始化程序时旋转它?
  • 程序期间动态。

标签: java canvas javafx


【解决方案1】:

如果你想围绕一个点旋转

用新的变换替换现有的变换,然后旋转。 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);

【讨论】:

  • 帮助很大!谢谢
【解决方案2】:

您可以传递一个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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多