围绕其公共中心旋转一组矩形

时间:2018-11-21 11:06:15

标签: java javafx

我有几个矩形,它们一一指定旋转((javafx.scene.shape.Rectangle) shape).rotateProperty().bind(rotate); 例如45度 enter image description here

enter image description here

我的矩形围绕其中心旋转。请告诉我如何使敌人围绕他们的共同中心成几个直角。 enter image description here

要得到这样的东西 enter image description here

this.rotate.addListener((obs, old, fresh) -> {
for (VObject vObject : children ) {
vObject.rotate.set(this.rotate.get());
}
});
这就是我添加旋转的方式。如何指定角度

更新:我使用了以下建议,现在我分别为每个矩形设置了旋转角度。 (选择仍然有些错误)

            this.rotate.addListener((obs, old, fresh) -> {
            Rotate groupRotate = new Rotate(rotate.get(),
                    this.x.getValue().doubleValue() + this.width.getValue().doubleValue() / 2 ,
                    this.y.getValue().doubleValue() + this.height.getValue().doubleValue() / 2);
            for (VObject vObject : children ) {
                vObject.getShape().getTransforms().clear();
                vObject.getShape().getTransforms().add(groupRotate);
            }
        });

enter image description here enter image description here 但是现在,轴也随着旋转而旋转。

enter image description here

是否可以在不旋转坐标轴的情况下将旋转设置为矩形?

2 个答案:

答案 0 :(得分:5)

如果将所有矩形都放在一个公共Group中,则可以一次旋转它们:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RotateAllApplication extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();

        // the common group
        Group group = new Group();
        group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
                new Rectangle(110, 10, 80, 40), //
                new Rectangle(10, 110, 80, 40), //
                new Rectangle(110, 110, 80, 40));

        // rotate the group instead of each rectangle
        group.setRotate(45.0);

        root.setCenter(group);

        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

更新:如果您不想创建父Group对象,则可以将相同的旋转变换应用于每个子对象。尽管Node#setRotate(double)总是围绕节点的中心旋转,但是向Node#getTransforms()添加变换更为通用,而不仅限于简单的旋转。

以下语句将绕父坐标系的点(100.0/100.0)应用于列表中的所有子项:

childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));

答案 1 :(得分:4)

使用Rotate变换并指定适当的枢轴点:

@Override
public void start(Stage primaryStage) throws IOException {
    Pane pane = new Pane();
    pane.setPrefSize(600, 600);
    Rectangle[] rects = new Rectangle[4];
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
            rects[i * 2 + j] = rect;
            pane.getChildren().add(rect);
        }
    }

    Slider slider = new Slider(0, 360, 0);

    double minX = Double.POSITIVE_INFINITY;
    double minY = Double.POSITIVE_INFINITY;
    double maxX = Double.NEGATIVE_INFINITY;
    double maxY = Double.NEGATIVE_INFINITY;

    Rotate rotate = new Rotate();

    // find pivot point     
    for (Rectangle rect : rects) {
        double val = rect.getX();
        if (minX > val) {
            minX = val;
        }
        val += rect.getWidth();
        if (maxX < val) {
            maxX = val;
        }

        val = rect.getY();
        if (minY > val) {
            minY = val;
        }
        val += rect.getHeight();
        if (maxY < val) {
            maxY = val;
        }

        rect.getTransforms().add(rotate);
    }
    rotate.setPivotX(0.5 * (maxX + minX));
    rotate.setPivotY(0.5 * (maxY + minY));
    rotate.angleProperty().bind(slider.valueProperty());
    Scene scene = new Scene(new VBox(10, pane, slider));
    primaryStage.setScene(scene);
    primaryStage.sizeToScene();
    primaryStage.show();
}

如果您打算应用多个变换,则可能需要调整代码以找到枢轴点,以使用变换来计算边界...