Поверните группу прямоугольников вокруг их общего центра - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть несколько прямоугольников, которым я назначаю поворот один за другим ((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 голосов
/ 21 ноября 2018

Используйте преобразование 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();
}

Если вы планируете применить несколько преобразований, вам может потребоваться настроить код для нахождения точки поворота, чтобы использовать преобразованиядля расчета границ ...

0 голосов
/ 21 ноября 2018

Если вы поместите все прямоугольники в общий 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...