JavaFX是否获得旋转的imageView的角坐标?

时间:2018-08-20 23:56:31

标签: java javafx rotation line

我正在做一个简单的模拟,并且在查找旋转的,大小异常的imageView节点的X和Y坐标时遇到了很多麻烦。 (蓝色位在前面)

robot.png

目标是在旋转imageView之后找出相对于其指向的XY坐标。我可以找到imageView相对于其起始位置的角度,但是我不知道如何获取imageView相对于该角度的XY坐标。由于.setRotate(angle)方法不会更改imageView的X和Y位置,因此我应该如何查找imageView所面对的点?

我正在使用的旋转和imageView的最小示例:

Main.java

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();

        primaryStage.setScene(new Scene(root, 500, 500));

        Image robotImage = null;

        try {
            robotImage = new Image(new FileInputStream("res\\robot.png"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        ImageView robot = new ImageView(robotImage);
        robot.setLayoutX(125);
        robot.setLayoutY(125);

        System.out.println("PreRotate X: " + robot.getLayoutX() + "PreRotate Y: " + robot.getLayoutY());
        robot.setRotate(45);
        System.out.println("PostRotate X: " + robot.getLayoutX() + "PostRotate Y: " + robot.getLayoutY());
        root.getChildren().add(robot);

        primaryStage.show();
    }


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

我已经尝试过使用imageView的边界以及位于imageView顶部的线条,但这需要我每次imageView更改其max / min x /时都找到新的max / min x / y y。

例如:

        if (turnAngle < 35) {
            directionLine.setStartX(robotLeftRightAngle.getBoundsInParent().getMaxX());
            directionLine.setStartY(robotLeftRightAngle.getBoundsInParent().getMinY());
            directionLine.setEndX(robotRightLeftAngle.getBoundsInParent().getMinX() + ((robotLeftRightAngle.getBoundsInParent().getMaxX() - robotRightLeftAngle.getBoundsInParent().getMinX()) / 2));
            directionLine.setEndY(robotRightLeftAngle.getBoundsInParent().getMinY() + ((robotLeftRightAngle.getBoundsInParent().getMinY() - robotRightLeftAngle.getBoundsInParent().getMinY()) / 2));
        }
        else if (turnAngle < 55) {
            directionLine.setStartX(robotLeftRightAngle.getBoundsInParent().getMaxX());
            directionLine.setStartY(robotLeftRightAngle.getBoundsInParent().getMaxY());
            directionLine.setEndX(robotRightLeftAngle.getBoundsInParent().getMinX() + ((robotLeftRightAngle.getBoundsInParent().getMaxX() - robotRightLeftAngle.getBoundsInParent().getMinX()) / 2));
            directionLine.setEndY(robotRightLeftAngle.getBoundsInParent().getMinY() + ((robotLeftRightAngle.getBoundsInParent().getMaxY() - robotRightLeftAngle.getBoundsInParent().getMinY()) / 2));
        }

Yikes

以此类推,直到360。DRYyikes。

我应该如何处理?我使用的转换错误吗?我没有看到可用于此目的的方法吗?我知道必须有更好的方法。谢谢阅读。

1 个答案:

答案 0 :(得分:3)

我不确定我是否100%理解了这个问题。坐标系之间的转换,但是很难从描述中分辨出您需要在哪个坐标系之间进行转换,因此我假设您想在<div class="left"> <ul> <li><a href="#1">•</a></li> <li><a href="#2">•</a></li> <li><a href="#3">•</a></li> <li><a href="#4">•</a></li> <li><a href="#5">•</a></li> </ul> </div> <div id="1"></div> <div id="2"></div> <div id="3"></div> <div id="4"></div> <div id="5"></div>的坐标系和robot的坐标系之间进行转换。

可以使用group从节点的坐标系转换为适应所有变换的父级坐标系。 (localToParent可以实现逆变换,但是在这种情况下,这似乎并不是必需的变换。)

以下示例将一行的起点和终点修改为parentToLocal坐标系中Rectangle的左上角坐标和一个点,位于Rectangle上方100 px:

@Override
public void start(Stage primaryStage) {
    Group root = new Group();

    primaryStage.setScene(new Scene(root, 500, 500));

    Rectangle robot = new Rectangle(100, 20, Color.RED);
    robot.setLayoutX(125);
    robot.setLayoutY(125);
    Line line = new Line(125, 125, 125, 25);

    robot.rotateProperty().addListener(o -> {
        Point2D start = robot.localToParent(0, 0);
        Point2D end = robot.localToParent(0, -100);
        line.setStartX(start.getX());
        line.setStartY(start.getY());
        line.setEndX(end.getX());
        line.setEndY(end.getY());
    });

    RotateTransition rotateTransition = new RotateTransition(Duration.seconds(5), robot);
    rotateTransition.setCycleCount(Animation.INDEFINITE);
    rotateTransition.setFromAngle(0);
    rotateTransition.setToAngle(360);
    rotateTransition.setInterpolator(Interpolator.LINEAR);
    rotateTransition.play();

    root.getChildren().addAll(robot, line);

    primaryStage.show();
}