Аффинное преобразование Javafx - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 2 прямоугольника с координатами Rectangle1 (x = 100, y = 100, ширина = 200, высота = 50) и Rectangle2 (x = 100, y = 200, ширина = 200, высота = 50).Как установить для них аффинное преобразование, чтобы они вращались вокруг центра этих прямоугольников (точка x = 200, y = 175).Например, при 45 градусах:

enter image description here

enter image description here

Я устанавливаю вращение индивидуально

        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

Можно ли установить вращение для прямоугольников, не поворачивая ось координат?

Ответы [ 2 ]

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

Если вы не хотите использовать Analytics Geometry, тогда вы должны попытаться использовать группирующие объекты (в приведенном ниже коде указан класс контроллера и часть файла fxml).

public class Controller {

    @FXML
    private Group groupTwoRects;
    @FXML
    private Rectangle rectOne;
    @FXML
    private Rectangle rectTwo;
    @FXML
    private Button btnClick;

    @FXML
    public void btnClick() {
        groupTwoRects.setRotate(groupTwoRects.getRotate() + 45.0);
        System.out.println(rectOne.getRotationAxis());
        System.out.println(rectTwo.getRotationAxis());
    }
}

<AnchorPane prefHeight="600.0" prefWidth="600.0">
        <children>
            <Button fx:id="btnClick" layoutX="14.0" layoutY="161.0" mnemonicParsing="false" onAction="#btnClick" text="Click" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" />
        <Group fx:id="groupTwoRects" layoutX="62.0" layoutY="76.0" rotate="-53.1">
           <children>
              <Rectangle fx:id="rectOne" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="53.0" stroke="BLACK" strokeType="INSIDE" width="179.0" />
              <Rectangle fx:id="rectTwo" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="53.0" layoutY="95.0" stroke="BLACK" strokeType="INSIDE" width="179.0" />
           </children>
        </Group>
        </children>
</AnchorPane>
0 голосов
/ 27 ноября 2018
  1. Добавление обоих прямоугольников к общему Node
  2. Создание объекта Rotate
  3. Установка угла и оси поворотаточка вращения
  4. Применить вращение с помощью node.getTransforms.add(rotate)

Редактировать : В связи с вашим обновленным вопросом о сохранении оси при перемещении вращающегося объекта вокруг: Добавитькаждый повернутый объект в не повернутый контейнер.Теперь переместите этот контейнер вместо его содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...