JavaFX围绕中心旋转矩形?

时间:2017-03-03 15:04:45

标签: javafx rotation center rectangles

我正在尝试围绕其中心旋转一个矩形。使用GraphicsContext即gc将旋转绘制到画布。这是我的抽奖代码。

my_x

这会将矩形移动到其中心,然后围绕其左上角旋转矩形。我尝试减去两侧的长度和宽度的一半,但这只是让它飞到了整个地方。我很擅长数学,也许有人在这里更好的可以告诉我我做错了什么。

如果需要这些信息,我也存储了矩形的所有四个点(角)。

谢谢, 乔

2 个答案:

答案 0 :(得分:3)

围绕指定点的旋转需要由原点周围的平移变换和旋转组成,如下所示:

  1. 使用平移将旋转中心移动到原点。
  2. 围绕原点旋转
  3. 对第一次翻译使用反向翻译
  4. 您的代码中缺少第三部分。

    示例

    @Override
    public void start(Stage primaryStage) throws Exception {
        Canvas canvas = new Canvas(400, 400);
        double x = 50;
        double y = 100;
        double width = 100;
        double height = 200;
    
        GraphicsContext gc = canvas.getGraphicsContext2D();
        double rotationCenterX = (x + width) / 2;
        double rotationCenterY = (y + height) / 2;
    
        gc.save();
        gc.translate(rotationCenterX, rotationCenterY);
        gc.rotate(45);
        gc.translate(-rotationCenterX, -rotationCenterY);
    
        gc.fillRect(0, 0, width, height);
        gc.restore();
    
        Scene scene = new Scene(new Group(canvas));
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    您也可以简单地使用带有指定轴的Rotate来实现所需的效果:

    @Override
    public void start(Stage primaryStage) throws Exception {
        Canvas canvas = new Canvas(400, 400);
        double x = 50;
        double y = 100;
        double width = 100;
        double height = 200;
    
        GraphicsContext gc = canvas.getGraphicsContext2D();
        double rotationCenterX = (x + width) / 2;
        double rotationCenterY = (y + height) / 2;
    
        gc.save();
        gc.transform(new Affine(new Rotate(45, rotationCenterX, rotationCenterY)));
        gc.fillRect(0, 0, width, height);
        gc.restore();
    
        Scene scene = new Scene(new Group(canvas));
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

答案 1 :(得分:-1)

不知道为什么网上的所有答案都如此令人困惑?看在上帝的份上,就像下面这样简单。

Rectangle rect = new Reactangle(20, 20, 100, 50);
rect.setRotate(30); //rotate the rectangle around its center by 30 degrees.