根据旋转角度更改 ImageView 位置

Changing ImageView position based on angle of rotation

我正在尝试让一个ImageView根据它面向的方向改变它的位置。

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class Demo extends Application {

    public void start(Stage window) {
        window.setTitle("Changing ImageView position based on angle of rotation");

        int speed = 10; // You can modify the speed here

        ImageView imageView = new ImageView(new Image("https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcTBJoRKh1UKimWTSLdabW2b8RSLDeSgMfSqqg&usqp=CAU"));
        imageView.setX(100);
        imageView.setY(100);

        imageView.setRotate(65); // This is where you can change the angle of rotation

        Group root = new Group();
        root.getChildren().add(imageView);
        Scene scene = new Scene(root);
        window.setScene(scene);

        final long[] lastNanoTime = {System.nanoTime()};

        new AnimationTimer() {
            @Override
            public void handle(long currentTime) {
                double elapsedTime = (currentTime - lastNanoTime[0]) / 1000000000.0;
                lastNanoTime[0] = currentTime;

                imageView.setX(imageView.getX() + Math.sin(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
                imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);

            }
        }.start();

        window.show();
    }


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

以上代码是基于我正在使用的代码。您可以相应地调整度数以查看问题。 ImageView 不会朝它所面对的方向移动。注意:为了这个演示,我在网上找到了一个随机的 .png 文件。您可以在自己的代码中替换为不同的图像,以便更好地可视化问题。

问题是,ImageView 没有朝它面对的方向移动。当垂直方向(0° 或 180°)时,ImageView 向后移动,但当水平方向(90° 或 270°)时,它会像它应该的那样直线向前移动。当沿对角线方向时,它会在两者之间移动。

我做错了什么,我该如何解决?

y轴方向向下。因此,当角度为 0 并增加 y 值时,您将向下移动。
要使图像在角度为 0 时向上移动,只需更改增量符号:
imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);


imageView.setY(imageView.getY() - Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);


所以角度为 0 应该向上移动图像,90 度向右,180 度向下等等。