Вот пример. Использование Math.atan2
. Здесь используется Line
вместо ImageView
, но идея та же. Этот подход немного отличается от дубликата. Он использует Math.atan2
, чтобы найти угол между центром и точкой на сцене.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class QueAndStick extends Application
{
@Override
public void start(Stage primaryStage)
{
Circle cue = new Circle(300 / 2.0, 250 / 2.0, 5);
cue.setFill(Color.WHITE);
cue.setStroke(Color.BLACK);
Line stick = new Line(cue.getCenterX() + (cue.getRadius() + 5), cue.getCenterY(), cue.getCenterX() + (cue.getRadius() + 5 + 75), cue.getCenterY());
stick.setStrokeWidth(3);
stick.setFill(Color.BROWN);
Rotate rotate = new Rotate(45);
rotate.pivotXProperty().bind(cue.centerXProperty());
rotate.pivotYProperty().bind(cue.centerYProperty());
stick.getTransforms().add(rotate);
Pane root = new Pane(cue, stick);
root.setStyle("-fx-background-color: green");
Scene scene = new Scene(root, 300, 250);
scene.setOnMouseMoved((event) -> {
double newX = event.getSceneX();
double newY = event.getSceneY();
System.out.println(Math.toDegrees(Math.atan2(newY - cue.getCenterY(), newX - cue.getCenterX())));
rotate.setAngle(Math.toDegrees(Math.atan2(newY - cue.getCenterY(), newX - cue.getCenterX())));
});
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}