我正在做一个简单的模拟,并且在查找旋转的,大小异常的imageView节点的X和Y坐标时遇到了很多麻烦。 (蓝色位在前面)
目标是在旋转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));
}
以此类推,直到360。DRYyikes。
我应该如何处理?我使用的转换错误吗?我没有看到可用于此目的的方法吗?我知道必须有更好的方法。谢谢阅读。
答案 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();
}