JavaFx 光标测量
JavaFx cursor measurement
我正在设计一个应该能够在现实世界中定位自己的小型系统,它基本上是一辆装有 PC 的电动遥控车。这辆车应该能够在现实世界中导航并知道它在地图上的位置。因为它需要很好的精度,GPS 不是一个选择(我能得到的最好的是 4 米,远远超过我可以接受的)并且以任何方式对轮子进行编码对于我的预算来说都太昂贵了,所以解决方法是放置在这辆车下放置一个鼠标,并使用它的反馈作为相对定位系统。
我的第一个想法是计算两个瞬间之间的像素距离差(使用计时器),我什至尝试使用 mouseMoved 事件应用相同的原理,但问题仍然存在:如果我改变鼠标速度,计算出的距离也不同
至此我没有别的想法,你觉得我的做法有什么问题吗?
public class Main extends Application {
public static void main(String args[]) {
launch(args);
}
private double cmToPixel = 1;
private int totalX;
private int totalY;
private Robot robot;
private int counter;
@Override
public void start(Stage primaryStage) throws Exception {
VBox pane = new VBox();
pane.setFillWidth(false);
pane.setMinWidth(200);
javafx.scene.control.TextArea textArea = new TextArea();
javafx.scene.control.TextArea logArea = new TextArea();
javafx.scene.control.TextArea debugArea = new TextArea();
pane.getChildren().addAll(textArea, logArea, debugArea);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.centerOnScreen();
robot = new Robot();
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
scene.setOnMouseMoved(e -> {
double deltaX = e.getX() - Screen.getPrimary().getBounds().getWidth() / 2;
double deltaY = Screen.getPrimary().getBounds().getHeight() / 2 - e.getY() ;
totalX += deltaX;
totalY += deltaY;
textArea.appendText((totalX / cmToPixel) + " - " + (totalY / cmToPixel) + "\n");
debugArea.appendText(deltaX+" - "+deltaY+"\n");
logArea.appendText("Center: ["+(int) (Screen.getPrimary().getBounds().getWidth() / 2)+";"+(int) (Screen.getPrimary().getBounds().getHeight() / 2)+"] cursorPosition: "+e.getX()+" - "+e.getY()+"\n");
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
});
primaryStage.show();
primaryStage.setFullScreen(true);
}}
如果你想重现我的结果,只需在一张纸上标记两行,然后尝试 运行 以不同的速度在这些行之间移动鼠标,同时注意程序
报告的鼠标设备距离取决于您移动鼠标的速度。如果鼠标用于制造它的目的,这通常是需要的,但在您的情况下,这是一个问题。我会尝试在您的鼠标设置中切换此功能。也许这篇 link 可以帮到你。
https://askubuntu.com/questions/698961/disable-mouse-acceleration-in-ubuntu-15-10
如果您正在阅读这篇文章post,您可能想知道,是的,问题出在加速上,即使 "disabled" 有些事情仍然无法解决,我也解决了这个问题通过将 PS2 鼠标连接到 Arduino,并通过 JSSC 我询问自上次检查以来的 delta X 和 Y(在这里查看 http://www.instructables.com/id/Optical-Mouse-Odometer-for-Arduino-Robot/)
我正在设计一个应该能够在现实世界中定位自己的小型系统,它基本上是一辆装有 PC 的电动遥控车。这辆车应该能够在现实世界中导航并知道它在地图上的位置。因为它需要很好的精度,GPS 不是一个选择(我能得到的最好的是 4 米,远远超过我可以接受的)并且以任何方式对轮子进行编码对于我的预算来说都太昂贵了,所以解决方法是放置在这辆车下放置一个鼠标,并使用它的反馈作为相对定位系统。
我的第一个想法是计算两个瞬间之间的像素距离差(使用计时器),我什至尝试使用 mouseMoved 事件应用相同的原理,但问题仍然存在:如果我改变鼠标速度,计算出的距离也不同
至此我没有别的想法,你觉得我的做法有什么问题吗?
public class Main extends Application {
public static void main(String args[]) {
launch(args);
}
private double cmToPixel = 1;
private int totalX;
private int totalY;
private Robot robot;
private int counter;
@Override
public void start(Stage primaryStage) throws Exception {
VBox pane = new VBox();
pane.setFillWidth(false);
pane.setMinWidth(200);
javafx.scene.control.TextArea textArea = new TextArea();
javafx.scene.control.TextArea logArea = new TextArea();
javafx.scene.control.TextArea debugArea = new TextArea();
pane.getChildren().addAll(textArea, logArea, debugArea);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.centerOnScreen();
robot = new Robot();
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
scene.setOnMouseMoved(e -> {
double deltaX = e.getX() - Screen.getPrimary().getBounds().getWidth() / 2;
double deltaY = Screen.getPrimary().getBounds().getHeight() / 2 - e.getY() ;
totalX += deltaX;
totalY += deltaY;
textArea.appendText((totalX / cmToPixel) + " - " + (totalY / cmToPixel) + "\n");
debugArea.appendText(deltaX+" - "+deltaY+"\n");
logArea.appendText("Center: ["+(int) (Screen.getPrimary().getBounds().getWidth() / 2)+";"+(int) (Screen.getPrimary().getBounds().getHeight() / 2)+"] cursorPosition: "+e.getX()+" - "+e.getY()+"\n");
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
});
primaryStage.show();
primaryStage.setFullScreen(true);
}}
如果你想重现我的结果,只需在一张纸上标记两行,然后尝试 运行 以不同的速度在这些行之间移动鼠标,同时注意程序
报告的鼠标设备距离取决于您移动鼠标的速度。如果鼠标用于制造它的目的,这通常是需要的,但在您的情况下,这是一个问题。我会尝试在您的鼠标设置中切换此功能。也许这篇 link 可以帮到你。 https://askubuntu.com/questions/698961/disable-mouse-acceleration-in-ubuntu-15-10
如果您正在阅读这篇文章post,您可能想知道,是的,问题出在加速上,即使 "disabled" 有些事情仍然无法解决,我也解决了这个问题通过将 PS2 鼠标连接到 Arduino,并通过 JSSC 我询问自上次检查以来的 delta X 和 Y(在这里查看 http://www.instructables.com/id/Optical-Mouse-Odometer-for-Arduino-Robot/)