вращать (орбитировать) узел вокруг другого объекта (javafx-2)

у меня проблемы с созданием простой анимации вида солнце/земля.
В следующем примере круг должен вращаться вокруг прямоугольника.
Для этого я создаю новую группу, присоединяю прямоугольник со смещением 0 и окружность со смещением 50.
Теперь, когда группа вращается, я подумал, что прямоугольник должен вращаться вокруг себя, а окружность должна вращаться вокруг прямоугольника.

Но кажется, что обе формы имеют смещение и вращаются вокруг невидимого центра.

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // create root node
        Group root = new Group();
        Scene scene = new Scene(root, 640, 400);
        primaryStage.setScene(scene);

        // translate root node to center of the screen
        root.setTranslateX(320);
        root.setTranslateY(200);

        // create scene
        createScene(root);

        primaryStage.show();
    }

    private void createScene(Group root) {
        Group branch = new Group();
        root.getChildren().add(branch);

        // create a recangle, which will be added to the branch
        Rectangle r = new Rectangle(40, 20);
        branch.getChildren().add(r);

        // circle should orbit around the rectangle
        Circle c = new Circle(10);
        branch.getChildren().add(c);
        c.setTranslateY(-50);

        // rotate the branch
        Timeline rot = new Timeline();
        rot.setCycleCount(Timeline.INDEFINITE);
        rot.setRate(1);
        rot.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO, new KeyValue(
                        branch.rotateProperty(), 0)),
                new KeyFrame(Duration.seconds(5), new KeyValue(branch
                        .rotateProperty(), 360)));
        rot.playFromStart();

    }

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

person Chris    schedule 28.03.2012    source источник
comment
Для некоторой справочной информации, вот небольшой интерактивный пример изменения различных параметров вращения JavaFX.   -  person jewelsea    schedule 28.03.2012


Ответы (1)


Обратите внимание, что вращение любого объекта происходит вокруг его центра. Самый простой способ решить ваши проблемы — использовать StackPane вместо Group. StackPane по умолчанию помещает все объекты в центр.

private void createScene(Group root) {
    Pane branch = new StackPane();
    root.getChildren().add(branch);
person Sergey Grinev    schedule 28.03.2012
comment
круто спасибо, работает. я буду читать о разнице между этими типами. - person Chris; 28.03.2012